4.9.103-stable review
Greg Kroah-Hartman
maintainercover 4.9.103-stable review
This is the start of the stable review cycle for the 4.9.103 release. There are 96 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 Sat May 26 09:35:42 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.9.103-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.103-rc1
Colin Ian King <[email protected]>
rtc: tx4939: avoid unintended sign extension on a 24 bit shift
Alexandre Belloni <[email protected]>
rtc: hctosys: Ensure system time doesn't overflow time_t
Bryan O'Donoghue <[email protected]>
rtc: snvs: Fix usage of snvs_rtc_enable
Vignesh R <[email protected]>
serial: 8250: Don't service RX FIFO if interrupts are disabled
Geert Uytterhoeven <[email protected]>
serial: arc_uart: Fix out-of-bounds access through DT alias
Geert Uytterhoeven <[email protected]>
serial: fsl_lpuart: Fix out-of-bounds access through DT alias
Geert Uytterhoeven <[email protected]>
serial: imx: Fix out-of-bounds access through serial port index
Geert Uytterhoeven <[email protected]>
serial: mxs-auart: Fix out-of-bounds access through serial port index
Geert Uytterhoeven <[email protected]>
serial: samsung: Fix out-of-bounds access through serial port index
Geert Uytterhoeven <[email protected]>
serial: xuartps: Fix out-of-bounds access through DT alias
Colin Ian King <[email protected]>
media: cx25821: prevent out-of-bounds read on array card
Hans Verkuil <[email protected]>
media: vivid: fix incorrect capabilities for radio
Masami Hiramatsu <[email protected]>
media: vb2: Fix videobuf2 to map correct area
Arnd Bergmann <[email protected]>
media: s3c-camif: fix out-of-bounds array access
Brad Love <[email protected]>
media: cx23885: Override 888 ImpactVCBe crystal frequency
Mauro Carvalho Chehab <[email protected]>
media: dmxdev: fix error code for invalid ioctls
Andrzej Hajda <[email protected]>
clk: samsung: exynos3250: Fix PLL rates
Andrzej Hajda <[email protected]>
clk: samsung: exynos5250: Fix PLL rates
Andrzej Hajda <[email protected]>
clk: samsung: exynos5433: Fix PLL rates
Andrzej Hajda <[email protected]>
clk: samsung: exynos5260: Fix PLL rates
Andrzej Hajda <[email protected]>
clk: samsung: exynos7: Fix PLL rates
Andrzej Hajda <[email protected]>
clk: samsung: s3c2410: Fix PLL rates
Shawn Lin <[email protected]>
clk: rockchip: Prevent calculating mmc phase if clock rate is zero
Brad Love <[email protected]>
media: cx23885: Set subdev host data to clk_freq pointer
Marcel Ziswiler <[email protected]>
clk: tegra: Fix pll_u rate configuration
Shawn Lin <[email protected]>
clk: Don't show the incorrect clock phase
Shawn Lin <[email protected]>
clk: rockchip: Fix wrong parent for SDMMC phase clock for rk3228
Sylwester Nawrocki <[email protected]>
ASoC: samsung: i2s: Ensure the RCLK rate is properly determined
Ranjani Sridharan <[email protected]>
ASoC: topology: create TLV data for dapm widgets
Dan Carpenter <[email protected]>
ASoC: au1x: Fix timeout tests in au1xac97c_ac97_read()
James Smart <[email protected]>
scsi: lpfc: Fix frequency of Release WQE CQEs
James Smart <[email protected]>
scsi: lpfc: Fix soft lockup in lpfc worker thread during LIP testing
James Smart <[email protected]>
scsi: lpfc: Fix issue_lip if link is disabled
Wilfried Weissmann <[email protected]>
scsi: mvsas: fix wrong endianness of sgpio api
Dave Carroll <[email protected]>
scsi: aacraid: Insure command thread is not recursively stopped
Jeremy Cline <[email protected]>
scsi: sd: Keep disk read-only when re-reading partition
Hannes Reinecke <[email protected]>
scsi: mpt3sas: Do not mark fw_event workqueue as WQ_MEM_RECLAIM
Manish Rangankar <[email protected]>
scsi: qla4xxx: skip error recovery in case of register disconnect.
Meelis Roos <[email protected]>
scsi: aacraid: fix shutdown crash when init fails
Michael Kelley (EOSG) <[email protected]>
scsi: storvsc: Increase cmd_per_lun for higher speed devices
Bart Van Assche <[email protected]>
scsi: qla2xxx: Avoid triggering undefined behavior in qla2x00_mbx_completion()
Dan Carpenter <[email protected]>
scsi: mptfusion: Add bounds check in mptctl_hp_targetinfo()
Dan Carpenter <[email protected]>
scsi: sym53c8xx_2: iterator underflow in sym_getsync()
Chad Dupuis <[email protected]>
scsi: bnx2fc: Fix check in SCSI completion handler for timed out request
Sujit Reddy Thumma <[email protected]>
scsi: ufs: Enable quirk to ignore sending WRITE_SAME command
Arnd Bergmann <[email protected]>
scsi: fas216: fix sense buffer initialization
Peter Robinson <[email protected]>
crypto: sunxi-ss - Add MODULE_ALIAS to sun4i-ss
NeilBrown <[email protected]>
staging: lustre: lmv: correctly iput lmo_root
Colin Ian King <[email protected]>
staging: rtl8192u: return -ENOMEM on failed allocation of priv->oldaddr
NeilBrown <[email protected]>
staging: lustre: fix bug in osc_enter_cache_try
Larry Finger <[email protected]>
Bluetooth: btusb: Add device ID for RTL8822BE
Brad Love <[email protected]>
media: em28xx: USB bulk packet size fix
Chris Dickens <[email protected]>
usb: gadget: composite: fix incorrect handling of OS desc requests
Wolfram Sang <[email protected]>
usb: gadget: udc: change comparison to bitshift when dealing with a mask
Lars-Peter Clausen <[email protected]>
usb: gadget: ffs: Execute copy_to_user() with USER_DS set
Lars-Peter Clausen <[email protected]>
usb: gadget: ffs: Let setup() return USB_GADGET_DELAYED_STATUS
Minas Harutyunyan <[email protected]>
usb: dwc2: host: Fix transaction errors in host mode
Grigor Tovmasyan <[email protected]>
usb: dwc2: Fix interval type issue
Mathias Nyman <[email protected]>
xhci: zero usb device slot_id member when disabling and freeing a xhci slot
Thinh Nguyen <[email protected]>
usb: dwc3: Update DWC_usb31 GTXFIFOSIZ reg fields
Thinh Nguyen <[email protected]>
usb: dwc3: Add SoftReset PHY synchonization delay
Nobutaka Okabe <[email protected]>
ALSA: usb-audio: Add native DSD support for Luxman DA-06
Vicente Bergas <[email protected]>
Bluetooth: btusb: Add USB ID 7392:a611 for Edimax EW-7611ULB
Giuseppe Lippolis <[email protected]>
net-usb: add qmi_wwan if on lte modem wistron neweb d18q1
Torsten Hilbrich <[email protected]>
net/usb/qmi_wwan.c: Add USB id for lt4120 modem
Fredrik Noring <[email protected]>
USB: OHCI: Fix NULL dereference in HCDs using HCD_LOCAL_MEM
Dominik Bozek <[email protected]>
usb: cdc_acm: prevent race at write to acm while system resumes
Vardan Mikayelyan <[email protected]>
usb: dwc2: Fix dwc2_hsotg_core_init_disconnected()
Stefan Agner <[email protected]>
usb: gadget: fsl_udc_core: fix ep valid checks
Manu Gautam <[email protected]>
usb: gadget: core: Fix use-after-free of usb_request
Roger Quadros <[email protected]>
usb: dwc3: omap: don't miss events during suspend/resume
Brian Norris <[email protected]>
usb: dwc3: Undo PHY init if soft reset fails
John Keeping <[email protected]>
usb: gadget: f_uac2: fix bFirstInterface in composite gadget
Tetsuo Handa <[email protected]>
x86/kexec: Avoid double free_page() upon do_kexec_load() failure
Tetsuo Handa <[email protected]>
hfsplus: stop workqueue when fill_super() failed
Johannes Berg <[email protected]>
cfg80211: limit wiphy names to 128 bytes
Jens Remus <[email protected]>
scsi: zfcp: fix infinite iteration on ERP ready list
Alexander Potapenko <[email protected]>
scsi: sg: allocate with __GFP_ZERO in sg_build_indirect()
Jason Yan <[email protected]>
scsi: libsas: defer ata device eh commands to libata
Martin Schwidefsky <[email protected]>
s390: use expoline thunks in the BPF JIT
Martin Schwidefsky <[email protected]>
s390: extend expoline to BC instructions
Martin Schwidefsky <[email protected]>
s390: move spectre sysfs attribute code
Martin Schwidefsky <[email protected]>
s390/kernel: use expoline for indirect branches
Martin Schwidefsky <[email protected]>
s390/ftrace: use expoline for indirect branches
Martin Schwidefsky <[email protected]>
s390/lib: use expoline for indirect branches
Martin Schwidefsky <[email protected]>
s390/crc32-vx: use expoline for indirect branches
Martin Schwidefsky <[email protected]>
s390: move expoline assembler macros to a header
Martin Schwidefsky <[email protected]>
s390: add assembler macros for CPU alternatives
Al Viro <[email protected]>
ext2: fix a block leak
[email protected] <[email protected]>
vmxnet3: use DMA memory barriers where required
[email protected] <[email protected]>
vmxnet3: set the DMA mask before the first DMA map operation
Eric Dumazet <[email protected]>
tcp: purge write queue in tcp_connect_init()
Eric Dumazet <[email protected]>
sock_diag: fix use-after-free read in __sk_free
Willem de Bruijn <[email protected]>
packet: in packet_snd start writing at link layer allocation
Willem de Bruijn <[email protected]>
net: test tailroom before appending to linear skb
Tarick Bedeir <[email protected]>
net/mlx4_core: Fix error handling in mlx4_init_port_info.
-------------
Diffstat:
Makefile | 4 +- arch/s390/crypto/crc32be-vx.S | 5 +- arch/s390/crypto/crc32le-vx.S | 4 +- arch/s390/include/asm/alternative-asm.h | 108 +++++++++++++ arch/s390/include/asm/nospec-insn.h | 195 +++++++++++++++++++++++ arch/s390/kernel/Makefile | 1 + arch/s390/kernel/asm-offsets.c | 1 + arch/s390/kernel/base.S | 24 +-- arch/s390/kernel/entry.S | 105 +++--------- arch/s390/kernel/mcount.S | 14 +- arch/s390/kernel/nospec-branch.c | 43 +++-- arch/s390/kernel/nospec-sysfs.c | 21 +++ arch/s390/kernel/reipl.S | 7 +- arch/s390/kernel/swsusp.S | 9 +- arch/s390/lib/mem.S | 9 +- arch/s390/net/bpf_jit.S | 16 +- arch/s390/net/bpf_jit_comp.c | 63 +++++++- arch/x86/kernel/machine_kexec_32.c | 6 +- arch/x86/kernel/machine_kexec_64.c | 4 +- drivers/bluetooth/btusb.c | 6 + drivers/clk/clk.c | 3 + drivers/clk/rockchip/clk-mmc-phase.c | 23 +++ drivers/clk/rockchip/clk-rk3228.c | 2 +- drivers/clk/samsung/clk-exynos3250.c | 4 +- drivers/clk/samsung/clk-exynos5250.c | 8 +- drivers/clk/samsung/clk-exynos5260.c | 2 +- drivers/clk/samsung/clk-exynos5433.c | 12 +- drivers/clk/samsung/clk-exynos7.c | 2 +- drivers/clk/samsung/clk-s3c2410.c | 16 +- drivers/clk/tegra/clk-pll.c | 2 + drivers/crypto/sunxi-ss/sun4i-ss-core.c | 1 + drivers/media/dvb-core/dmxdev.c | 2 +- drivers/media/pci/cx23885/cx23885-cards.c | 4 + drivers/media/pci/cx23885/cx23885-core.c | 10 ++ drivers/media/pci/cx25821/cx25821-core.c | 7 +- drivers/media/platform/s3c-camif/camif-capture.c | 7 +- drivers/media/platform/vivid/vivid-ctrls.c | 2 + drivers/media/usb/em28xx/em28xx.h | 2 +- drivers/media/v4l2-core/videobuf2-vmalloc.c | 2 +- drivers/message/fusion/mptctl.c | 2 + drivers/net/ethernet/mellanox/mlx4/main.c | 4 +- drivers/net/usb/qmi_wwan.c | 4 + drivers/net/vmxnet3/vmxnet3_drv.c | 72 ++++++--- drivers/rtc/hctosys.c | 5 + drivers/rtc/rtc-snvs.c | 15 +- drivers/rtc/rtc-tx4939.c | 6 +- drivers/s390/scsi/zfcp_dbf.c | 23 ++- drivers/s390/scsi/zfcp_ext.h | 5 +- drivers/s390/scsi/zfcp_scsi.c | 14 +- drivers/scsi/aacraid/commsup.c | 4 +- drivers/scsi/aacraid/linit.c | 5 +- drivers/scsi/arm/fas216.c | 2 +- drivers/scsi/bnx2fc/bnx2fc_io.c | 1 + drivers/scsi/libsas/sas_scsi_host.c | 33 ++-- drivers/scsi/lpfc/lpfc_attr.c | 5 + drivers/scsi/lpfc/lpfc_hbadisc.c | 5 +- drivers/scsi/lpfc/lpfc_sli.c | 2 + drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 +- drivers/scsi/mvsas/mv_94xx.c | 23 +-- drivers/scsi/qla2xxx/qla_isr.c | 6 +- drivers/scsi/qla4xxx/ql4_def.h | 2 + drivers/scsi/qla4xxx/ql4_os.c | 46 ++++++ drivers/scsi/sd.c | 3 +- drivers/scsi/sg.c | 2 +- drivers/scsi/storvsc_drv.c | 2 +- drivers/scsi/sym53c8xx_2/sym_hipd.c | 2 +- drivers/scsi/ufs/ufshcd.c | 2 + drivers/staging/lustre/lustre/include/obd.h | 2 +- drivers/staging/lustre/lustre/lmv/lmv_obd.c | 2 +- drivers/staging/lustre/lustre/osc/osc_cache.c | 2 +- drivers/staging/rtl8192u/r8192U_core.c | 2 + drivers/tty/serial/8250/8250_port.c | 3 +- drivers/tty/serial/arc_uart.c | 5 + drivers/tty/serial/fsl_lpuart.c | 4 + drivers/tty/serial/imx.c | 6 + drivers/tty/serial/mxs-auart.c | 4 + drivers/tty/serial/samsung.c | 4 + drivers/tty/serial/xilinx_uartps.c | 2 +- drivers/usb/class/cdc-acm.c | 9 +- drivers/usb/dwc2/core.h | 2 +- drivers/usb/dwc2/gadget.c | 12 +- drivers/usb/dwc2/hcd.c | 14 +- drivers/usb/dwc3/core.c | 16 +- drivers/usb/dwc3/core.h | 2 + drivers/usb/dwc3/dwc3-omap.c | 16 ++ drivers/usb/gadget/composite.c | 40 +++-- drivers/usb/gadget/function/f_fs.c | 6 +- drivers/usb/gadget/function/f_uac2.c | 2 + drivers/usb/gadget/udc/core.c | 2 +- drivers/usb/gadget/udc/fsl_udc_core.c | 4 +- drivers/usb/gadget/udc/goku_udc.h | 2 +- drivers/usb/host/ohci-hcd.c | 3 +- drivers/usb/host/xhci-mem.c | 2 + fs/ext2/inode.c | 10 -- fs/hfsplus/super.c | 1 + include/linux/usb/composite.h | 3 + include/uapi/linux/nl80211.h | 2 + net/core/sock.c | 2 +- net/ipv4/ip_output.c | 3 +- net/ipv4/tcp_output.c | 7 +- net/ipv6/ip6_output.c | 3 +- net/packet/af_packet.c | 4 +- net/wireless/core.c | 3 + sound/soc/au1x/ac97c.c | 6 +- sound/soc/samsung/i2s.c | 13 +- sound/soc/soc-topology.c | 3 + sound/usb/quirks.c | 29 ++-- 107 files changed, 975 insertions(+), 335 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/96 net/mlx4_core: Fix error handling in mlx4_init_port_info.
4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tarick Bedeir <[email protected]>
[ Upstream commit 57f6f99fdad9984801cde05c1db68fe39b474a10 ]
Avoid exiting the function with a lingering sysfs file (if the first call to device_create_file() fails while the second succeeds), and avoid calling devlink_port_unregister() twice.
In other words, either mlx4_init_port_info() succeeds and returns zero, or it fails, returns non-zero, and requires no cleanup.
--- drivers/net/ethernet/mellanox/mlx4/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx4/main.c +3 -1
@@ -2983,6 +2983,7 @@ static int mlx4_init_port_info(struct mlmlx4_err (dev,"Failed to create file for port %d\n" , port);devlink_port_unregister (&info->devlink_port); info->port =-1 ; +return err; }sprintf (info->dev_mtu_name,"mlx4_port%d_mtu" , port);
@@ -3004,9 +3005,10 @@ static int mlx4_init_port_info(struct ml &info->port_attr);devlink_port_unregister (&info->devlink_port); info->port =-1 ; +return err; } -return err; +return 0 ; }static void mlx4_cleanup_port_info (struct mlx4_port_info *info)
Greg Kroah-Hartman
maintainerPATCH 2/96 net: test tailroom before appending to linear skb
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Willem de Bruijn <[email protected]>
[ Upstream commit 113f99c3358564a0647d444c2ae34e8b1abfd5b9 ]
Device features may change during transmission. In particular with corking, a device may toggle scatter-gather in between allocating and writing to an skb.
Do not unconditionally assume that !NETIF_F_SG at write time implies that the same held at alloc time and thus the skb has sufficient tailroom.
This issue predates git history.
--- net/ipv4/ip_output.c | 3 ++- net/ipv6/ip6_output.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-)
net/ipv4/ip_output.c +2 -1
@@ -1076,7 +1076,8 @@ alloc_new_skb:if (copy > length) copy = length; -if (!(rt->dst.dev->features&NETIF_F_SG )) { +if (!(rt->dst.dev->features&NETIF_F_SG ) && +skb_tailroom (skb) >= copy) {unsigned int off; off = skb->len;
net/ipv6/ip6_output.c +2 -1
@@ -1545,7 +1545,8 @@ alloc_new_skb:if (copy > length) copy = length; -if (!(rt->dst.dev->features&NETIF_F_SG )) { +if (!(rt->dst.dev->features&NETIF_F_SG ) && +skb_tailroom (skb) >= copy) {unsigned int off; off = skb->len;
Greg Kroah-Hartman
maintainerPATCH 3/96 packet: in packet_snd start writing at link layer allocation
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Willem de Bruijn <[email protected]>
[ Upstream commit b84bbaf7a6c8cca24f8acf25a2c8e46913a947ba ]
Packet sockets allow construction of packets shorter than dev->hard_header_len to accommodate protocols with variable length link layer headers. These packets are padded to dev->hard_header_len, because some device drivers interpret that as a minimum packet size.
packet_snd reserves dev->hard_header_len bytes on allocation. SOCK_DGRAM sockets call skb_push in dev_hard_header() to ensure that link layer headers are stored in the reserved range. SOCK_RAW sockets do the same in tpacket_snd, but not in packet_snd.
Syzbot was able to send a zero byte packet to a device with massive 116B link layer header, causing padding to cross over into skb_shinfo. Fix this by writing from the start of the llheader reserved range also in the case of packet_snd/SOCK_RAW.
Update skb_set_network_header to the new offset. This also corrects it for SOCK_DGRAM, where it incorrectly double counted reserve due to the skb_push in dev_hard_header.
--- net/packet/af_packet.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/packet/af_packet.c +3 -1
@@ -2910,13 +2910,15 @@ static int packet_snd(struct socket *socif (skb ==NULL ) goto out_unlock; -skb_set_network_header (skb, reserve); +skb_reset_network_header (skb); err = -EINVAL ;if (sock->type ==SOCK_DGRAM ) { offset =dev_hard_header (skb, dev,ntohs (proto), addr,NULL , len);if (unlikely (offset <0 )) goto out_free; + }else if (reserve) { +skb_push (skb, reserve); }/* Returns -EFAULT on error */
Greg Kroah-Hartman
maintainerPATCH 4/96 sock_diag: fix use-after-free read in __sk_free
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 9709020c86f6bf8439ca3effc58cfca49a5de192 ]
We must not call sock_diag_has_destroy_listeners(sk) on a socket that has no reference on net structure.
BUG: KASAN: use-after-free in sock_diag_has_destroy_listeners include/linux/sock_diag.h:75 [inline] BUG: KASAN: use-after-free in __sk_free+0x329/0x340 net/core/sock.c:1609 Read of size 8 at addr ffff88018a02e3a0 by task swapper/1/0 CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.17.0-rc5+ #54 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: <IRQ> __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x1b9/0x294 lib/dump_stack.c:113 print_address_description+0x6c/0x20b mm/kasan/report.c:256 kasan_report_error mm/kasan/report.c:354 [inline] kasan_report.cold.7+0x242/0x2fe mm/kasan/report.c:412 __asan_report_load8_noabort+0x14/0x20 mm/kasan/report.c:433 sock_diag_has_destroy_listeners include/linux/sock_diag.h:75 [inline] __sk_free+0x329/0x340 net/core/sock.c:1609 sk_free+0x42/0x50 net/core/sock.c:1623 sock_put include/net/sock.h:1664 [inline] reqsk_free include/net/request_sock.h:116 [inline] reqsk_put include/net/request_sock.h:124 [inline] inet_csk_reqsk_queue_drop_and_put net/ipv4/inet_connection_sock.c:672 [inline] reqsk_timer_handler+0xe27/0x10e0 net/ipv4/inet_connection_sock.c:739 call_timer_fn+0x230/0x940 kernel/time/timer.c:1326 expire_timers kernel/time/timer.c:1363 [inline] __run_timers+0x79e/0xc50 kernel/time/timer.c:1666 run_timer_softirq+0x4c/0x70 kernel/time/timer.c:1692 __do_softirq+0x2e0/0xaf5 kernel/softirq.c:285 invoke_softirq kernel/softirq.c:365 [inline] irq_exit+0x1d1/0x200 kernel/softirq.c:405 exiting_irq arch/x86/include/asm/apic.h:525 [inline] smp_apic_timer_interrupt+0x17e/0x710 arch/x86/kernel/apic/apic.c:1052 apic_timer_interrupt+0xf/0x20 arch/x86/entry/entry_64.S:863 </IRQ> RIP: 0010:native_safe_halt+0x6/0x10 arch/x86/include/asm/irqflags.h:54 RSP: 0018:ffff8801d9ae7c38 EFLAGS: 00000282 ORIG_RAX: ffffffffffffff13 RAX: dffffc0000000000 RBX: 1ffff1003b35cf8a RCX: 0000000000000000 RDX: 1ffffffff11a30d0 RSI: 0000000000000001 RDI: ffffffff88d18680 RBP: ffff8801d9ae7c38 R08: ffffed003b5e46c3 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001 R13: ffff8801d9ae7cf0 R14: ffffffff897bef20 R15: 0000000000000000 arch_safe_halt arch/x86/include/asm/paravirt.h:94 [inline] default_idle+0xc2/0x440 arch/x86/kernel/process.c:354 arch_cpu_idle+0x10/0x20 arch/x86/kernel/process.c:345 default_idle_call+0x6d/0x90 kernel/sched/idle.c:93 cpuidle_idle_call kernel/sched/idle.c:153 [inline] do_idle+0x395/0x560 kernel/sched/idle.c:262 cpu_startup_entry+0x104/0x120 kernel/sched/idle.c:368 start_secondary+0x426/0x5b0 arch/x86/kernel/smpboot.c:269 secondary_startup_64+0xa5/0xb0 arch/x86/kernel/head_64.S:242 Allocated by task 4557: save_stack+0x43/0xd0 mm/kasan/kasan.c:448 set_track mm/kasan/kasan.c:460 [inline] kasan_kmalloc+0xc4/0xe0 mm/kasan/kasan.c:553 kasan_slab_alloc+0x12/0x20 mm/kasan/kasan.c:490 kmem_cache_alloc+0x12e/0x760 mm/slab.c:3554 kmem_cache_zalloc include/linux/slab.h:691 [inline] net_alloc net/core/net_namespace.c:383 [inline] copy_net_ns+0x159/0x4c0 net/core/net_namespace.c:423 create_new_namespaces+0x69d/0x8f0 kernel/nsproxy.c:107 unshare_nsproxy_namespaces+0xc3/0x1f0 kernel/nsproxy.c:206 ksys_unshare+0x708/0xf90 kernel/fork.c:2408 __do_sys_unshare kernel/fork.c:2476 [inline] __se_sys_unshare kernel/fork.c:2474 [inline] __x64_sys_unshare+0x31/0x40 kernel/fork.c:2474 do_syscall_64+0x1b1/0x800 arch/x86/entry/common.c:287 entry_SYSCALL_64_after_hwframe+0x49/0xbe Freed by task 69: save_stack+0x43/0xd0 mm/kasan/kasan.c:448 set_track mm/kasan/kasan.c:460 [inline] __kasan_slab_free+0x11a/0x170 mm/kasan/kasan.c:521 kasan_slab_free+0xe/0x10 mm/kasan/kasan.c:528 __cache_free mm/slab.c:3498 [inline] kmem_cache_free+0x86/0x2d0 mm/slab.c:3756 net_free net/core/net_namespace.c:399 [inline] net_drop_ns.part.14+0x11a/0x130 net/core/net_namespace.c:406 net_drop_ns net/core/net_namespace.c:405 [inline] cleanup_net+0x6a1/0xb20 net/core/net_namespace.c:541 process_one_work+0xc1e/0x1b50 kernel/workqueue.c:2145 worker_thread+0x1cc/0x1440 kernel/workqueue.c:2279 kthread+0x345/0x410 kernel/kthread.c:240 ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:412 The buggy address belongs to the object at ffff88018a02c140 which belongs to the cache net_namespace of size 8832 The buggy address is located 8800 bytes inside of 8832-byte region [ffff88018a02c140, ffff88018a02e3c0) The buggy address belongs to the page: page:ffffea0006280b00 count:1 mapcount:0 mapping:ffff88018a02c140 index:0x0 compound_mapcount: 0 flags: 0x2fffc0000008100(slab|head) raw: 02fffc0000008100 ffff88018a02c140 0000000000000000 0000000100000001 raw: ffffea00062a1320 ffffea0006268020 ffff8801d9bdde40 0000000000000000 page dumped because: kasan: bad access detected
--- net/core/sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/sock.c +1 -1
@@ -1457,7 +1457,7 @@ void sk_destruct(struct sock *sk)static void __sk_free (struct sock *sk) { -if (unlikely (sock_diag_has_destroy_listeners (sk) && sk->sk_net_refcnt)) +if (unlikely (sk->sk_net_refcnt &&sock_diag_has_destroy_listeners (sk)))sock_diag_broadcast_destroy (sk);else sk_destruct (sk);
Greg Kroah-Hartman
maintainerPATCH 5/96 tcp: purge write queue in tcp_connect_init()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 7f582b248d0a86bae5788c548d7bb5bca6f7691a ]
syzkaller found a reliable way to crash the host, hitting a BUG() in __tcp_retransmit_skb()
Malicous MSG_FASTOPEN is the root cause. We need to purge write queue in tcp_connect_init() at the point we init snd_una/write_seq.
This patch also replaces the BUG() by a less intrusive WARN_ON_ONCE()
kernel BUG at net/ipv4/tcp_output.c:2837!
invalid opcode: 0000 [#1] SMP KASAN
Dumping ftrace buffer:
(ftrace buffer empty)
Modules linked in: CPU: 0 PID: 5276 Comm: syz-executor0 Not tainted 4.17.0-rc3+ #51 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:__tcp_retransmit_skb+0x2992/0x2eb0 net/ipv4/tcp_output.c:2837 RSP: 0000:ffff8801dae06ff8 EFLAGS: 00010206 RAX: ffff8801b9fe61c0 RBX: 00000000ffc18a16 RCX: ffffffff864e1a49 RDX: 0000000000000100 RSI: ffffffff864e2e12 RDI: 0000000000000005 RBP: ffff8801dae073a0 R08: ffff8801b9fe61c0 R09: ffffed0039c40dd2 R10: ffffed0039c40dd2 R11: ffff8801ce206e93 R12: 00000000421eeaad R13: ffff8801ce206d4e R14: ffff8801ce206cc0 R15: ffff8801cd4f4a80 FS: 0000000000000000(0000) GS:ffff8801dae00000(0063) knlGS:00000000096bc900 CS: 0010 DS: 002b ES: 002b CR0: 0000000080050033 CR2: 0000000020000000 CR3: 00000001c47b6000 CR4: 00000000001406f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <IRQ> tcp_retransmit_skb+0x2e/0x250 net/ipv4/tcp_output.c:2923 tcp_retransmit_timer+0xc50/0x3060 net/ipv4/tcp_timer.c:488 tcp_write_timer_handler+0x339/0x960 net/ipv4/tcp_timer.c:573 tcp_write_timer+0x111/0x1d0 net/ipv4/tcp_timer.c:593 call_timer_fn+0x230/0x940 kernel/time/timer.c:1326 expire_timers kernel/time/timer.c:1363 [inline] __run_timers+0x79e/0xc50 kernel/time/timer.c:1666 run_timer_softirq+0x4c/0x70 kernel/time/timer.c:1692 __do_softirq+0x2e0/0xaf5 kernel/softirq.c:285 invoke_softirq kernel/softirq.c:365 [inline] irq_exit+0x1d1/0x200 kernel/softirq.c:405 exiting_irq arch/x86/include/asm/apic.h:525 [inline] smp_apic_timer_interrupt+0x17e/0x710 arch/x86/kernel/apic/apic.c:1052 apic_timer_interrupt+0xf/0x20 arch/x86/entry/entry_64.S:863
--- net/ipv4/tcp_output.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/ipv4/tcp_output.c +5 -2
@@ -2691,8 +2691,10 @@ int __tcp_retransmit_skb(struct sock *skreturn -EBUSY ;if (before (TCP_SKB_CB (skb)->seq, tp->snd_una)) { -if (before (TCP_SKB_CB (skb)->end_seq, tp->snd_una)) -BUG (); +if (unlikely (before (TCP_SKB_CB (skb)->end_seq, tp->snd_una))) { +WARN_ON_ONCE (1 ); +return -EINVAL ; + }if (tcp_trim_head (sk, skb, tp->snd_una -TCP_SKB_CB (skb)->seq))return -ENOMEM ; }
@@ -3236,6 +3238,7 @@ static void tcp_connect_init(struct socksock_reset_flag (sk,SOCK_DONE ); tp->snd_wnd =0 ;tcp_init_wl (tp,0 ); +tcp_write_queue_purge (sk); tp->snd_una = tp->write_seq; tp->snd_sml = tp->write_seq; tp->snd_up = tp->write_seq;
Greg Kroah-Hartman
maintainerPATCH 6/96 vmxnet3: set the DMA mask before the first DMA map operation
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: "[email protected]" <[email protected]>
[ Upstream commit 61aeecea40afb2b89933e27cd4adb10fc2e75cfd ]
The DMA mask must be set before, not after, the first DMA map operation, or the first DMA map operation could in theory fail on some systems.
--- drivers/net/vmxnet3/vmxnet3_drv.c | 50 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-)
drivers/net/vmxnet3/vmxnet3_drv.c +25 -25
@@ -2675,7 +2675,7 @@ vmxnet3_set_mac_addr(struct net_device */* ==================== initialization and cleanup routines ============ */ static int -vmxnet3_alloc_pci_resources (struct vmxnet3_adapter *adapter,bool *dma64) +vmxnet3_alloc_pci_resources (struct vmxnet3_adapter *adapter) {int err;unsigned long mmio_start, mmio_len;
@@ -2687,30 +2687,12 @@ vmxnet3_alloc_pci_resources(struct vmxnereturn err; } -if (pci_set_dma_mask (pdev,DMA_BIT_MASK (64 )) ==0 ) { -if (pci_set_consistent_dma_mask (pdev,DMA_BIT_MASK (64 )) !=0 ) { -dev_err (&pdev->dev, -"pci_set_consistent_dma_mask failed\n" ); - err = -EIO ; - goto err_set_mask; - } - *dma64 = true; - }else { -if (pci_set_dma_mask (pdev,DMA_BIT_MASK (32 )) !=0 ) { -dev_err (&pdev->dev, -"pci_set_dma_mask failed\n" ); - err = -EIO ; - goto err_set_mask; - } - *dma64 = false; - } - err =pci_request_selected_regions (pdev, (1 <<2 ) -1 , vmxnet3_driver_name);if (err) {dev_err (&pdev->dev,"Failed to request region for adapter: error %d\n" , err); - goto err_set_mask; + goto err_enable_device; }pci_set_master (pdev);
@@ -2738,7 +2720,7 @@ err_bar1:iounmap (adapter->hw_addr0); err_ioremap:pci_release_selected_regions (pdev, (1 <<2 ) -1 ); -err_set_mask: +err_enable_device:pci_disable_device (pdev);return err; }
@@ -3246,7 +3228,7 @@ vmxnet3_probe_device(struct pci_dev *pde#endif };int err; -bool dma64 = false;/* stupid gcc */ +bool dma64;u32 ver;struct net_device *netdev;struct vmxnet3_adapter *adapter;
@@ -3292,6 +3274,24 @@ vmxnet3_probe_device(struct pci_dev *pde adapter->rx_ring_size =VMXNET3_DEF_RX_RING_SIZE ; adapter->rx_ring2_size =VMXNET3_DEF_RX_RING2_SIZE ; +if (pci_set_dma_mask (pdev,DMA_BIT_MASK (64 )) ==0 ) { +if (pci_set_consistent_dma_mask (pdev,DMA_BIT_MASK (64 )) !=0 ) { +dev_err (&pdev->dev, +"pci_set_consistent_dma_mask failed\n" ); + err = -EIO ; + goto err_set_mask; + } + dma64 = true; + }else { +if (pci_set_dma_mask (pdev,DMA_BIT_MASK (32 )) !=0 ) { +dev_err (&pdev->dev, +"pci_set_dma_mask failed\n" ); + err = -EIO ; + goto err_set_mask; + } + dma64 = false; + } +spin_lock_init (&adapter->cmd_lock); adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter, sizeof(struct vmxnet3_adapter),
@@ -3299,7 +3299,7 @@ vmxnet3_probe_device(struct pci_dev *pdeif (dma_mapping_error (&adapter->pdev->dev, adapter->adapter_pa)) {dev_err (&pdev->dev,"Failed to map dma\n" ); err = -EFAULT ; - goto err_dma_map; + goto err_set_mask; } adapter->shared = dma_alloc_coherent( &adapter->pdev->dev,
@@ -3350,7 +3350,7 @@ vmxnet3_probe_device(struct pci_dev *pde }#endif /* VMXNET3_RSS */ - err =vmxnet3_alloc_pci_resources (adapter, &dma64); + err =vmxnet3_alloc_pci_resources (adapter);if (err <0 ) goto err_alloc_pci;
@@ -3492,7 +3492,7 @@ err_alloc_queue_desc: err_alloc_shared:dma_unmap_single (&adapter->pdev->dev, adapter->adapter_pa,sizeof (struct vmxnet3_adapter ),PCI_DMA_TODEVICE ); -err_dma_map: +err_set_mask:free_netdev (netdev);return err; }
Greg Kroah-Hartman
maintainerPATCH 7/96 vmxnet3: use DMA memory barriers where required
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: "[email protected]" <[email protected]>
[ Upstream commit f3002c1374fb2367c9d8dbb28852791ef90d2bac ]
The gen bits must be read first from (resp. written last to) DMA memory. The proper way to enforce this on Linux is to call dma_rmb() (resp. dma_wmb()).
--- drivers/net/vmxnet3/vmxnet3_drv.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/net/vmxnet3/vmxnet3_drv.c +22 -0
@@ -369,6 +369,11 @@ vmxnet3_tq_tx_complete(struct vmxnet3_tx gdesc = tq->comp_ring.base + tq->comp_ring.next2proc;while (VMXNET3_TCD_GET_GEN (&gdesc->tcd) == tq->comp_ring.gen) { +/* Prevent any &gdesc->tcd field from being (speculatively) +* read before (&gdesc->tcd)->gen is read. +*/ +dma_rmb (); + completed +=vmxnet3_unmap_pkt (VMXNET3_TCD_GET_TXIDX ( &gdesc->tcd), tq, adapter->pdev, adapter);
@@ -1099,6 +1104,11 @@ vmxnet3_tq_xmit(struct sk_buff *skb, str gdesc->txd.tci =skb_vlan_tag_get (skb); } +/* Ensure that the write to (&gdesc->txd)->gen will be observed after +* all other writes to &gdesc->txd. +*/ +dma_wmb (); +/* finally flips the GEN bit of the SOP desc. */ gdesc->dword[2 ] =cpu_to_le32 (le32_to_cpu (gdesc->dword[2 ]) ^VMXNET3_TXD_GEN );
@@ -1286,6 +1296,12 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx*/ break ; } + +/* Prevent any rcd field from being (speculatively) read before +* rcd->gen is read. +*/ +dma_rmb (); +BUG_ON (rcd->rqID != rq->qid && rcd->rqID != rq->qid2 && rcd->rqID != rq->dataRingQid); idx = rcd->rxdIdx;
@@ -1515,6 +1531,12 @@ rcd_done: ring->next2comp = idx; num_to_alloc =vmxnet3_cmd_ring_desc_avail (ring); ring = rq->rx_ring + ring_idx; + +/* Ensure that the writes to rxd->gen bits will be observed +* after all other writes to rxd objects. +*/ +dma_wmb (); +while (num_to_alloc) {vmxnet3_getRxDesc (rxd, &ring->base[ring->next2fill].rxd, &rxCmdDesc);
Greg Kroah-Hartman
maintainerPATCH 8/96 ext2: fix a block leak
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 5aa1437d2d9a068c0334bd7c9dafa8ec4f97f13b upstream.
open file, unlink it, then use ioctl(2) to make it immutable or append only. Now close it and watch the blocks *not* freed...
Immutable/append-only checks belong in ->setattr().
Note: the bug is old and backport to anything prior to 737f2e93b972 ("ext2: convert to use the new truncate convention") will need these checks lifted into ext2_setattr().
--- fs/ext2/inode.c | 10 ---------- 1 file changed, 10 deletions(-)
fs/ext2/inode.c +0 -10
@@ -1258,21 +1258,11 @@ do_indirects:static void ext2_truncate_blocks (struct inode *inode,loff_t offset) { -/* -* XXX: it seems like a bug here that we don't allow -* IS_APPEND inode to have blocks-past-i_size trimmed off. -* review and fix this. -* -* Also would be nice to be able to handle IO errors and such, -* but that's probably too much to ask. -*/ if (!(S_ISREG (inode->i_mode) ||S_ISDIR (inode->i_mode) ||S_ISLNK (inode->i_mode)))return ;if (ext2_inode_is_fast_symlink (inode))return ; -if (IS_APPEND (inode) ||IS_IMMUTABLE (inode)) -return ;dax_sem_down_write (EXT2_I (inode));__ext2_truncate_blocks (inode, offset);
Greg Kroah-Hartman
maintainerPATCH 9/96 s390: add assembler macros for CPU alternatives
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit fba9eb7946251d6e420df3bdf7bc45195be7be9a ]
Add a header with macros usable in assembler files to emit alternative code sequences. It works analog to the alternatives for inline assmeblies in C files, with the same restrictions and capabilities.
The syntax is
ALTERNATIVE "<default instructions sequence>", \ "<alternative instructions sequence>", \ "<features-bit>"
and
ALTERNATIVE_2 "<default instructions sequence>", \ "<alternative instructions sqeuence #1>", \ "<feature-bit #1>", "<alternative instructions sqeuence #2>", \ "<feature-bit #2>"
--- arch/s390/include/asm/alternative-asm.h | 108 ++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 arch/s390/include/asm/alternative-asm.h
arch/s390/include/asm/alternative-asm.h new file +108 -0
@@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_S390_ALTERNATIVE_ASM_H +#define _ASM_S390_ALTERNATIVE_ASM_H + +#ifdef __ASSEMBLY__ + +/* + * Check the length of an instruction sequence. The length may not be larger + * than 254 bytes and it has to be divisible by 2. + */ +.macro alt_len_check start,end + .if ( \end - \start ) > 254 + .error "cpu alternatives does not support instructions blocks > 254 bytes\n" + .endif + .if ( \end - \start ) % 2 + .error "cpu alternatives instructions length is odd\n" + .endif +.endm + +/* + * Issue one struct alt_instr descriptor entry (need to put it into + * the section .altinstructions, see below). This entry contains + * enough information for the alternatives patching code to patch an + * instruction. See apply_alternatives(). + */ +.macro alt_entry orig_start, orig_end, alt_start, alt_end, feature + .long \orig_start - . + .long \alt_start - . + .word \feature + .byte \orig_end - \orig_start + .byte \alt_end - \alt_start +.endm + +/* + * Fill up @bytes with nops. The macro emits 6-byte nop instructions + * for the bulk of the area, possibly followed by a 4-byte and/or + * a 2-byte nop if the size of the area is not divisible by 6. + */ +.macro alt_pad_fill bytes + .fill ( \bytes ) / 6, 6, 0xc0040000 + .fill ( \bytes ) % 6 / 4, 4, 0x47000000 + .fill ( \bytes ) % 6 % 4 / 2, 2, 0x0700 +.endm + +/* + * Fill up @bytes with nops. If the number of bytes is larger + * than 6, emit a jg instruction to branch over all nops, then + * fill an area of size (@bytes - 6) with nop instructions. + */ +.macro alt_pad bytes + .if ( \bytes > 0 ) + .if ( \bytes > 6 ) + jg . + \bytes + alt_pad_fill \bytes - 6 + .else + alt_pad_fill \bytes + .endif + .endif +.endm + +/* + * Define an alternative between two instructions. If @feature is + * present, early code in apply_alternatives() replaces @oldinstr with + * @newinstr. ".skip" directive takes care of proper instruction padding + * in case @newinstr is longer than @oldinstr. + */ +.macro ALTERNATIVE oldinstr, newinstr, feature + .pushsection .altinstr_replacement,"ax" +770: \newinstr +771: .popsection +772: \oldinstr +773: alt_len_check 770b, 771b + alt_len_check 772b, 773b + alt_pad ( ( 771b - 770b ) - ( 773b - 772b ) ) +774: .pushsection .altinstructions,"a" + alt_entry 772b, 774b, 770b, 771b, \feature + .popsection +.endm + +/* + * Define an alternative between two instructions. If @feature is + * present, early code in apply_alternatives() replaces @oldinstr with + * @newinstr. ".skip" directive takes care of proper instruction padding + * in case @newinstr is longer than @oldinstr. + */ +.macro ALTERNATIVE_2 oldinstr, newinstr1, feature1, newinstr2, feature2 + .pushsection .altinstr_replacement,"ax" +770: \newinstr1 +771: \newinstr2 +772: .popsection +773: \oldinstr +774: alt_len_check 770b, 771b + alt_len_check 771b, 772b + alt_len_check 773b, 774b + .if ( 771b - 770b > 772b - 771b ) + alt_pad ( ( 771b - 770b ) - ( 774b - 773b ) ) + .else + alt_pad ( ( 772b - 771b ) - ( 774b - 773b ) ) + .endif +775: .pushsection .altinstructions,"a" + alt_entry 773b, 775b, 770b, 771b,\feature1 + alt_entry 773b, 775b, 771b, 772b,\feature2 + .popsection +.endm + +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_S390_ALTERNATIVE_ASM_H */
Greg Kroah-Hartman
maintainerPATCH 10/96 s390: move expoline assembler macros to a header
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit 6dd85fbb87d1d6b87a3b1f02ca28d7b2abd2e7ba ]
To be able to use the expoline branches in different assembler files move the associated macros from entry.S to a new header nospec-insn.h.
While we are at it make the macros a bit nicer to use.
--- arch/s390/include/asm/nospec-insn.h | 125 ++++++++++++++++++++++++++++++++++++ arch/s390/kernel/entry.S | 105 ++++++------------------------ 2 files changed, 149 insertions(+), 81 deletions(-) create mode 100644 arch/s390/include/asm/nospec-insn.h
arch/s390/include/asm/nospec-insn.h new file +125 -0
@@ -0,0 +1,125 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_S390_NOSPEC_ASM_H +#define _ASM_S390_NOSPEC_ASM_H + +#ifdef __ASSEMBLY__ + +#ifdef CONFIG_EXPOLINE + +/* + * The expoline macros are used to create thunks in the same format + * as gcc generates them. The 'comdat' section flag makes sure that + * the various thunks are merged into a single copy. + */ + .macro __THUNK_PROLOG_NAME name + .pushsection .text.\name,"axG",@progbits,\name,comdat + .globl \name + .hidden \name + .type \name,@function +\name: + .cfi_startproc + .endm + + .macro __THUNK_EPILOG + .cfi_endproc + .popsection + .endm + + .macro __THUNK_PROLOG_BR r1,r2 + __THUNK_PROLOG_NAME __s390x_indirect_jump_r\r2\()use_r\r1 + .endm + + .macro __THUNK_BR r1,r2 + jg __s390x_indirect_jump_r\r2\()use_r\r1 + .endm + + .macro __THUNK_BRASL r1,r2,r3 + brasl \r1,__s390x_indirect_jump_r\r3\()use_r\r2 + .endm + + .macro __DECODE_RR expand,reg,ruse + .set __decode_fail,1 + .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + .ifc \reg,%r\r1 + .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + .ifc \ruse,%r\r2 + \expand \r1,\r2 + .set __decode_fail,0 + .endif + .endr + .endif + .endr + .if __decode_fail == 1 + .error "__DECODE_RR failed" + .endif + .endm + + .macro __DECODE_RRR expand,rsave,rtarget,ruse + .set __decode_fail,1 + .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + .ifc \rsave,%r\r1 + .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + .ifc \rtarget,%r\r2 + .irp r3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + .ifc \ruse,%r\r3 + \expand \r1,\r2,\r3 + .set __decode_fail,0 + .endif + .endr + .endif + .endr + .endif + .endr + .if __decode_fail == 1 + .error "__DECODE_RRR failed" + .endif + .endm + + .macro __THUNK_EX_BR reg,ruse +#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES + exrl 0,555f + j . +#else + larl \ruse,555f + ex 0,0(\ruse) + j . +#endif +555: br \reg + .endm + + .macro GEN_BR_THUNK reg,ruse=%r1 + __DECODE_RR __THUNK_PROLOG_BR,\reg,\ruse + __THUNK_EX_BR \reg,\ruse + __THUNK_EPILOG + .endm + + .macro BR_EX reg,ruse=%r1 +557: __DECODE_RR __THUNK_BR,\reg,\ruse + .pushsection .s390_indirect_branches,"a",@progbits + .long 557b-. + .popsection + .endm + + .macro BASR_EX rsave,rtarget,ruse=%r1 +559: __DECODE_RRR __THUNK_BRASL,\rsave,\rtarget,\ruse + .pushsection .s390_indirect_branches,"a",@progbits + .long 559b-. + .popsection + .endm + +#else + .macro GEN_BR_THUNK reg,ruse=%r1 + .endm + + .macro BR_EX reg,ruse=%r1 + br \reg + .endm + + .macro BASR_EX rsave,rtarget,ruse=%r1 + basr \rsave,\rtarget + .endm +#endif + +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_S390_NOSPEC_ASM_H */
arch/s390/kernel/entry.S +24 -81
233 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 11/96 s390/crc32-vx: use expoline for indirect branches
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit 467a3bf219cee12259182c5cb4821f88fd518a51 ]
The return from the crc32_le_vgfm_16/crc32c_le_vgfm_16 and the crc32_be_vgfm_16 functions are done with "br %r14". These are indirect branches as well and need to use execute trampolines for CONFIG_EXPOLINE=y.
--- arch/s390/crypto/crc32be-vx.S | 5 ++++- arch/s390/crypto/crc32le-vx.S | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-)
arch/s390/crypto/crc32be-vx.S +4 -1
@@ -12,6 +12,7 @@ */ #include <linux/linkage.h> +#include <asm/nospec-insn.h> #include <asm/vx-insn.h> /* Vector register range containing CRC-32 constants */
@@ -66,6 +67,8 @@ .previous + GEN_BR_THUNK %r14 + .text /* * The CRC-32 function(s) use these calling conventions:
@@ -202,6 +205,6 @@ ENTRY(crc32_be_vgfm_16) .Ldone: VLGVF %r2,%v2,3 - br %r14 + BR_EX %r14 .previous
arch/s390/crypto/crc32le-vx.S +3 -1
@@ -13,6 +13,7 @@ */ #include <linux/linkage.h> +#include <asm/nospec-insn.h> #include <asm/vx-insn.h> /* Vector register range containing CRC-32 constants */
@@ -75,6 +76,7 @@ .previous + GEN_BR_THUNK %r14 .text
@@ -263,6 +265,6 @@ crc32_le_vgfm_generic: .Ldone: VLGVF %r2,%v2,2 - br %r14 + BR_EX %r14 .previous
Greg Kroah-Hartman
maintainerPATCH 12/96 s390/lib: use expoline for indirect branches
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit 97489e0663fa700d6e7febddc43b58df98d7bcda ]
The return from the memmove, memset, memcpy, __memset16, __memset32 and __memset64 functions are done with "br %r14". These are indirect branches as well and need to use execute trampolines for CONFIG_EXPOLINE=y.
--- arch/s390/lib/mem.S | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/s390/lib/mem.S +6 -3
@@ -6,6 +6,9 @@ #include <linux/linkage.h> #include <asm/export.h> +#include <asm/nospec-insn.h> + + GEN_BR_THUNK %r14 /* * memset implementation
@@ -39,7 +42,7 @@ ENTRY(memset) .Lmemset_clear_rest: larl %r3,.Lmemset_xc ex %r4,0(%r3) - br %r14 + BR_EX %r14 .Lmemset_fill: stc %r3,0(%r2) cghi %r4,1
@@ -56,7 +59,7 @@ ENTRY(memset) .Lmemset_fill_rest: larl %r3,.Lmemset_mvc ex %r4,0(%r3) - br %r14 + BR_EX %r14 .Lmemset_xc: xc 0(1,%r1),0(%r1) .Lmemset_mvc:
@@ -79,7 +82,7 @@ ENTRY(memcpy) .Lmemcpy_rest: larl %r5,.Lmemcpy_mvc ex %r4,0(%r5) - br %r14 + BR_EX %r14 .Lmemcpy_loop: mvc 0(256,%r1),0(%r3) la %r1,256(%r1)
Greg Kroah-Hartman
maintainerPATCH 13/96 s390/ftrace: use expoline for indirect branches
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit 23a4d7fd34856da8218c4cfc23dba7a6ec0a423a ]
The return from the ftrace_stub, _mcount, ftrace_caller and return_to_handler functions is done with "br %r14" and "br %r1". These are indirect branches as well and need to use execute trampolines for CONFIG_EXPOLINE=y.
The ftrace_caller function is a special case as it returns to the start of a function and may only use %r0 and %r1. For a pre z10 machine the standard execute trampoline uses a LARL + EX to do this, but this requires *two* registers in the range %r1..%r15. To get around this the 'br %r1' located in the lowcore is used, then the EX instruction does not need an address register. But the lowcore trick may only be used for pre z14 machines, with noexec=on the mapping for the first page may not contain instructions. The solution for that is an ALTERNATIVE in the expoline THUNK generated by 'GEN_BR_THUNK %r1' to switch to EXRL, this relies on the fact that a machine that supports noexec=on has EXRL as well.
--- arch/s390/include/asm/nospec-insn.h | 13 +++++++++++++ arch/s390/kernel/asm-offsets.c | 1 + arch/s390/kernel/mcount.S | 14 +++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-)
arch/s390/include/asm/nospec-insn.h +13 -0
@@ -2,10 +2,15 @@#ifndef _ASM_S390_NOSPEC_ASM_H#define _ASM_S390_NOSPEC_ASM_H +#include <asm/alternative-asm.h> +#include <asm/asm-offsets.h> +#ifdef __ASSEMBLY__#ifdef CONFIG_EXPOLINE +_LC_BR_R1 = __LC_BR_R1 +/* * The expoline macros are used to create thunks in the same format * as gcc generates them. The 'comdat' section flag makes sure that
@@ -76,13 +81,21 @@ .endm .macro __THUNK_EX_BR reg,ruse +# Be very careful when adding instructions to this macro! +# The ALTERNATIVE replacement code has a .+10 which targets +# the "br \reg" after the code has been patched.#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES exrl 0,555f j . #else + .ifc \reg,%r1 +ALTERNATIVE "ex %r0,_LC_BR_R1" ,".insn ril,0xc60000000000,0,.+10" ,35 + j . + .else larl \ruse,555f ex 0,0(\ruse) j . + .endif#endif 555: br \reg .endm
arch/s390/kernel/asm-offsets.c +1 -0
@@ -175,6 +175,7 @@ int main(void)OFFSET (__LC_MACHINE_FLAGS, lowcore, machine_flags);OFFSET (__LC_GMAP, lowcore, gmap);OFFSET (__LC_PASTE, lowcore, paste); +OFFSET (__LC_BR_R1, lowcore, br_r1_trampoline);/* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */ OFFSET (__LC_DUMP_REIPL, lowcore, ipib);/* hardware defined lowcore locations 0x1000 - 0x18ff */
arch/s390/kernel/mcount.S +9 -5
@@ -8,13 +8,17 @@ #include <linux/linkage.h> #include <asm/asm-offsets.h> #include <asm/ftrace.h> +#include <asm/nospec-insn.h> #include <asm/ptrace.h> #include <asm/export.h> + GEN_BR_THUNK %r1 + GEN_BR_THUNK %r14 + .section .kprobes.text, "ax" ENTRY(ftrace_stub) - br %r14 + BR_EX %r14 #define STACK_FRAME_SIZE (STACK_FRAME_OVERHEAD + __PT_SIZE) #define STACK_PTREGS (STACK_FRAME_OVERHEAD)
@@ -22,7 +26,7 @@ ENTRY(ftrace_stub) #define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW) ENTRY(_mcount) - br %r14 + BR_EX %r14 EXPORT_SYMBOL(_mcount)
@@ -52,7 +56,7 @@ ENTRY(ftrace_caller) #endif lgr %r3,%r14 la %r5,STACK_PTREGS(%r15) - basr %r14,%r1 + BASR_EX %r14,%r1 #ifdef CONFIG_FUNCTION_GRAPH_TRACER # The j instruction gets runtime patched to a nop instruction. # See ftrace_enable_ftrace_graph_caller.
@@ -67,7 +71,7 @@ ftrace_graph_caller_end: #endif lg %r1,(STACK_PTREGS_PSW+8)(%r15) lmg %r2,%r15,(STACK_PTREGS_GPRS+2*8)(%r15) - br %r1 + BR_EX %r1 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
@@ -80,6 +84,6 @@ ENTRY(return_to_handler) aghi %r15,STACK_FRAME_OVERHEAD lgr %r14,%r2 lmg %r2,%r5,32(%r15) - br %r14 + BR_EX %r14 #endif
Greg Kroah-Hartman
maintainerPATCH 14/96 s390/kernel: use expoline for indirect branches
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit c50c84c3ac4d5db683904bdb3257798b6ef980ae ]
The assember code in arch/s390/kernel uses a few more indirect branches which need to be done with execute trampolines for CONFIG_EXPOLINE=y.
--- arch/s390/kernel/base.S | 24 ++++++++++++++---------- arch/s390/kernel/reipl.S | 7 +++++-- arch/s390/kernel/swsusp.S | 9 ++++++--- 3 files changed, 25 insertions(+), 15 deletions(-)
arch/s390/kernel/base.S +14 -10
@@ -8,18 +8,22 @@ #include <linux/linkage.h> #include <asm/asm-offsets.h> +#include <asm/nospec-insn.h> #include <asm/ptrace.h> #include <asm/sigp.h> + GEN_BR_THUNK %r9 + GEN_BR_THUNK %r14 + ENTRY(s390_base_mcck_handler) basr %r13,0 0: lg %r15,__LC_PANIC_STACK # load panic stack aghi %r15,-STACK_FRAME_OVERHEAD larl %r1,s390_base_mcck_handler_fn - lg %r1,0(%r1) - ltgr %r1,%r1 + lg %r9,0(%r1) + ltgr %r9,%r9 jz 1f - basr %r14,%r1 + BASR_EX %r14,%r9 1: la %r1,4095 lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1) lpswe __LC_MCK_OLD_PSW
@@ -36,10 +40,10 @@ ENTRY(s390_base_ext_handler) basr %r13,0 0: aghi %r15,-STACK_FRAME_OVERHEAD larl %r1,s390_base_ext_handler_fn - lg %r1,0(%r1) - ltgr %r1,%r1 + lg %r9,0(%r1) + ltgr %r9,%r9 jz 1f - basr %r14,%r1 + BASR_EX %r14,%r9 1: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit lpswe __LC_EXT_OLD_PSW
@@ -56,10 +60,10 @@ ENTRY(s390_base_pgm_handler) basr %r13,0 0: aghi %r15,-STACK_FRAME_OVERHEAD larl %r1,s390_base_pgm_handler_fn - lg %r1,0(%r1) - ltgr %r1,%r1 + lg %r9,0(%r1) + ltgr %r9,%r9 jz 1f - basr %r14,%r1 + BASR_EX %r14,%r9 lmg %r0,%r15,__LC_SAVE_AREA_SYNC lpswe __LC_PGM_OLD_PSW 1: lpswe disabled_wait_psw-0b(%r13)
@@ -116,7 +120,7 @@ ENTRY(diag308_reset) larl %r4,.Lcontinue_psw # Restore PSW flags lpswe 0(%r4) .Lcontinue: - br %r14 + BR_EX %r14 .align 16 .Lrestart_psw: .long 0x00080000,0x80000000 + .Lrestart_part2
arch/s390/kernel/reipl.S +5 -2
@@ -6,8 +6,11 @@ #include <linux/linkage.h> #include <asm/asm-offsets.h> +#include <asm/nospec-insn.h> #include <asm/sigp.h> + GEN_BR_THUNK %r9 + # # Issue "store status" for the current CPU to its prefix page # and call passed function afterwards
@@ -66,9 +69,9 @@ ENTRY(store_status) st %r4,0(%r1) st %r5,4(%r1) stg %r2,8(%r1) - lgr %r1,%r2 + lgr %r9,%r2 lgr %r2,%r3 - br %r1 + BR_EX %r9 .section .bss .align 8
arch/s390/kernel/swsusp.S +6 -3
@@ -12,6 +12,7 @@ #include <asm/ptrace.h> #include <asm/thread_info.h> #include <asm/asm-offsets.h> +#include <asm/nospec-insn.h> #include <asm/sigp.h> /*
@@ -23,6 +24,8 @@ * (see below) in the resume process. * This function runs with disabled interrupts. */ + GEN_BR_THUNK %r14 + .section .text ENTRY(swsusp_arch_suspend) stmg %r6,%r15,__SF_GPRS(%r15)
@@ -102,7 +105,7 @@ ENTRY(swsusp_arch_suspend) spx 0x318(%r1) lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) lghi %r2,0 - br %r14 + BR_EX %r14 /* * Restore saved memory image to correct place and restore register context.
@@ -200,7 +203,7 @@ pgm_check_entry: lghi %r1,0 sam31 sigp %r1,%r0,SIGP_SET_ARCHITECTURE - basr %r14,%r3 + brasl %r14,_sclp_print_early larl %r3,.Ldisabled_wait_31 lpsw 0(%r3) 4:
@@ -266,7 +269,7 @@ restore_registers: /* Return 0 */ lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) lghi %r2,0 - br %r14 + BR_EX %r14 .section .data..nosave,"aw",@progbits .align 8
Greg Kroah-Hartman
maintainerPATCH 15/96 s390: move spectre sysfs attribute code
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit 4253b0e0627ee3461e64c2495c616f1c8f6b127b ]
The nospec-branch.c file is compiled without the gcc options to generate expoline thunks. The return branch of the sysfs show functions cpu_show_spectre_v1 and cpu_show_spectre_v2 is an indirect branch as well. These need to be compiled with expolines.
Move the sysfs functions for spectre reporting to a separate file and loose an '.' for one of the messages.
--- arch/s390/kernel/Makefile | 1 + arch/s390/kernel/nospec-branch.c | 18 ------------------ arch/s390/kernel/nospec-sysfs.c | 21 +++++++++++++++++++++ 3 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 arch/s390/kernel/nospec-sysfs.c
arch/s390/kernel/Makefile +1 -0
@@ -63,6 +63,7 @@ obj-y += nospec-branch.o extra-y += head.o head64.o vmlinux.lds +obj-$(CONFIG_SYSFS) += nospec-sysfs.o CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE) obj-$(CONFIG_MODULES) += module.o
arch/s390/kernel/nospec-branch.c +0 -18
@@ -44,24 +44,6 @@ static int __init nospec_report(void) }arch_initcall (nospec_report); -#ifdef CONFIG_SYSFS -ssize_t cpu_show_spectre_v1 (struct device *dev, -struct device_attribute *attr,char *buf) -{ -return sprintf (buf,"Mitigation: __user pointer sanitization\n" ); -} - -ssize_t cpu_show_spectre_v2 (struct device *dev, -struct device_attribute *attr,char *buf) -{ -if (IS_ENABLED (CC_USING_EXPOLINE ) && !nospec_disable) -return sprintf (buf,"Mitigation: execute trampolines\n" ); -if (__test_facility (82 , S390_lowcore.alt_stfle_fac_list)) -return sprintf (buf,"Mitigation: limited branch prediction.\n" ); -return sprintf (buf,"Vulnerable\n" ); -} -#endif -#ifdef CONFIG_EXPOLINE int nospec_disable =IS_ENABLED (CONFIG_EXPOLINE_OFF );
arch/s390/kernel/nospec-sysfs.c new file +21 -0
@@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/device.h> +#include <linux/cpu.h> +#include <asm/facility.h> +#include <asm/nospec-branch.h> + +ssize_t cpu_show_spectre_v1 (struct device *dev, +struct device_attribute *attr,char *buf) +{ +return sprintf (buf,"Mitigation: __user pointer sanitization\n" ); +} + +ssize_t cpu_show_spectre_v2 (struct device *dev, +struct device_attribute *attr,char *buf) +{ +if (IS_ENABLED (CC_USING_EXPOLINE ) && !nospec_disable) +return sprintf (buf,"Mitigation: execute trampolines\n" ); +if (__test_facility (82 , S390_lowcore.alt_stfle_fac_list)) +return sprintf (buf,"Mitigation: limited branch prediction\n" ); +return sprintf (buf,"Vulnerable\n" ); +}
Greg Kroah-Hartman
maintainerPATCH 16/96 s390: extend expoline to BC instructions
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit 6deaa3bbca804b2a3627fd685f75de64da7be535 ]
The BPF JIT uses a 'b <disp>(%r<x>)' instruction in the definition of the sk_load_word and sk_load_half functions.
Add support for branch-on-condition instructions contained in the thunk code of an expoline.
--- arch/s390/include/asm/nospec-insn.h | 57 ++++++++++++++++++++++++++++++++++++ arch/s390/kernel/nospec-branch.c | 25 ++++++++++++--- 2 files changed, 77 insertions(+), 5 deletions(-)
arch/s390/include/asm/nospec-insn.h +57 -0
@@ -34,10 +34,18 @@ _LC_BR_R1 = __LC_BR_R1 __THUNK_PROLOG_NAME __s390x_indirect_jump_r\r2\()use_r\r1 .endm + .macro __THUNK_PROLOG_BC d0,r1,r2 + __THUNK_PROLOG_NAME __s390x_indirect_branch_\d0\()_\r2\()use_\r1 + .endm + .macro __THUNK_BR r1,r2 jg __s390x_indirect_jump_r\r2\()use_r\r1 .endm + .macro __THUNK_BC d0,r1,r2 + jg __s390x_indirect_branch_\d0\()_\r2\()use_\r1 + .endm + .macro __THUNK_BRASL r1,r2,r3 brasl \r1,__s390x_indirect_jump_r\r3\()use_r\r2 .endm
@@ -80,6 +88,23 @@ _LC_BR_R1 = __LC_BR_R1 .endif .endm + .macro __DECODE_DRR expand,disp,reg,ruse + .set __decode_fail,1 + .irp r1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + .ifc \reg,%r\r1 + .irp r2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + .ifc \ruse,%r\r2 + \expand \disp,\r1,\r2 + .set __decode_fail,0 + .endif + .endr + .endif + .endr + .if __decode_fail == 1 + .error "__DECODE_DRR failed" + .endif + .endm + .macro __THUNK_EX_BR reg,ruse # Be very careful when adding instructions to this macro! # The ALTERNATIVE replacement code has a .+10 which targets
@@ -100,12 +125,30 @@ _LC_BR_R1 = __LC_BR_R1 555: br \reg .endm + .macro __THUNK_EX_BC disp,reg,ruse +#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES + exrl 0,556f + j . +#else + larl \ruse,556f + ex 0,0(\ruse) + j . +#endif +556: b \disp(\reg) + .endm + .macro GEN_BR_THUNK reg,ruse=%r1 __DECODE_RR __THUNK_PROLOG_BR,\reg,\ruse __THUNK_EX_BR \reg,\ruse __THUNK_EPILOG .endm + .macro GEN_B_THUNK disp,reg,ruse=%r1 + __DECODE_DRR __THUNK_PROLOG_BC,\disp,\reg,\ruse + __THUNK_EX_BC \disp,\reg,\ruse + __THUNK_EPILOG + .endm + .macro BR_EX reg,ruse=%r1 557: __DECODE_RR __THUNK_BR,\reg,\ruse .pushsection .s390_indirect_branches,"a",@progbits
@@ -113,6 +156,13 @@ _LC_BR_R1 = __LC_BR_R1 .popsection .endm + .macro B_EX disp,reg,ruse=%r1 +558: __DECODE_DRR __THUNK_BC,\disp,\reg,\ruse + .pushsection .s390_indirect_branches,"a",@progbits + .long 558b-. + .popsection + .endm + .macro BASR_EX rsave,rtarget,ruse=%r1 559: __DECODE_RRR __THUNK_BRASL,\rsave,\rtarget,\ruse .pushsection .s390_indirect_branches,"a",@progbits
@@ -124,10 +174,17 @@ _LC_BR_R1 = __LC_BR_R1 .macro GEN_BR_THUNK reg,ruse=%r1 .endm + .macro GEN_B_THUNK disp,reg,ruse=%r1 + .endm + .macro BR_EX reg,ruse=%r1 br \reg .endm + .macro B_EX disp,reg,ruse=%r1 + b \disp(\reg) + .endm + .macro BASR_EX rsave,rtarget,ruse=%r1 basr \rsave,\rtarget .endm
arch/s390/kernel/nospec-branch.c +20 -5
@@ -94,7 +94,6 @@ static void __init_or_module __nospec_res32 *epo;/* Second part of the instruction replace is always a nop */ -memcpy (insnbuf +2 , (char []) {0x47 ,0x00 ,0x00 ,0x00 },4 );for (epo = start; epo < end; epo++) { instr = (u8 *) epo + *epo;if (instr[0 ] ==0xc0 && (instr[1 ] &0x0f ) ==0x04 )
@@ -115,18 +114,34 @@ static void __init_or_module __nospec_re br = thunk + (*(int *)(thunk +2 )) *2 ; else continue; -if (br[0 ] !=0x07 || (br[1 ] &0xf0 ) !=0xf0 ) +/* Check for unconditional branch 0x07f? or 0x47f???? */ +if ((br[0 ] &0xbf ) !=0x07 || (br[1 ] &0xf0 ) !=0xf0 )continue ; + +memcpy (insnbuf +2 , (char []) {0x47 ,0x00 ,0x07 ,0x00 },4 );switch (type) {case BRCL_EXPOLINE : -/* brcl to thunk, replace with br + nop */ insnbuf[0 ] = br[0 ]; insnbuf[1 ] = (instr[1 ] &0xf0 ) | (br[1 ] &0x0f ); +if (br[0 ] ==0x47 ) { +/* brcl to b, replace with bc + nopr */ + insnbuf[2 ] = br[2 ]; + insnbuf[3 ] = br[3 ]; + }else { +/* brcl to br, replace with bcr + nop */ + }break ;case BRASL_EXPOLINE : -/* brasl to thunk, replace with basr + nop */ - insnbuf[0 ] =0x0d ; insnbuf[1 ] = (instr[1 ] &0xf0 ) | (br[1 ] &0x0f ); +if (br[0 ] ==0x47 ) { +/* brasl to b, replace with bas + nopr */ + insnbuf[0 ] =0x4d ; + insnbuf[2 ] = br[2 ]; + insnbuf[3 ] = br[3 ]; + }else { +/* brasl to br, replace with basr + nop */ + insnbuf[0 ] =0x0d ; + }break ; }
Greg Kroah-Hartman
maintainerPATCH 17/96 s390: use expoline thunks in the BPF JIT
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Schwidefsky <[email protected]>
[ Upstream commit de5cb6eb514ebe241e3edeb290cb41deb380b81d ]
The BPF JIT need safe guarding against spectre v2 in the sk_load_xxx assembler stubs and the indirect branches generated by the JIT itself need to be converted to expolines.
--- arch/s390/net/bpf_jit.S | 16 ++++++---- arch/s390/net/bpf_jit_comp.c | 63 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 8 deletions(-)
arch/s390/net/bpf_jit.S +10 -6
@@ -8,6 +8,7 @@ */ #include <linux/linkage.h> +#include <asm/nospec-insn.h> #include "bpf_jit.h" /*
@@ -53,7 +54,7 @@ ENTRY(sk_load_##NAME##_pos); \ clg %r3,STK_OFF_HLEN(%r15); /* Offset + SIZE > hlen? */ \ jh sk_load_##NAME##_slow; \ LOAD %r14,-SIZE(%r3,%r12); /* Get data from skb */ \ - b OFF_OK(%r6); /* Return */ \ + B_EX OFF_OK,%r6; /* Return */ \ \ sk_load_##NAME##_slow:; \ lgr %r2,%r7; /* Arg1 = skb pointer */ \
@@ -63,11 +64,14 @@ sk_load_##NAME##_slow:; \ brasl %r14,skb_copy_bits; /* Get data from skb */ \ LOAD %r14,STK_OFF_TMP(%r15); /* Load from temp bufffer */ \ ltgr %r2,%r2; /* Set cc to (%r2 != 0) */ \ - br %r6; /* Return */ + BR_EX %r6; /* Return */ sk_load_common(word, 4, llgf) /* r14 = *(u32 *) (skb->data+offset) */ sk_load_common(half, 2, llgh) /* r14 = *(u16 *) (skb->data+offset) */ + GEN_BR_THUNK %r6 + GEN_B_THUNK OFF_OK,%r6 + /* * Load 1 byte from SKB (optimized version) */
@@ -79,7 +83,7 @@ ENTRY(sk_load_byte_pos) clg %r3,STK_OFF_HLEN(%r15) # Offset >= hlen? jnl sk_load_byte_slow llgc %r14,0(%r3,%r12) # Get byte from skb - b OFF_OK(%r6) # Return OK + B_EX OFF_OK,%r6 # Return OK sk_load_byte_slow: lgr %r2,%r7 # Arg1 = skb pointer
@@ -89,7 +93,7 @@ sk_load_byte_slow: brasl %r14,skb_copy_bits # Get data from skb llgc %r14,STK_OFF_TMP(%r15) # Load result from temp buffer ltgr %r2,%r2 # Set cc to (%r2 != 0) - br %r6 # Return cc + BR_EX %r6 # Return cc #define sk_negative_common(NAME, SIZE, LOAD) \ sk_load_##NAME##_slow_neg:; \
@@ -103,7 +107,7 @@ sk_load_##NAME##_slow_neg:; \ jz bpf_error; \ LOAD %r14,0(%r2); /* Get data from pointer */ \ xr %r3,%r3; /* Set cc to zero */ \ - br %r6; /* Return cc */ + BR_EX %r6; /* Return cc */ sk_negative_common(word, 4, llgf) sk_negative_common(half, 2, llgh)
@@ -112,4 +116,4 @@ sk_negative_common(byte, 1, llgc) bpf_error: # force a return 0 from jit handler ltgr %r15,%r15 # Set condition code - br %r6 + BR_EX %r6
arch/s390/net/bpf_jit_comp.c +61 -2
95 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 18/96 scsi: libsas: defer ata device eh commands to libata
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Yan <[email protected]>
commit 318aaf34f1179b39fa9c30fa0f3288b645beee39 upstream.
When ata device doing EH, some commands still attached with tasks are not passed to libata when abort failed or recover failed, so libata did not handle these commands. After these commands done, sas task is freed, but ata qc is not freed. This will cause ata qc leak and trigger a warning like below:
WARNING: CPU: 0 PID: 28512 at drivers/ata/libata-eh.c:4037 ata_eh_finish+0xb4/0xcc CPU: 0 PID: 28512 Comm: kworker/u32:2 Tainted: G W OE 4.14.0#1 ...... Call trace: [<ffff0000088b7bd0>] ata_eh_finish+0xb4/0xcc [<ffff0000088b8420>] ata_do_eh+0xc4/0xd8 [<ffff0000088b8478>] ata_std_error_handler+0x44/0x8c [<ffff0000088b8068>] ata_scsi_port_error_handler+0x480/0x694 [<ffff000008875fc4>] async_sas_ata_eh+0x4c/0x80 [<ffff0000080f6be8>] async_run_entry_fn+0x4c/0x170 [<ffff0000080ebd70>] process_one_work+0x144/0x390 [<ffff0000080ec100>] worker_thread+0x144/0x418 [<ffff0000080f2c98>] kthread+0x10c/0x138 [<ffff0000080855dc>] ret_from_fork+0x10/0x18
If ata qc leaked too many, ata tag allocation will fail and io blocked for ever.
As suggested by Dan Williams, defer ata device commands to libata and merge sas_eh_finish_cmd() with sas_eh_defer_cmd(). libata will handle ata qcs correctly after this.
--- drivers/scsi/libsas/sas_scsi_host.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-)
drivers/scsi/libsas/sas_scsi_host.c +13 -20
@@ -222,6 +222,7 @@ out_done:static void sas_eh_finish_cmd (struct scsi_cmnd *cmd) {struct sas_ha_struct *sas_ha =SHOST_TO_SAS_HA (cmd->device->host); +struct domain_device *dev =cmd_to_domain_dev (cmd);struct sas_task *task =TO_SAS_TASK (cmd);/* At this point, we only get called following an actual abort
@@ -230,6 +231,14 @@ static void sas_eh_finish_cmd(struct scs*/ sas_end_task (cmd, task); +if (dev_is_sata (dev)) { +/* defer commands to libata so that libata EH can +* handle ata qcs correctly +*/ +list_move_tail (&cmd->eh_entry, &sas_ha->eh_ata_q); +return ; + } +/* now finish the command and move it on to the error * handler done list, this also takes it off the * error handler pending list.
@@ -237,22 +246,6 @@ static void sas_eh_finish_cmd(struct scsscsi_eh_finish_cmd (cmd, &sas_ha->eh_done_q); } -static void sas_eh_defer_cmd (struct scsi_cmnd *cmd) -{ -struct domain_device *dev =cmd_to_domain_dev (cmd); -struct sas_ha_struct *ha = dev->port->ha; -struct sas_task *task =TO_SAS_TASK (cmd); - -if (!dev_is_sata (dev)) { -sas_eh_finish_cmd (cmd); -return ; - } - -/* report the timeout to libata */ -sas_end_task (cmd, task); -list_move_tail (&cmd->eh_entry, &ha->eh_ata_q); -} -static void sas_scsi_clear_queue_lu (struct list_head *error_q,struct scsi_cmnd *my_cmd) {struct scsi_cmnd *cmd, *n;
@@ -260,7 +253,7 @@ static void sas_scsi_clear_queue_lu(strulist_for_each_entry_safe (cmd, n, error_q, eh_entry) {if (cmd->device->sdev_target == my_cmd->device->sdev_target && cmd->device->lun == my_cmd->device->lun) -sas_eh_defer_cmd (cmd); +sas_eh_finish_cmd (cmd); } }
@@ -622,12 +615,12 @@ static void sas_eh_handle_sas_errors(strcase TASK_IS_DONE :SAS_DPRINTK ("%s: task 0x%p is done\n" , __func__, task); -sas_eh_defer_cmd (cmd); +sas_eh_finish_cmd (cmd);continue ;case TASK_IS_ABORTED :SAS_DPRINTK ("%s: task 0x%p is aborted\n" , __func__, task); -sas_eh_defer_cmd (cmd); +sas_eh_finish_cmd (cmd);continue ;case TASK_IS_AT_LU :SAS_DPRINTK ("task 0x%p is at LU: lu recover\n" , task);
@@ -638,7 +631,7 @@ static void sas_eh_handle_sas_errors(str"recovered\n" ,SAS_ADDR (task->dev), cmd->device->lun); -sas_eh_defer_cmd (cmd); +sas_eh_finish_cmd (cmd);sas_scsi_clear_queue_lu (work_q, cmd); goto Again; }
Greg Kroah-Hartman
maintainerPATCH 19/96 scsi: sg: allocate with __GFP_ZERO in sg_build_indirect()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Potapenko <[email protected]>
commit a45b599ad808c3c982fdcdc12b0b8611c2f92824 upstream.
This shall help avoid copying uninitialized memory to the userspace when calling ioctl(fd, SG_IO) with an empty command.
--- drivers/scsi/sg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/sg.c +1 -1
@@ -1893,7 +1893,7 @@ retry: num = (rem_sz > scatter_elem_sz_prev) ? scatter_elem_sz_prev : rem_sz; - schp->pages[k] =alloc_pages (gfp_mask, order); + schp->pages[k] =alloc_pages (gfp_mask | __GFP_ZERO, order);if (!schp->pages[k]) goto out;
Greg Kroah-Hartman
maintainerPATCH 20/96 scsi: zfcp: fix infinite iteration on ERP ready list
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Remus <[email protected]>
commit fa89adba1941e4f3b213399b81732a5c12fd9131 upstream.
zfcp_erp_adapter_reopen() schedules blocking of all of the adapter's rports via zfcp_scsi_schedule_rports_block() and enqueues a reopen adapter ERP action via zfcp_erp_action_enqueue(). Both are separately processed asynchronously and concurrently.
Blocking of rports is done in a kworker by zfcp_scsi_rport_work(). It calls zfcp_scsi_rport_block(), which then traces a DBF REC "scpdely" via zfcp_dbf_rec_trig(). zfcp_dbf_rec_trig() acquires the DBF REC spin lock and then iterates with list_for_each() over the adapter's ERP ready list without holding the ERP lock. This opens a race window in which the current list entry can be moved to another list, causing list_for_each() to iterate forever on the wrong list, as the erp_ready_head is never encountered as terminal condition.
Meanwhile the ERP action can be processed in the ERP thread by zfcp_erp_thread(). It calls zfcp_erp_strategy(), which acquires the ERP lock and then calls zfcp_erp_action_to_running() to move the ERP action from the ready to the running list. zfcp_erp_action_to_running() can move the ERP action using list_move() just during the aforementioned race window. It then traces a REC RUN "erator1" via zfcp_dbf_rec_run(). zfcp_dbf_rec_run() tries to acquire the DBF REC spin lock. If this is held by the infinitely looping kworker, it effectively spins forever.
Example Sequence Diagram:
Process ERP Thread rport_work ------------------- ------------------- -------------------
zfcp_erp_adapter_reopen() zfcp_erp_adapter_block() zfcp_scsi_schedule_rports_block()
lock ERP zfcp_scsi_rport_work()zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER)
list_add_tail() on ready !(rport_task==RPORT_ADD) wake_up() ERP thread zfcp_scsi_rport_block() zfcp_dbf_rec_trig() zfcp_erp_strategy() zfcp_dbf_rec_trig() unlock ERP lock DBF REC zfcp_erp_wait() lock ERP | zfcp_erp_action_to_running() | list_for_each() ready | list_move() current entry | ready to running | zfcp_dbf_rec_run() endless loop over running | zfcp_dbf_rec_run_lvl() | lock DBF REC spins forever
Any adapter recovery can trigger this, such as setting the device offline or reboot.
V4.9 commit 4eeaa4f3f1d6 ("zfcp: close window with unblocked rport during rport gone") introduced additional tracing of (un)blocking of rports. It missed that the adapter->erp_lock must be held when calling zfcp_dbf_rec_trig().
This fix uses the approach formerly introduced by commit aa0fec62391c ("[SCSI] zfcp: Fix sparse warning by providing new entry in dbf") that got later removed by commit ae0904f60fab ("[SCSI] zfcp: Redesign of the debug tracing for recovery actions.").
Introduce zfcp_dbf_rec_trig_lock(), a wrapper for zfcp_dbf_rec_trig() that acquires and releases the adapter->erp_lock for read.
--- drivers/s390/scsi/zfcp_dbf.c | 23 ++++++++++++++++++++++- drivers/s390/scsi/zfcp_ext.h | 5 ++++- drivers/s390/scsi/zfcp_scsi.c | 14 +++++++------- 3 files changed, 33 insertions(+), 9 deletions(-)
drivers/s390/scsi/zfcp_dbf.c +22 -1
@@ -3,7 +3,7 @@* * Debug traces for zfcp. * -* Copyright IBM Corp. 2002, 2017 +* Copyright IBM Corp. 2002, 2018 */ #define KMSG_COMPONENT "zfcp"
@@ -287,6 +287,27 @@ void zfcp_dbf_rec_trig(char *tag, structspin_unlock_irqrestore (&dbf->rec_lock, flags); } +/** +* zfcp_dbf_rec_trig_lock - trace event related to triggered recovery with lock +* @tag: identifier for event +* @adapter: adapter on which the erp_action should run +* @port: remote port involved in the erp_action +* @sdev: scsi device involved in the erp_action +* @want: wanted erp_action +* @need: required erp_action +* +* The adapter->erp_lock must not be held. +*/ +void zfcp_dbf_rec_trig_lock (char *tag,struct zfcp_adapter *adapter, +struct zfcp_port *port,struct scsi_device *sdev, +u8 want,u8 need) +{ +unsigned long flags; + +read_lock_irqsave (&adapter->erp_lock, flags); +zfcp_dbf_rec_trig (tag, adapter, port, sdev, want, need); +read_unlock_irqrestore (&adapter->erp_lock, flags); +}/** * zfcp_dbf_rec_run_lvl - trace event related to running recovery
drivers/s390/scsi/zfcp_ext.h +4 -1
@@ -3,7 +3,7 @@* * External function declarations. * -* Copyright IBM Corp. 2002, 2016 +* Copyright IBM Corp. 2002, 2018 */ #ifndef ZFCP_EXT_H
@@ -34,6 +34,9 @@ extern int zfcp_dbf_adapter_register(strextern void zfcp_dbf_adapter_unregister (struct zfcp_adapter *);extern void zfcp_dbf_rec_trig (char *,struct zfcp_adapter *,struct zfcp_port *,struct scsi_device *,u8 ,u8 ); +extern void zfcp_dbf_rec_trig_lock (char *tag,struct zfcp_adapter *adapter, +struct zfcp_port *port, +struct scsi_device *sdev,u8 want,u8 need);extern void zfcp_dbf_rec_run (char *,struct zfcp_erp_action *);extern void zfcp_dbf_rec_run_lvl (int level,char *tag,struct zfcp_erp_action *erp);
drivers/s390/scsi/zfcp_scsi.c +7 -7
@@ -3,7 +3,7 @@* * Interface to Linux SCSI midlayer. * -* Copyright IBM Corp. 2002, 2017 +* Copyright IBM Corp. 2002, 2018 */ #define KMSG_COMPONENT "zfcp"
@@ -616,9 +616,9 @@ static void zfcp_scsi_rport_register(str ids.port_id = port->d_id; ids.roles =FC_RPORT_ROLE_FCP_TARGET ; -zfcp_dbf_rec_trig ("scpaddy" , port->adapter, port,NULL , -ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD , -ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD ); +zfcp_dbf_rec_trig_lock ("scpaddy" , port->adapter, port,NULL , +ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD , +ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD ); rport =fc_remote_port_add (port->adapter->scsi_host,0 , &ids);if (!rport) { dev_err(&port->adapter->ccw_device->dev,
@@ -640,9 +640,9 @@ static void zfcp_scsi_rport_block(structstruct fc_rport *rport = port->rport;if (rport) { -zfcp_dbf_rec_trig ("scpdely" , port->adapter, port,NULL , -ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL , -ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL ); +zfcp_dbf_rec_trig_lock ("scpdely" , port->adapter, port,NULL , +ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL , +ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL );fc_remote_port_delete (rport); port->rport =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 21/96 cfg80211: limit wiphy names to 128 bytes
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 a7cfebcb7594a24609268f91299ab85ba064bf82 upstream.
There's currently no limit on wiphy names, other than netlink message size and memory limitations, but that causes issues when, for example, the wiphy name is used in a uevent, e.g. in rfkill where we use the same name for the rfkill instance, and then the buffer there is "only" 2k for the environment variables.
This was reported by syzkaller, which used a 4k name.
Limit the name to something reasonable, I randomly picked 128.
--- include/uapi/linux/nl80211.h | 2 ++ net/wireless/core.c | 3 +++ 2 files changed, 5 insertions(+)
include/uapi/linux/nl80211.h +2 -0
@@ -2379,6 +2379,8 @@ enum nl80211_attrs {#define NL80211_ATTR_KEYS NL80211_ATTR_KEYS#define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS +#define NL80211_WIPHY_NAME_MAXLEN 128 +#define NL80211_MAX_SUPP_RATES 32#define NL80211_MAX_SUPP_HT_RATES 77#define NL80211_MAX_SUPP_REG_RULES 64
net/wireless/core.c +3 -0
@@ -95,6 +95,9 @@ static int cfg80211_dev_check_name(strucASSERT_RTNL (); +if (strlen (newname) >NL80211_WIPHY_NAME_MAXLEN ) +return -EINVAL ; +/* prohibit calling the thing phy%d when %d is not its number */ sscanf (newname,PHY_NAME "%d%n" , &wiphy_idx, &taken);if (taken ==strlen (newname) && wiphy_idx != rdev->wiphy_idx) {
Greg Kroah-Hartman
maintainerPATCH 22/96 hfsplus: stop workqueue when fill_super() failed
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit 66072c29328717072fd84aaff3e070e3f008ba77 upstream.
syzbot is reporting ODEBUG messages at hfsplus_fill_super() [1]. This is because hfsplus_fill_super() forgot to call cancel_delayed_work_sync().
As far as I can see, it is hfsplus_mark_mdb_dirty() from hfsplus_new_inode() in hfsplus_fill_super() that calls queue_delayed_work(). Therefore, I assume that hfsplus_new_inode() does not fail if queue_delayed_work() was called, and the out_put_hidden_dir label is the appropriate location to call cancel_delayed_work_sync().
[1] https://syzkaller.appspot.com/bug?id=a66f45e96fdbeb76b796bf46eb25ea878c42a6c9
--- fs/hfsplus/super.c | 1 + 1 file changed, 1 insertion(+)
fs/hfsplus/super.c +1 -0
@@ -588,6 +588,7 @@ static int hfsplus_fill_super(struct supreturn 0 ; out_put_hidden_dir: +cancel_delayed_work_sync (&sbi->sync_work);iput (sbi->hidden_dir); out_put_root:dput (sb->s_root);
Greg Kroah-Hartman
maintainerPATCH 23/96 x86/kexec: Avoid double free_page() upon do_kexec_load() failure
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit a466ef76b815b86748d9870ef2a430af7b39c710 upstream.
Quoted 1 line
Quoted 1 line
From
ff82bedd3e12f0d3353282054ae48c3bd8c72012Mon Sep 17 00:00:00 2001
From: Tetsuo Handa <[email protected]>
Date: Wed, 9 May 2018 12:12:39 +0900
Subject: [PATCH 4.9 23/96] x86/kexec: Avoid double free_page() upon do_kexec_load() failure
syzbot is reporting crashes after memory allocation failure inside do_kexec_load() [1]. This is because free_transition_pgtable() is called by both init_transition_pgtable() and machine_kexec_cleanup() when memory allocation failed inside init_transition_pgtable().
Regarding 32bit code, machine_kexec_free_page_tables() is called by both machine_kexec_alloc_page_tables() and machine_kexec_cleanup() when memory allocation failed inside machine_kexec_alloc_page_tables().
Fix this by leaving the error handling to machine_kexec_cleanup() (and optionally setting NULL after free_page()).
[1] https://syzkaller.appspot.com/bug?id=91e52396168cf2bdd572fe1e1bc0bc645c1c6b40
--- arch/x86/kernel/machine_kexec_32.c | 6 +++++- arch/x86/kernel/machine_kexec_64.c | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-)
arch/x86/kernel/machine_kexec_32.c +5 -1
@@ -71,12 +71,17 @@ static void load_segments(void)static void machine_kexec_free_page_tables (struct kimage *image) {free_page ((unsigned long )image->arch.pgd); + image->arch.pgd =NULL ;#ifdef CONFIG_X86_PAE free_page ((unsigned long )image->arch.pmd0); + image->arch.pmd0 =NULL ;free_page ((unsigned long )image->arch.pmd1); + image->arch.pmd1 =NULL ;#endif free_page ((unsigned long )image->arch.pte0); + image->arch.pte0 =NULL ;free_page ((unsigned long )image->arch.pte1); + image->arch.pte1 =NULL ; }static int machine_kexec_alloc_page_tables (struct kimage *image)
@@ -93,7 +98,6 @@ static int machine_kexec_alloc_page_tabl !image->arch.pmd0 || !image->arch.pmd1 || #endif !image->arch.pte0 || !image->arch.pte1) { -machine_kexec_free_page_tables (image);return -ENOMEM ; }return 0 ;
arch/x86/kernel/machine_kexec_64.c +3 -1
@@ -37,8 +37,11 @@ static struct kexec_file_ops *kexec_filestatic void free_transition_pgtable (struct kimage *image) {free_page ((unsigned long )image->arch.pud); + image->arch.pud =NULL ;free_page ((unsigned long )image->arch.pmd); + image->arch.pmd =NULL ;free_page ((unsigned long )image->arch.pte); + image->arch.pte =NULL ; }static int init_transition_pgtable (struct kimage *image,pgd_t *pgd)
@@ -79,7 +82,6 @@ static int init_transition_pgtable(strucset_pte (pte,pfn_pte (paddr >>PAGE_SHIFT ,PAGE_KERNEL_EXEC ));return 0 ; err: -free_transition_pgtable (image);return result; }
Greg Kroah-Hartman
maintainerPATCH 24/96 usb: gadget: f_uac2: fix bFirstInterface in composite gadget
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Keeping <[email protected]>
[ Upstream commit 8813a59ed892305b5ac1b5b901740b1ad4b5fefa ]
If there are multiple functions associated with a configuration, then the UAC2 interfaces may not start at zero. Set the correct first interface number in the association descriptor so that the audio interfaces are enumerated correctly in this case.
--- drivers/usb/gadget/function/f_uac2.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/gadget/function/f_uac2.c +2 -0
@@ -1040,6 +1040,8 @@ afunc_bind(struct usb_configuration *cfgdev_err (dev,"%s:%d Error!\n" , __func__, __LINE__);return ret; } + iad_desc.bFirstInterface = ret; + std_ac_if_desc.bInterfaceNumber = ret; agdev->ac_intf = ret; agdev->ac_alt =0 ;
Greg Kroah-Hartman
maintainerPATCH 25/96 usb: dwc3: Undo PHY init if soft reset fails
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
[ Upstream commit 00b42170c86f90ac9dea83a7dfcd3f0c38098fe2 ]
In this function, we init the USB2 and USB3 PHYs, but if soft reset times out, we don't unwind this.
Noticed by inspection.
--- drivers/usb/dwc3/core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/dwc3/core.c +3 -0
@@ -166,6 +166,9 @@ static int dwc3_core_soft_reset(struct dudelay (1 ); }while (--retries); +phy_exit (dwc->usb3_generic_phy); +phy_exit (dwc->usb2_generic_phy); +return -ETIMEDOUT ; }
Greg Kroah-Hartman
maintainerPATCH 26/96 usb: dwc3: omap: dont miss events during suspend/resume
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Quadros <[email protected]>
[ Upstream commit c49f63055e252810e5d6c83a4943b18db16b3cd8 ]
The USB cable state can change during suspend/resume so be sure to check and update the extcon state.
--- drivers/usb/dwc3/dwc3-omap.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/usb/dwc3/dwc3-omap.c +16 -0
@@ -598,9 +598,25 @@ static int dwc3_omap_resume(struct devicreturn 0 ; } +static void dwc3_omap_complete (struct device *dev) +{ +struct dwc3_omap *omap =dev_get_drvdata (dev); + +if (extcon_get_state (omap->edev,EXTCON_USB )) +dwc3_omap_set_mailbox (omap,OMAP_DWC3_VBUS_VALID ); +else +dwc3_omap_set_mailbox (omap,OMAP_DWC3_VBUS_OFF ); + +if (extcon_get_state (omap->edev,EXTCON_USB_HOST )) +dwc3_omap_set_mailbox (omap,OMAP_DWC3_ID_GROUND ); +else +dwc3_omap_set_mailbox (omap,OMAP_DWC3_ID_FLOAT ); +} +static const struct dev_pm_ops dwc3_omap_dev_pm_ops = {SET_SYSTEM_SLEEP_PM_OPS (dwc3_omap_suspend, dwc3_omap_resume) + .complete = dwc3_omap_complete, };#define DEV_PM_OPS (&dwc3_omap_dev_pm_ops)
Greg Kroah-Hartman
maintainerPATCH 27/96 usb: gadget: core: Fix use-after-free of usb_request
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manu Gautam <[email protected]>
[ Upstream commit e74bd4d358e5455233f1dcc3975425905b270b91 ]
Driver is tracing usb_request after freeing it. Fix it by changing the order.
--- drivers/usb/gadget/udc/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/core.c +1 -1
@@ -190,8 +190,8 @@ EXPORT_SYMBOL_GPL(usb_ep_alloc_request);void usb_ep_free_request (struct usb_ep *ep,struct usb_request *req) { - ep->ops->free_request (ep, req);trace_usb_ep_free_request (ep, req,0 ); + ep->ops->free_request (ep, req); }EXPORT_SYMBOL_GPL (usb_ep_free_request);
Greg Kroah-Hartman
maintainerPATCH 28/96 usb: gadget: fsl_udc_core: fix ep valid checks
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Agner <[email protected]>
[ Upstream commit 20c63f4089cceab803438c383631963e34c4d8e5 ]
Clang reports the following warning:
drivers/usb/gadget/udc/fsl_udc_core.c:1312:10: warning: address of array 'ep->name' will always evaluate to 'true' [-Wpointer-bool-conversion]
if (ep->name)
~~ ~~~~^~~~It seems that the authors intention was to check if the ep has been configured through struct_ep_setup. Check whether struct usb_ep name pointer has been set instead.
--- drivers/usb/gadget/udc/fsl_udc_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/fsl_udc_core.c +2 -2
@@ -1310,7 +1310,7 @@ static void udc_reset_ep_queue(struct fs {struct fsl_ep *ep =get_ep_by_pipe (udc, pipe); -if (ep->name) +if (ep->ep.name)nuke (ep, -ESHUTDOWN ); }
@@ -1698,7 +1698,7 @@ static void dtd_complete_irq(struct fsl_ curr_ep =get_ep_by_pipe (udc, i);/* If the ep is configured */ -if (curr_ep->name ==NULL ) { +if (!curr_ep->ep.name) {WARNING ("Invalid EP?" );continue ; }
Greg Kroah-Hartman
maintainerPATCH 29/96 usb: dwc2: Fix dwc2_hsotg_core_init_disconnected()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vardan Mikayelyan <[email protected]>
[ Upstream commit 755d739534f998d92e348fba8ffb0478416576e7 ]
We should call dwc2_hsotg_enqueue_setup() after properly setting lx_state. Because it may cause error-out from dwc2_hsotg_enqueue_setup() due to wrong value in lx_state.
Issue can be reproduced by loading driver while connected A-Connector (start in A-HOST mode) then disconnect A-Connector to switch to B-DEVICE.
--- drivers/usb/dwc2/gadget.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/usb/dwc2/gadget.c +6 -6
@@ -2642,12 +2642,6 @@ void dwc2_hsotg_core_init_disconnected(sdwc2_writel (dwc2_hsotg_ep0_mps (hsotg->eps_out[0 ]->ep.maxpacket) |DXEPCTL_USBACTEP , hsotg->regs +DIEPCTL0 ); -dwc2_hsotg_enqueue_setup (hsotg); - -dev_dbg (hsotg->dev,"EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n" , -dwc2_readl (hsotg->regs +DIEPCTL0 ), -dwc2_readl (hsotg->regs +DOEPCTL0 )); -/* clear global NAKs */ val =DCTL_CGOUTNAK |DCTL_CGNPINNAK ;if (!is_usb_reset)
@@ -2658,6 +2652,12 @@ void dwc2_hsotg_core_init_disconnected(smdelay (3 ); hsotg->lx_state =DWC2_L0 ; + +dwc2_hsotg_enqueue_setup (hsotg); + +dev_dbg (hsotg->dev,"EP0: DIEPCTL0=0x%08x, DOEPCTL0=0x%08x\n" , +dwc2_readl (hsotg->regs +DIEPCTL0 ), +dwc2_readl (hsotg->regs +DOEPCTL0 )); }static void dwc2_hsotg_core_disconnect (struct dwc2_hsotg *hsotg)
Greg Kroah-Hartman
maintainerPATCH 30/96 usb: cdc_acm: prevent race at write to acm while system resumes
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dominik Bozek <[email protected]>
[ Upstream commit b86b8eb6fecb5a4bac1ed0ca925c4082a61ea6e9 ]
ACM driver may accept data to transmit while system is not fully resumed. In this case ACM driver buffers data and prepare URBs on usb anchor list.
There is a little chance that two tasks put a char and initiate acm_tty_flush_chars(). In such a case, driver will put one URB twice on usb anchor list.
This patch also reset length of data before resue of a buffer. This not only prevent sending rubbish, but also lower risc of race.
Without this patch we hit following kernel panic in one of our stabilty/stress tests.
[ 46.884442] *list_add double add*: new=ffff9b2ab7289330, prev=ffff9b2ab7289330, next=ffff9b2ab81e28e0. [ 46.884476] Modules linked in: hci_uart btbcm bluetooth rfkill_gpio igb_avb(O) cfg80211 snd_soc_sst_bxt_tdf8532 snd_soc_skl snd_soc_skl_ipc snd_soc_sst_ipc snd_soc_sst_dsp snd_soc_sst_acpi snd_soc_sst_match snd_hda_ext_core snd_hda_core trusty_timer trusty_wall trusty_log trusty_virtio trusty_ipc trusty_mem trusty_irq trusty virtio_ring virtio intel_ipu4_mmu_bxtB0 lib2600_mod_bxtB0 intel_ipu4_isys_mod_bxtB0 lib2600psys_mod_bxtB0 intel_ipu4_psys_mod_bxtB0 intel_ipu4_mod_bxtB0 intel_ipu4_wrapper_bxtB0 intel_ipu4_acpi videobuf2_dma_contig as3638 dw9714 lm3643 crlmodule smiapp smiapp_pll [ 46.884480] CPU: 1 PID: 33 Comm: kworker/u8:1 Tainted: G U W O 4.9.56-quilt-2e5dc0ac-g618ed69ced6e-dirty #4 [ 46.884489] Workqueue: events_unbound flush_to_ldisc [ 46.884494] ffffb98ac012bb08 ffffffffad3e82e5 ffffb98ac012bb58 0000000000000000 [ 46.884497] ffffb98ac012bb48 ffffffffad0a23d1 00000024ad6374dd ffff9b2ab7289330 [ 46.884500] ffff9b2ab81e28e0 ffff9b2ab7289330 0000000000000002 0000000000000000 [ 46.884501] Call Trace: [ 46.884507] [<ffffffffad3e82e5>] dump_stack+0x67/0x92 [ 46.884511] [<ffffffffad0a23d1>] __warn+0xd1/0xf0 [ 46.884513] [<ffffffffad0a244f>] warn_slowpath_fmt+0x5f/0x80 [ 46.884516] [<ffffffffad407443>] __list_add+0xb3/0xc0 [ 46.884521] [<ffffffffad71133c>] *usb_anchor_urb*+0x4c/0xa0 [ 46.884524] [<ffffffffad782c6f>] *acm_tty_flush_chars*+0x8f/0xb0 [ 46.884527] [<ffffffffad782cd1>] *acm_tty_put_char*+0x41/0x100 [ 46.884530] [<ffffffffad4ced34>] tty_put_char+0x24/0x40 [ 46.884533] [<ffffffffad4d3bf5>] do_output_char+0xa5/0x200 [ 46.884535] [<ffffffffad4d3e98>] __process_echoes+0x148/0x290 [ 46.884538] [<ffffffffad4d654c>] n_tty_receive_buf_common+0x57c/0xb00 [ 46.884541] [<ffffffffad4d6ae4>] n_tty_receive_buf2+0x14/0x20 [ 46.884543] [<ffffffffad4d9662>] tty_ldisc_receive_buf+0x22/0x50 [ 46.884545] [<ffffffffad4d9c05>] flush_to_ldisc+0xc5/0xe0 [ 46.884549] [<ffffffffad0bcfe8>] process_one_work+0x148/0x440 [ 46.884551] [<ffffffffad0bdc19>] worker_thread+0x69/0x4a0 [ 46.884554] [<ffffffffad0bdbb0>] ? max_active_store+0x80/0x80 [ 46.884556] [<ffffffffad0c2e10>] kthread+0x110/0x130 [ 46.884559] [<ffffffffad0c2d00>] ? kthread_park+0x60/0x60 [ 46.884563] [<ffffffffadad9917>] ret_from_fork+0x27/0x40 [ 46.884566] ---[ end trace 3bd599058b8a9eb3 ]---
--- drivers/usb/class/cdc-acm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/usb/class/cdc-acm.c +6 -3
@@ -174,6 +174,7 @@ static int acm_wb_alloc(struct acm *acm) wb = &acm->wb[wbn];if (!wb->use) { wb->use =1 ; + wb->len =0 ;return wbn; } wbn = (wbn +1 ) %ACM_NW ;
@@ -731,16 +732,18 @@ static int acm_tty_write(struct tty_strustatic void acm_tty_flush_chars (struct tty_struct *tty) {struct acm *acm = tty->driver_data; -struct acm_wb *cur = acm->putbuffer; +struct acm_wb *cur;int err;unsigned long flags; +spin_lock_irqsave (&acm->write_lock, flags); + + cur = acm->putbuffer;if (!cur)/* nothing to do */ -return ; + goto out; acm->putbuffer =NULL ; err =usb_autopm_get_interface_async (acm->control); -spin_lock_irqsave (&acm->write_lock, flags);if (err <0 ) { cur->use =0 ; acm->putbuffer = cur;
Greg Kroah-Hartman
maintainerPATCH 31/96 USB: OHCI: Fix NULL dereference in HCDs using HCD_LOCAL_MEM
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fredrik Noring <[email protected]>
[ Upstream commit d6c931ea32dc08ac2665bb5f009f9c40ad1bbdb3 ]
Scatter-gather needs to be disabled when using dma_declare_coherent_memory and HCD_LOCAL_MEM. Andrea Righi made the equivalent fix for EHCI drivers in commit 4307a28eb01284 "USB: EHCI: fix NULL pointer dererence in HCDs that use HCD_LOCAL_MEM".
The following NULL pointer WARN_ON_ONCE triggered with OHCI drivers:
------------[ cut here ]------------
WARNING: CPU: 0 PID: 49 at drivers/usb/core/hcd.c:1379 hcd_alloc_coherent+0x4c/0xc8
Modules linked in:
CPU: 0 PID: 49 Comm: usb-storage Not tainted 4.15.0+ #1014
Stack : 00000000 00000000 805a78d2 0000003a 81f5c2cc 8053d367 804d77fc 00000031
805a3a08 00000563 81ee9400 805a0000 00000000 10058c00 81f61b10 805c0000
00000000 00000000 805a0000 00d9038e 00000004 803ee818 00000006 312e3420
805c0000 00000000 00000073 81f61958 00000000 00000000 802eb380 804fd538
00000009 00000563 81ee9400 805a0000 00000002 80056148 00000000 805a0000
...
Call Trace:
[<578af360>] show_stack+0x74/0x104
[<2f3702c6>] __warn+0x118/0x120
[<ae93fc9e>] warn_slowpath_null+0x44/0x58
[<a891a517>] hcd_alloc_coherent+0x4c/0xc8
[<3578fa36>] usb_hcd_map_urb_for_dma+0x4d8/0x534
[<110bc94c>] usb_hcd_submit_urb+0x82c/0x834
[<02eb5baf>] usb_sg_wait+0x14c/0x1a0
[<ccd09e85>] usb_stor_bulk_transfer_sglist.part.1+0xac/0x124
[<87a5c34c>] usb_stor_bulk_srb+0x40/0x60
[<ff1792ac>] usb_stor_Bulk_transport+0x160/0x37c
[<b9e2709c>] usb_stor_invoke_transport+0x3c/0x500
[<004754f4>] usb_stor_control_thread+0x258/0x28c
[<22edf42e>] kthread+0x134/0x13c
[<a419ffd0>] ret_from_kernel_thread+0x14/0x1c
---[ end trace bcdb825805eefdcc ]------ drivers/usb/host/ohci-hcd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/host/ohci-hcd.c +2 -1
@@ -446,7 +446,8 @@ static int ohci_init (struct ohci_hcd *ostruct usb_hcd *hcd =ohci_to_hcd (ohci);/* Accept arbitrarily long scatter-gather lists */ - hcd->self.sg_tablesize = ~0 ; +if (!(hcd->driver->flags &HCD_LOCAL_MEM )) + hcd->self.sg_tablesize = ~0 ;if (distrust_firmware) ohci->flags |=OHCI_QUIRK_HUB_POWER ;
Greg Kroah-Hartman
maintainerPATCH 32/96 net/usb/qmi_wwan.c: Add USB id for lt4120 modem
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Torsten Hilbrich <[email protected]>
[ Upstream commit f3d801baf118c9d452ee7c278df16880c892e669 ]
This is needed to support the modem found in HP EliteBook 820 G3.
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -942,6 +942,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ + {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x0125, 4)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */
Greg Kroah-Hartman
maintainerPATCH 33/96 net-usb: add qmi_wwan if on lte modem wistron neweb d18q1
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giuseppe Lippolis <[email protected]>
[ Upstream commit d4c4bc11353f3bea6754f7d21e3612c9f32d1d64 ]
This modem is embedded on dlink dwr-921 router.
The oem configuration states:
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1435 ProdID=0918 Rev= 2.32
S: Manufacturer=Android
S: Product=Android
S: SerialNumber=0123456789ABCDEF
C:* #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E: Ad=84(I) Atr=03(Int.) MxPS= 64 Ivl=32ms
E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
E: Ad=86(I) Atr=03(Int.) MxPS= 64 Ivl=32ms
E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
E: Ad=88(I) Atr=03(Int.) MxPS= 64 Ivl=32ms
E: Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=32ms
E: Ad=89(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 6 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none)
E: Ad=8b(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=07(O) Atr=02(Bulk) MxPS= 512 Ivl=125usTested on openwrt distribution
--- drivers/net/usb/qmi_wwan.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/usb/qmi_wwan.c +3 -0
@@ -810,6 +810,9 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ + {QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */ + {QMI_FIXED_INTF(0x1435, 0xd181, 4)}, /* Wistron NeWeb D18Q1 */ + {QMI_FIXED_INTF(0x1435, 0xd181, 5)}, /* Wistron NeWeb D18Q1 */ {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ {QMI_FIXED_INTF(0x16d8, 0x6007, 0)}, /* CMOTech CHE-628S */ {QMI_FIXED_INTF(0x16d8, 0x6008, 0)}, /* CMOTech CMU-301 */
Greg Kroah-Hartman
maintainerPATCH 34/96 Bluetooth: btusb: Add USB ID 7392:a611 for Edimax EW-7611ULB
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vicente Bergas <[email protected]>
[ Upstream commit a41e0796396eeceff673af4a38feaee149c6ff86 ]
This WiFi/Bluetooth USB dongle uses a Realtek chipset, so, use btrtl for it.
Product information:
https://wikidevi.com/wiki/Edimax_EW-7611ULB
Quoted 1 line
Quoted 1 line
From
/sys/kernel/debug/usb/devices
T: Bus=02 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=7392 ProdID=a611 Rev= 2.00 S: Manufacturer=Realtek S: Product=Edimax Wi-Fi N150 Bluetooth4.0 USB Adapter S: SerialNumber=00e04c000001 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=500mA A: FirstIf#= 0 IfCount= 2 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 6 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtl8723bu E: Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=06(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=87(I) Atr=03(Int.) MxPS= 64 Ivl=500us E: Ad=08(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=09(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
--- drivers/bluetooth/btusb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/bluetooth/btusb.c +3 -0
@@ -345,6 +345,9 @@ static const struct usb_device_id blackl { USB_DEVICE(0x13d3, 0x3459), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x13d3, 0x3494), .driver_info = BTUSB_REALTEK }, + /* Additional Realtek 8723BU Bluetooth devices */ + { USB_DEVICE(0x7392, 0xa611), .driver_info = BTUSB_REALTEK }, + /* Additional Realtek 8821AE Bluetooth devices */ { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },
Greg Kroah-Hartman
maintainerPATCH 35/96 ALSA: usb-audio: Add native DSD support for Luxman DA-06
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nobutaka Okabe <[email protected]>
[ Upstream commit 71426535f49fe6034d0e0db77608b91a0c1a022d ]
Add native DSD support quirk for Luxman DA-06 DAC, by adding the PID/VID 1852:5065.
Rename "is_marantz_denon_dac()" function to "is_itf_usb_dsd_2alts_dac()" to cover broader device family sharing the same USB audio implementation(*).
For the same reason, rename "is_teac_dsd_dac()" function to "is_itf_usb_dsd_3alts_dac()".
(*)
These devices have the same USB controller "ITF-USB DSD", supplied by INTERFACE Co., Ltd.
"ITF-USB DSD" USB controller has two patterns,
Pattern 1. (2 altsets version)
- Altset 0: for control
- Altset 1: for stream (S32)
- Altset 2: for stream (S32, DSD_U32)
Pattern 2. (3 altsets version)
- Altset 0: for control
- Altset 1: for stream (S16)
- Altset 2: for stream (S32)
- Altset 3: for stream (S32, DSD_U32)
"is_itf_usb_dsd_2alts_dac()" returns true, if the DAC has "Pattern 1" USB controller, and "is_itf_usb_dsd_3alts_dac()" returns true, if "Pattern2".
--- sound/usb/quirks.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
sound/usb/quirks.c +16 -13
@@ -1153,24 +1153,27 @@ bool snd_usb_get_sample_rate_quirk(strucreturn false; } -/* Marantz/Denon USB DACs need a vendor cmd to switch +/* ITF-USB DSD based DACs need a vendor cmd to switch * between PCM and native DSD mode +* (2 altsets version) */ -static bool is_marantz_denon_dac (unsigned int id) +static bool is_itf_usb_dsd_2alts_dac (unsigned int id) {switch (id) {case USB_ID (0x154e ,0x1003 ):/* Denon DA-300USB */ case USB_ID (0x154e ,0x3005 ):/* Marantz HD-DAC1 */ case USB_ID (0x154e ,0x3006 ):/* Marantz SA-14S1 */ +case USB_ID (0x1852 ,0x5065 ):/* Luxman DA-06 */ return true; }return false; } -/* TEAC UD-501/UD-503/NT-503 USB DACs need a vendor cmd to switch -* between PCM/DOP and native DSD mode +/* ITF-USB DSD based DACs need a vendor cmd to switch +* between PCM and native DSD mode +* (3 altsets version) */ -static bool is_teac_dsd_dac (unsigned int id) +static bool is_itf_usb_dsd_3alts_dac (unsigned int id) {switch (id) {case USB_ID (0x0644 ,0x8043 ):/* TEAC UD-501/UD-503/NT-503 */
@@ -1187,7 +1190,7 @@ int snd_usb_select_mode_quirk(struct sndstruct usb_device *dev = subs->dev;int err; -if (is_marantz_denon_dac (subs->stream->chip->usb_id)) { +if (is_itf_usb_dsd_2alts_dac (subs->stream->chip->usb_id)) {/* First switch to alt set 0, otherwise the mode switch cmd * will not be accepted by the DAC */
@@ -1208,7 +1211,7 @@ int snd_usb_select_mode_quirk(struct sndbreak ; }mdelay (20 ); - }else if (is_teac_dsd_dac (subs->stream->chip->usb_id)) { + }else if (is_itf_usb_dsd_3alts_dac (subs->stream->chip->usb_id)) {/* Vendor mode switch cmd is required. */ switch (fmt->altsetting) {case 3 :/* DSD mode (DSD_U32) requested */
@@ -1304,10 +1307,10 @@ void snd_usb_ctl_msg_quirk(struct usb_de (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)mdelay (20 ); -/* Marantz/Denon devices with USB DAC functionality need a delay +/* ITF-USB DSD based DACs functionality need a delay * after each class compliant request */ -if (is_marantz_denon_dac (chip->usb_id) +if (is_itf_usb_dsd_2alts_dac (chip->usb_id) && (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS )mdelay (20 );
@@ -1371,14 +1374,14 @@ u64 snd_usb_interface_dsd_format_quirks(break ; } -/* Denon/Marantz devices with USB DAC functionality */ -if (is_marantz_denon_dac (chip->usb_id)) { +/* ITF-USB DSD based DACs (2 altsets version) */ +if (is_itf_usb_dsd_2alts_dac (chip->usb_id)) {if (fp->altsetting ==2 )return SNDRV_PCM_FMTBIT_DSD_U32_BE ; } -/* TEAC devices with USB DAC functionality */ -if (is_teac_dsd_dac (chip->usb_id)) { +/* ITF-USB DSD based DACs (3 altsets version) */ +if (is_itf_usb_dsd_3alts_dac (chip->usb_id)) {if (fp->altsetting ==3 )return SNDRV_PCM_FMTBIT_DSD_U32_BE ; }
Greg Kroah-Hartman
maintainerPATCH 36/96 usb: dwc3: Add SoftReset PHY synchonization delay
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thinh Nguyen <[email protected]>
[ Upstream commit fab3833338779e1e668bd58d1f76d601657304b8 ]
Quoted 1 line
Quoted 1 line
From
DWC_usb31programming guide section 1.3.2, onceDWC3_DCTL_CSFTRST
bit is cleared, we must wait at least 50ms before accessing the PHY domain (synchronization delay).
--- drivers/usb/dwc3/core.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/usb/dwc3/core.c +12 -1
@@ -161,7 +161,7 @@ static int dwc3_core_soft_reset(struct ddo { reg =dwc3_readl (dwc->regs,DWC3_DCTL );if (!(reg &DWC3_DCTL_CSFTRST )) -return 0 ; + goto done;udelay (1 ); }while (--retries);
@@ -170,6 +170,17 @@ static int dwc3_core_soft_reset(struct dphy_exit (dwc->usb2_generic_phy);return -ETIMEDOUT ; + +done: +/* +* For DWC_usb31 controller, once DWC3_DCTL_CSFTRST bit is cleared, +* we must wait at least 50ms before accessing the PHY domain +* (synchronization delay). DWC_usb31 programming guide section 1.3.2. +*/ +if (dwc3_is_usb31 (dwc)) +msleep (50 ); + +return 0 ; }/**
Greg Kroah-Hartman
maintainerPATCH 37/96 usb: dwc3: Update DWC_usb31 GTXFIFOSIZ reg fields
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thinh Nguyen <[email protected]>
[ Upstream commit 0cab8d26d6e5e053b2bed3356992aaa71dc93628 ]
Update two GTXFIFOSIZ bit fields for the DWC_usb31 controller. TXFDEP is a 15-bit value instead of 16-bit value, and bit 15 is TXFRAMNUM.
The GTXFIFOSIZ register for DWC_usb31 is as follows:
+-------+-----------+----------------------------------+ | BITS | Name | Description | +=======+===========+==================================+ | 31:16 | TXFSTADDR | Transmit FIFOn RAM Start Address | | 15 | TXFRAMNUM | Asynchronous/Periodic TXFIFO | | 14:0 | TXFDEP | TXFIFO Depth | +-------+-----------+----------------------------------+
--- drivers/usb/dwc3/core.h | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/dwc3/core.h +2 -0
@@ -238,6 +238,8 @@#define DWC3_GUSB3PIPECTL_TX_DEEPH (n) ((n) << 1)/* Global TX Fifo Size Register */ +#define DWC31_GTXFIFOSIZ_TXFRAMNUM BIT(15)/* DWC_usb31 only */ +#define DWC31_GTXFIFOSIZ_TXFDEF (n) ((n) & 0x7fff)/* DWC_usb31 only */ #define DWC3_GTXFIFOSIZ_TXFDEF (n) ((n) & 0xffff)#define DWC3_GTXFIFOSIZ_TXFSTADDR (n) ((n) & 0xffff0000)
Greg Kroah-Hartman
maintainerPATCH 38/96 xhci: zero usb device slot_id member when disabling and freeing a xhci slot
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
[ Upstream commit a400efe455f7b61ac9a801ac8d0d01f8c8d82dd5 ]
set udev->slot_id to zero when disabling and freeing the xhci slot. Prevents usb core from calling xhci with a stale slot id.
xHC controller may be reset during resume to recover from some error. All slots are unusable as they are disabled and freed.
xhci driver starts slot enumeration again from 1 in the order they are enabled. In the worst case a stale udev->slot_id for one device matches a newly enabled slot_id for a different device, causing us to perform a action on the wrong device.
--- drivers/usb/host/xhci-mem.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/host/xhci-mem.c +2 -0
@@ -975,6 +975,8 @@ void xhci_free_virt_device(struct xhci_hif (dev->out_ctx)xhci_free_container_ctx (xhci, dev->out_ctx); +if (dev->udev && dev->udev->slot_id) + dev->udev->slot_id =0 ;kfree (xhci->devs[slot_id]); xhci->devs[slot_id] =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 39/96 usb: dwc2: Fix interval type issue
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Grigor Tovmasyan <[email protected]>
[ Upstream commit 12814a3f8f9b247531d7863170cc82b3fe4218fd ]
The maximum value that unsigned char can hold is 255, meanwhile the maximum value of interval is 2^(bIntervalMax-1)=2^15.
--- drivers/usb/dwc2/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc2/core.h +1 -1
@@ -209,7 +209,7 @@ struct dwc2_hsotg_ep {unsigned char dir_in;unsigned char index;unsigned char mc; -unsigned char interval; +u16 interval; unsigned int halted:1; unsigned int periodic:1;
Greg Kroah-Hartman
maintainerPATCH 40/96 usb: dwc2: host: Fix transaction errors in host mode
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Minas Harutyunyan <[email protected]>
[ Upstream commit 92a8dd26464e1f21f1d869ec53717bd2c1200d63 ]
Added missing GUSBCFG programming in host mode, which fixes transaction errors issue on HiKey and Altera Cyclone V boards.
These field even if was programmed in device mode (in function dwc2_hsotg_core_init_disconnected()) will be resetting to POR values after core soft reset applied.
So, each time when switching to host mode required to set this field to correct value.
--- drivers/usb/dwc2/hcd.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/usb/dwc2/hcd.c +13 -1
@@ -2268,10 +2268,22 @@ static int dwc2_core_init(struct dwc2_hs*/ static void dwc2_core_host_init (struct dwc2_hsotg *hsotg) { -u32 hcfg, hfir, otgctl; +u32 hcfg, hfir, otgctl, usbcfg;dev_dbg (hsotg->dev,"%s(%p)\n" , __func__, hsotg); +/* Set HS/FS Timeout Calibration to 7 (max available value). +* The number of PHY clocks that the application programs in +* this field is added to the high/full speed interpacket timeout +* duration in the core to account for any additional delays +* introduced by the PHY. This can be required, because the delay +* introduced by the PHY in generating the linestate condition +* can vary from one PHY to another. +*/ + usbcfg =dwc2_readl (hsotg->regs +GUSBCFG ); + usbcfg |=GUSBCFG_TOUTCAL (7 ); +dwc2_writel (usbcfg, hsotg->regs +GUSBCFG ); +/* Restart the Phy Clock */ dwc2_writel (0 , hsotg->regs +PCGCTL );
Greg Kroah-Hartman
maintainerPATCH 41/96 usb: gadget: ffs: Let setup() return USB_GADGET_DELAYED_STATUS
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
[ Upstream commit 946ef68ad4e45aa048a5fb41ce8823ed29da866a ]
Some UDC drivers (like the DWC3) expect that the response to a setup() request is queued from within the setup function itself so that it is available as soon as setup() has completed.
Upon receiving a setup request the function fs driver creates an event that is made available to userspace. And only once userspace has acknowledged that event the response to the setup request is queued.
So it violates the requirement of those UDC drivers and random failures can be observed. This is basically a race condition and if userspace is able to read the event and queue the response fast enough all is good. But if it is not, for example because other processes are currently scheduled to run, the USB host that sent the setup request will observe an error.
To avoid this the gadget framework provides the USB_GADGET_DELAYED_STATUS return code. If a setup() callback returns this value the UDC driver is aware that response is not yet available and can uses the appropriate methods to handle this case.
Since in the case of function fs the response will never be available when the setup() function returns make sure that this status code is used.
This fixed random occasional failures that were previously observed on a DWC3 based system under high system load.
--- drivers/usb/gadget/function/f_fs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/function/f_fs.c +1 -1
@@ -3239,7 +3239,7 @@ static int ffs_func_setup(struct usb_fun__ffs_event_add (ffs,FUNCTIONFS_SETUP );spin_unlock_irqrestore (&ffs->ev.waitq.lock, flags); -return 0 ; +return USB_GADGET_DELAYED_STATUS ; } static bool ffs_func_req_match(struct usb_function *f,
Greg Kroah-Hartman
maintainerPATCH 42/96 usb: gadget: ffs: Execute copy_to_user() with USER_DS set
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
[ Upstream commit 4058ebf33cb0be88ca516f968eda24ab7b6b93e4 ]
When using a AIO read() operation on the function FS gadget driver a URB is submitted asynchronously and on URB completion the received data is copied to the userspace buffer associated with the read operation.
This is done from a kernel worker thread invoking copy_to_user() (through copy_to_iter()). And while the user space process memory is made available to the kernel thread using use_mm(), some architecture require in addition to this that the operation runs with USER_DS set. Otherwise the userspace memory access will fail.
For example on ARM64 with Privileged Access Never (PAN) and User Access Override (UAO) enabled the following crash occurs.
Internal error: Accessing user space memory with fs=KERNEL_DS: 9600004f [#1] SMP Modules linked in: CPU: 2 PID: 1636 Comm: kworker/2:1 Not tainted 4.9.0-04081-g8ab2dfb-dirty #487 Hardware name: ZynqMP ZCU102 Rev1.0 (DT) Workqueue: events ffs_user_copy_worker task: ffffffc87afc8080 task.stack: ffffffc87a00c000 PC is at __arch_copy_to_user+0x190/0x220 LR is at copy_to_iter+0x78/0x3c8 [...] [<ffffff800847b790>] __arch_copy_to_user+0x190/0x220 [<ffffff80086f25d8>] ffs_user_copy_worker+0x70/0x130 [<ffffff80080b8c64>] process_one_work+0x1dc/0x460 [<ffffff80080b8f38>] worker_thread+0x50/0x4b0 [<ffffff80080bf5a0>] kthread+0xd8/0xf0 [<ffffff8008083680>] ret_from_fork+0x10/0x50
Address this by placing a set_fs(USER_DS) before of the copy operation and revert it again once the copy operation has finished.
This patch is analogous to commit d7ffde35e31a ("vhost: use USER_DS in vhost_worker thread") which addresses the same underlying issue.
--- drivers/usb/gadget/function/f_fs.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/gadget/function/f_fs.c +4 -0
@@ -759,9 +759,13 @@ static void ffs_user_copy_worker(structbool kiocb_has_eventfd = io_data->kiocb->ki_flags &IOCB_EVENTFD ;if (io_data->read && ret >0 ) { +mm_segment_t oldfs =get_fs (); + +set_fs (USER_DS );use_mm (io_data->mm); ret =ffs_copy_to_iter (io_data->buf, ret, &io_data->data);unuse_mm (io_data->mm); +set_fs (oldfs); } io_data->kiocb->ki_complete (io_data->kiocb, ret, ret);
Greg Kroah-Hartman
maintainerPATCH 43/96 usb: gadget: udc: change comparison to bitshift when dealing with a mask
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
[ Upstream commit ac87e560f7c0f91b62012e9a159c0681a373b922 ]
Due to a typo, the mask was destroyed by a comparison instead of a bit shift.
--- drivers/usb/gadget/udc/goku_udc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/goku_udc.h +1 -1
@@ -28,7 +28,7 @@ struct goku_udc_regs {# define INT_EP1DATASET 0x00040# define INT_EP2DATASET 0x00080# define INT_EP3DATASET 0x00100 -#define INT_EPnNAK (n) (0x00100 < (n))/* 0 < n < 4 */ +#define INT_EPnNAK (n) (0x00100 << (n))/* 0 < n < 4 */ # define INT_EP1NAK 0x00200# define INT_EP2NAK 0x00400# define INT_EP3NAK 0x00800
Greg Kroah-Hartman
maintainerPATCH 44/96 usb: gadget: composite: fix incorrect handling of OS desc requests
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Dickens <[email protected]>
[ Upstream commit 5d6ae4f0da8a64a185074dabb1b2f8c148efa741 ]
When handling an OS descriptor request, one of the first operations is to zero out the request buffer using the wLength from the setup packet. There is no bounds checking, so a wLength > 4096 would clobber memory adjacent to the request buffer. Fix this by taking the min of wLength and the request buffer length prior to the memset. While at it, define the buffer length in a header file so that magic numbers don't appear throughout the code.
When returning data to the host, the data length should be the min of the wLength and the valid data we have to return. Currently we are returning wLength, thus requests for a wLength greater than the amount of data in the OS descriptor buffer would return invalid (albeit zero'd) data following the valid descriptor data. Fix this by counting the number of bytes when constructing the data and using this when determining the length of the request.
--- drivers/usb/gadget/composite.c | 40 +++++++++++++++++++--------------------- include/linux/usb/composite.h | 3 +++ 2 files changed, 22 insertions(+), 21 deletions(-)
drivers/usb/gadget/composite.c +19 -21
@@ -1421,7 +1421,7 @@ static int count_ext_compat(struct usb_creturn res; } -static void fill_ext_compat (struct usb_configuration *c,u8 *buf) +static int fill_ext_compat (struct usb_configuration *c,u8 *buf) {int i, count;
@@ -1448,10 +1448,12 @@ static void fill_ext_compat(struct usb_c buf +=23 ; } count +=24 ; -if (count >=4096 ) -return ; +if (count +24 >=USB_COMP_EP0_OS_DESC_BUFSIZ ) +return count; } } + +return count; }static int count_ext_prop (struct usb_configuration *c,int interface)
@@ -1496,25 +1498,20 @@ static int fill_ext_prop(struct usb_confstruct usb_os_desc *d;struct usb_os_desc_ext_prop *ext_prop;int j, count, n, ret; -u8 *start = buf; f = c->interface[interface]; + count =10 ;/* header length */ for (j =0 ; j < f->os_desc_n; ++j) {if (interface != f->os_desc_table[j].if_id)continue ; d = f->os_desc_table[j].os_desc;if (d)list_for_each_entry (ext_prop, &d->ext_prop, entry) { -/* 4kB minus header length */ - n = buf - start; -if (n >=4086 ) -return 0 ; - - count = ext_prop->data_len + + n = ext_prop->data_len + ext_prop->name_len +14 ; -if (count >4086 - n) -return -EINVAL ; -usb_ext_prop_put_size (buf, count); +if (count + n >=USB_COMP_EP0_OS_DESC_BUFSIZ ) +return count; +usb_ext_prop_put_size (buf, n);usb_ext_prop_put_type (buf, ext_prop->type); ret =usb_ext_prop_put_name (buf, ext_prop->name, ext_prop->name_len);
@@ -1540,11 +1537,12 @@ static int fill_ext_prop(struct usb_confdefault :return -EINVAL ; } - buf += count; + buf += n; + count += n; } } -return 0 ; +return count; }/*
@@ -1822,6 +1820,7 @@ unknown: req->complete = composite_setup_complete; buf = req->buf; os_desc_cfg = cdev->os_desc_config; + w_length =min_t (u16, w_length,USB_COMP_EP0_OS_DESC_BUFSIZ );memset (buf,0 , w_length); buf[5 ] =0x01 ;switch (ctrl->bRequestType &USB_RECIP_MASK ) {
@@ -1845,8 +1844,8 @@ unknown: count +=16 ;/* header */ put_unaligned_le32 (count, buf); buf +=16 ; -fill_ext_compat (os_desc_cfg, buf); - value = w_length; + value =fill_ext_compat (os_desc_cfg, buf); + value =min_t (u16, w_length, value); }break ;case USB_RECIP_INTERFACE :
@@ -1875,8 +1874,7 @@ unknown: interface, buf);if (value <0 )return value; - - value = w_length; + value =min_t (u16, w_length, value); }break ; }
@@ -2151,8 +2149,8 @@ int composite_os_desc_req_prepare(struct goto end; } -/* OS feature descriptor length <= 4kB */ - cdev->os_desc_req->buf =kmalloc (4096 ,GFP_KERNEL ); + cdev->os_desc_req->buf =kmalloc (USB_COMP_EP0_OS_DESC_BUFSIZ , +GFP_KERNEL );if (!cdev->os_desc_req->buf) { ret = -ENOMEM ;usb_ep_free_request (ep0, cdev->os_desc_req);
include/linux/usb/composite.h +3 -0
@@ -53,6 +53,9 @@/* big enough to hold our biggest descriptor */ #define USB_COMP_EP0_BUFSIZ 1024 +/* OS feature descriptor length <= 4kB */ +#define USB_COMP_EP0_OS_DESC_BUFSIZ 4096 +#define USB_MS_TO_HS_INTERVAL (x) (ilog2((x * 1000 / 125)) + 1)struct usb_configuration ;
Greg Kroah-Hartman
maintainerPATCH 45/96 media: em28xx: USB bulk packet size fix
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brad Love <[email protected]>
[ Upstream commit c7c7e8d7803406daa21e96d00c357de8b77b6764 ]
Hauppauge em28xx bulk devices exhibit continuity errors and corrupted packets, when run in VMWare virtual machines. Unknown if other manufacturers bulk models exhibit the same issue. KVM/Qemu is unaffected.
According to documentation the maximum packet multiplier for em28xx in bulk transfer mode is 256 * 188 bytes. This changes the size of bulk transfers to maximum supported value and have a bonus beneficial alignment.
Before:
After:
This sets up USB to expect just as many bytes as the em28xx is set to emit.
Successful usage under load afterwards natively and in both VMWare and KVM/Qemu virtual machines.
--- drivers/media/usb/em28xx/em28xx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/em28xx/em28xx.h +1 -1
@@ -189,7 +189,7 @@USB 2.0 spec says bulk packet size is always 512 bytes */ #define EM28XX_BULK_PACKET_MULTIPLIER 384 -#define EM28XX_DVB_BULK_PACKET_MULTIPLIER 384 +#define EM28XX_DVB_BULK_PACKET_MULTIPLIER 94#define EM28XX_INTERLACED_DEFAULT 1
Greg Kroah-Hartman
maintainerPATCH 46/96 Bluetooth: btusb: Add device ID for RTL8822BE
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
[ Upstream commit fed03fe7e55b7dc16077f672bd9d7bbe92b3a691 ]
The Asus Z370-I contains a Realtek RTL8822BE device with an associated BT chip using a USB ID of 0b05:185c. This device is added to the driver.
--- drivers/bluetooth/btusb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/bluetooth/btusb.c +3 -0
@@ -355,6 +355,9 @@ static const struct usb_device_id blackl { USB_DEVICE(0x13d3, 0x3461), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x13d3, 0x3462), .driver_info = BTUSB_REALTEK }, + /* Additional Realtek 8822BE Bluetooth devices */ + { USB_DEVICE(0x0b05, 0x185c), .driver_info = BTUSB_REALTEK }, + /* Silicon Wave based devices */ { USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE },
Greg Kroah-Hartman
maintainerPATCH 47/96 staging: lustre: fix bug in osc_enter_cache_try
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit 2fab9faf9b27298c4536c1c1b14072ab18b8f80b ]
The lustre-release patch commit bdc5bb52c554 ("LU-4933 osc:
Automatically increase the max_dirty_mb") changed
- if (cli->cl_dirty + PAGE_CACHE_SIZE <= cli->cl_dirty_max &&
+ if (cli->cl_dirty_pages < cli->cl_dirty_max_pages &&
When this patch landed in Linux a couple of years later, it landed as
- if (cli->cl_dirty + PAGE_SIZE <= cli->cl_dirty_max &&
+ if (cli->cl_dirty_pages <= cli->cl_dirty_max_pages &&
which is clearly different ('<=' vs '<'), and allows cl_dirty_pages to increase beyond cl_dirty_max_pages - which causes a latter assertion to fails.
--- drivers/staging/lustre/lustre/include/obd.h | 2 +- drivers/staging/lustre/lustre/osc/osc_cache.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/staging/lustre/lustre/include/obd.h +1 -1
@@ -253,7 +253,7 @@ struct client_obd {struct sptlrpc_flavor cl_flvr_mgc;/* fixed flavor of mgc->mgs */ /* the grant values are protected by loi_list_lock below */ -unsigned long cl_dirty_pages;/* all _dirty_ in pahges */ +unsigned long cl_dirty_pages;/* all _dirty_ in pages */ unsigned long cl_dirty_max_pages;/* allowed w/o rpc */ unsigned long cl_dirty_transit;/* dirty synchronous */ unsigned long cl_avail_grant;/* bytes of credit for ost */
drivers/staging/lustre/lustre/osc/osc_cache.c +1 -1
@@ -1542,7 +1542,7 @@ static int osc_enter_cache_try(struct clif (rc <0 )return 0 ; -if (cli->cl_dirty_pages <= cli->cl_dirty_max_pages && +if (cli->cl_dirty_pages < cli->cl_dirty_max_pages &&atomic_long_read (&obd_dirty_pages) +1 <= obd_max_dirty_pages) {osc_consume_write_grant (cli, &oap->oap_brw_page);if (transient) {
Greg Kroah-Hartman
maintainerPATCH 48/96 staging: rtl8192u: return -ENOMEM on failed allocation of priv->oldaddr
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit e1a7418529e33bc4efc346324557251a16a3e79b ]
Currently the allocation of priv->oldaddr is not null checked which will lead to subsequent errors when accessing priv->oldaddr. Fix this with a null pointer check and a return of -ENOMEM on allocation failure.
Detected with Coccinelle:
drivers/staging/rtl8192u/r8192U_core.c:1708:2-15: alloc with no test, possible model on line 1723
--- drivers/staging/rtl8192u/r8192U_core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/staging/rtl8192u/r8192U_core.c +2 -0
@@ -1705,6 +1705,8 @@ static short rtl8192_usb_initendpoints(s priv->rx_urb[16 ] =usb_alloc_urb (0 ,GFP_KERNEL ); priv->oldaddr =kmalloc (16 ,GFP_KERNEL ); +if (!priv->oldaddr) +return -ENOMEM ; oldaddr = priv->oldaddr; align = ((long )oldaddr) &3 ;if (align) {
Greg Kroah-Hartman
maintainerPATCH 49/96 staging: lustre: lmv: correctly iput lmo_root
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit 17556cdbe6ed70a6a20e597b228628f7f34387f8 ]
Commit 8f18c8a48b73 ("staging: lustre: lmv: separate master object with master stripe") changed how lmo_root inodes were managed, particularly when LMV_HASH_FLAG_MIGRATION is not set. Previously lsm_md_oinfo[0].lmo_root was always a borrowed inode reference and didn't need to by iput().
Since the change, that special case only applies when LMV_HASH_FLAG_MIGRATION is set
In the upstream (lustre-release) version of this patch [Commit 60e07b972114 ("LU-4690 lod: separate master object with master stripe")] the for loop in the lmv_unpack_md() was changed to count from 0 and to ignore entry 0 if LMV_HASH_FLAG_MIGRATION is set. In the patch that got applied to Linux, that change was missing, so lsm_md_oinfo[0].lmo_root is never iput().
This results in a "VFS: Busy inodes" warning at unmount.
--- drivers/staging/lustre/lustre/lmv/lmv_obd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/lustre/lustre/lmv/lmv_obd.c +1 -1
@@ -2928,7 +2928,7 @@ int lmv_unpack_md(struct obd_export *expif (lsm && !lmm) {int i; -for (i =1 ; i < lsm->lsm_md_stripe_count; i++) { +for (i =0 ; i < lsm->lsm_md_stripe_count; i++) {/* * For migrating inode, the master stripe and master * object will be the same, so do not need iput, see
Greg Kroah-Hartman
maintainerPATCH 50/96 crypto: sunxi-ss - Add MODULE_ALIAS to sun4i-ss
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Robinson <[email protected]>
[ Upstream commit 7c73cf4cc2ac16465f5102437dc0a12d66671bd6 ]
The MODULE_ALIAS is required to enable the sun4i-ss driver to load automatically when built at a module. Tested on a Cubietruck.
--- drivers/crypto/sunxi-ss/sun4i-ss-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/crypto/sunxi-ss/sun4i-ss-core.c +1 -0
@@ -422,6 +422,7 @@ static struct platform_driver sun4i_ss_dmodule_platform_driver (sun4i_ss_driver); +MODULE_ALIAS ("platform:sun4i-ss" );MODULE_DESCRIPTION ("Allwinner Security System cryptographic accelerator" );MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Corentin LABBE <[email protected]>" );
Greg Kroah-Hartman
maintainerPATCH 51/96 scsi: fas216: fix sense buffer 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]>
[ Upstream commit 96d5eaa9bb74d299508d811d865c2c41b38b0301 ]
While testing with the ARM specific memset() macro removed, I ran into a compiler warning that shows an old bug:
drivers/scsi/arm/fas216.c: In function 'fas216_rq_sns_done':drivers/scsi/arm/fas216.c:2014:40: error: argument to 'sizeof' in 'memset' call is the same expression as the destination; did you mean to provide an explicit length? [-Werror=sizeof-pointer-memaccess]
It turns out that the definition of the scsi_cmd structure changed back in linux-2.6.25, so now we clear only four bytes (sizeof(pointer)) instead of 96 (SCSI_SENSE_BUFFERSIZE). I did not check whether we actually need to initialize the buffer here, but it's clear that if we do it, we should use the correct size.
--- drivers/scsi/arm/fas216.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/arm/fas216.c +1 -1
@@ -2011,7 +2011,7 @@ static void fas216_rq_sns_done(FAS216_In* have valid data in the sense buffer that could * confuse the higher levels. */ -memset (SCpnt->sense_buffer,0 ,sizeof (SCpnt->sense_buffer)); +memset (SCpnt->sense_buffer,0 ,SCSI_SENSE_BUFFERSIZE );//printk("scsi%d.%c: sense buffer: ", info->host->host_no, '0' + SCpnt->device->id); //{ int i; for (i = 0; i < 32; i++) printk("%02x ", SCpnt->sense_buffer[i]); printk("\n"); } /*
Greg Kroah-Hartman
maintainerPATCH 52/96 scsi: ufs: Enable quirk to ignore sending WRITE_SAME command
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sujit Reddy Thumma <[email protected]>
[ Upstream commit 84af7e8b895088d89f246d6b0f82717fafdebf61 ]
WRITE_SAME command is not supported by UFS. Enable a quirk for the upper level drivers to not send WRITE SAME command.
[mkp: botched patch, applied by hand]
--- drivers/scsi/ufs/ufshcd.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/ufs/ufshcd.c +2 -0
@@ -3338,6 +3338,8 @@ static int ufshcd_slave_alloc(struct scs/* REPORT SUPPORTED OPERATION CODES is not supported */ sdev->no_report_opcodes =1 ; +/* WRITE_SAME command is not supported */ + sdev->no_write_same =1 ;ufshcd_set_queue_depth (sdev);
Greg Kroah-Hartman
maintainerPATCH 53/96 scsi: bnx2fc: Fix check in SCSI completion handler for timed out request
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chad Dupuis <[email protected]>
[ Upstream commit ecf7ff49945f5741fa1da112f994939f942031d3 ]
When a request times out we set the io_req flag BNX2FC_FLAG_IO_COMPL so that if a subsequent completion comes in on that task ID we will ignore it. The issue is that in the check for this flag there is a missing return so we will continue to process a request which may have already been returned to the ownership of the SCSI layer. This can cause unpredictable results.
Solution is to add in the missing return.
[mkp: typo plus title shortening]
--- drivers/scsi/bnx2fc/bnx2fc_io.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/bnx2fc/bnx2fc_io.c +1 -0
@@ -1869,6 +1869,7 @@ void bnx2fc_process_scsi_cmd_compl(struc/* we will not receive ABTS response for this IO */ BNX2FC_IO_DBG (io_req,"Timer context finished processing " "this scsi cmd\n" ); +return ; }/* Cancel the timeout_work, as we received IO completion */
Greg Kroah-Hartman
maintainerPATCH 54/96 scsi: sym53c8xx_2: iterator underflow in sym_getsync()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit e6f791d95313c85f3dd4a26141e28e50ae9aa0ae ]
We wanted to exit the loop with "div" set to zero, but instead, if we don't hit the break then "div" is -1 when we finish the loop. It leads to an array underflow a few lines later.
--- drivers/scsi/sym53c8xx_2/sym_hipd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/sym53c8xx_2/sym_hipd.c +1 -1
@@ -536,7 +536,7 @@ sym_getsync(struct sym_hcb *np, u_char d* Look for the greatest clock divisor that allows an * input speed faster than the period. */ -while (div-- >0 ) +while (--div >0 )if (kpc >= (div_10M[div] <<2 ))break ;/*
Greg Kroah-Hartman
maintainerPATCH 55/96 scsi: mptfusion: Add bounds check in mptctl_hp_targetinfo()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit a7043e9529f3c367cc4d82997e00be034cbe57ca ]
My static checker complains about an out of bounds read:
drivers/message/fusion/mptctl.c:2786 mptctl_hp_targetinfo()
error: buffer overflow 'hd->sel_timeout' 255 <= u32max.It's true that we probably should have a bounds check here.
--- drivers/message/fusion/mptctl.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/message/fusion/mptctl.c +2 -0
@@ -2698,6 +2698,8 @@ mptctl_hp_targetinfo(unsigned long arg) __FILE__, __LINE__, iocnum);return -ENODEV ; } +if (karg.hdr.id >=MPT_MAX_FC_DEVICES ) +return -EINVAL ;dctlprintk (ioc,printk (MYIOC_s_DEBUG_FMT"mptctl_hp_targetinfo called.\n" , ioc->name));
Greg Kroah-Hartman
maintainerPATCH 56/96 scsi: qla2xxx: Avoid triggering undefined behavior in qla2x00_mbx_completion()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
[ Upstream commit c02189e12ce3bf3808cb880569d3b10249f50bd9 ]
A left shift must shift less than the bit width of the left argument. Avoid triggering undefined behavior if ha->mbx_count == 32.
This patch avoids that UBSAN reports the following complaint:
UBSAN: Undefined behaviour in drivers/scsi/qla2xxx/qla_isr.c:275:14 shift exponent 32 is too large for 32-bit type 'int' Call Trace: dump_stack+0x4e/0x6c ubsan_epilogue+0xd/0x3b __ubsan_handle_shift_out_of_bounds+0x112/0x14c qla2x00_mbx_completion+0x1c5/0x25d [qla2xxx] qla2300_intr_handler+0x1ea/0x3bb [qla2xxx] qla2x00_mailbox_command+0x77b/0x139a [qla2xxx] qla2x00_mbx_reg_test+0x83/0x114 [qla2xxx] qla2x00_chip_diag+0x354/0x45f [qla2xxx] qla2x00_initialize_adapter+0x2c2/0xa4e [qla2xxx] qla2x00_probe_one+0x1681/0x392e [qla2xxx] pci_device_probe+0x10b/0x1f1 driver_probe_device+0x21f/0x3a4 __driver_attach+0xa9/0xe1 bus_for_each_dev+0x6e/0xb5 driver_attach+0x22/0x3c bus_add_driver+0x1d1/0x2ae driver_register+0x78/0x130 __pci_register_driver+0x75/0xa8 qla2x00_module_init+0x21b/0x267 [qla2xxx] do_one_initcall+0x5a/0x1e2 do_init_module+0x9d/0x285 load_module+0x20db/0x38e3 SYSC_finit_module+0xa8/0xbc SyS_finit_module+0x9/0xb do_syscall_64+0x77/0x271 entry_SYSCALL64_slow_path+0x25/0x25
--- drivers/scsi/qla2xxx/qla_isr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/scsi/qla2xxx/qla_isr.c +4 -2
@@ -272,7 +272,8 @@ qla2x00_mbx_completion(scsi_qla_host_t *struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;/* Read all mbox registers? */ - mboxes = (1 << ha->mbx_count) -1 ; +WARN_ON_ONCE (ha->mbx_count >32 ); + mboxes = (1ULL << ha->mbx_count) -1 ;if (!ha->mcp)ql_dbg (ql_dbg_async, vha,0x5001 ,"MBX pointer ERROR.\n" );else
@@ -2516,7 +2517,8 @@ qla24xx_mbx_completion(scsi_qla_host_t *struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;/* Read all mbox registers? */ - mboxes = (1 << ha->mbx_count) -1 ; +WARN_ON_ONCE (ha->mbx_count >32 ); + mboxes = (1ULL << ha->mbx_count) -1 ;if (!ha->mcp)ql_dbg (ql_dbg_async, vha,0x504e ,"MBX pointer ERROR.\n" );else
Greg Kroah-Hartman
maintainerPATCH 57/96 scsi: storvsc: Increase cmd_per_lun for higher speed devices
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Michael Kelley (EOSG)" <[email protected]>
[ Upstream commit cabe92a55e3a12005a4ac4d3954c9a174b0efe2a ]
Increase cmd_per_lun to allow more I/Os in progress per device, particularly for NVMe's. The Hyper-V host side can handle the higher count with no issues.
--- drivers/scsi/storvsc_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/storvsc_drv.c +1 -1
@@ -1580,7 +1580,7 @@ static struct scsi_host_template scsi_dr .eh_timed_out = storvsc_eh_timed_out, .slave_alloc = storvsc_device_alloc, .slave_configure = storvsc_device_configure, - .cmd_per_lun = 255, + .cmd_per_lun = 2048, .this_id = -1, .use_clustering = ENABLE_CLUSTERING,/* Make sure we dont get a sg segment crosses a page boundary */
Greg Kroah-Hartman
maintainerPATCH 58/96 scsi: aacraid: fix shutdown crash when init fails
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Meelis Roos <[email protected]>
[ Upstream commit 00c20cdc79259c6c5bf978b21af96c2d3edb646d ]
When aacraid init fails with "AAC0: adapter self-test failed.", shutdown leads to UBSAN warning and then oops:
[154316.118423] ================================================================================ [154316.118508] UBSAN: Undefined behaviour in drivers/scsi/scsi_lib.c:2328:27 [154316.118566] member access within null pointer of type 'struct Scsi_Host' [154316.118631] CPU: 2 PID: 14530 Comm: reboot Tainted: G W 4.15.0-dirty #89 [154316.118701] Hardware name: Hewlett Packard HP NetServer/HP System Board, BIOS 4.06.46 PW 06/25/2003 [154316.118774] Call Trace: [154316.118848] dump_stack+0x48/0x65 [154316.118916] ubsan_epilogue+0xe/0x40 [154316.118976] __ubsan_handle_type_mismatch+0xfb/0x180 [154316.119043] scsi_block_requests+0x20/0x30 [154316.119135] aac_shutdown+0x18/0x40 [aacraid] [154316.119196] pci_device_shutdown+0x33/0x50 [154316.119269] device_shutdown+0x18a/0x390 [...] [154316.123435] BUG: unable to handle kernel NULL pointer dereference at 000000f4 [154316.123515] IP: scsi_block_requests+0xa/0x30
This is because aac_shutdown() does
struct Scsi_Host *shost = pci_get_drvdata(dev);
scsi_block_requests(shost);and that assumes shost has been assigned with pci_set_drvdata().
However, pci_set_drvdata(pdev, shost) is done in aac_probe_one() far after bailing out with error from calling the init function ((*aac_drivers[index].init)(aac)), and when the init function fails, no error is returned from aac_probe_one() so PCI layer assumes there is driver attached, and tries to shut it down later.
Fix it by returning error from aac_probe_one() when card-specific init function fails.
This fixes reboot on my HP NetRAID-4M with dead battery.
--- drivers/scsi/aacraid/linit.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/aacraid/linit.c +3 -1
@@ -1203,8 +1203,10 @@ static int aac_probe_one(struct pci_dev* Map in the registers from the adapter. */ aac->base_size =AAC_MIN_FOOTPRINT_SIZE ; -if ((*aac_drivers[index].init)(aac)) +if ((*aac_drivers[index].init)(aac)) { + error = -ENODEV ; goto out_unmap; + }if (aac->sync_mode) {if (aac_sync_mode)
Greg Kroah-Hartman
maintainerPATCH 59/96 scsi: qla4xxx: skip error recovery in case of register disconnect.
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manish Rangankar <[email protected]>
[ Upstream commit 1bc5ad3a6acdcf56f83272f2de1cd2389ea9e9e2 ]
A system crashes when continuously removing/re-adding the storage controller.
--- drivers/scsi/qla4xxx/ql4_def.h | 2 + drivers/scsi/qla4xxx/ql4_os.c | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
drivers/scsi/qla4xxx/ql4_def.h +2 -0
@@ -168,6 +168,8 @@#define DEV_DB_NON_PERSISTENT 0#define DEV_DB_PERSISTENT 1 +#define QL4_ISP_REG_DISCONNECT 0xffffffffU +#define COPY_ISID (dst_isid, src_isid) { \ int i, j; \ for (i = 0, j = ISID_SIZE - 1; i < ISID_SIZE;) \
drivers/scsi/qla4xxx/ql4_os.c +46 -0
95 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 60/96 scsi: mpt3sas: Do not mark fw_event workqueue as WQ_MEM_RECLAIM
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannes Reinecke <[email protected]>
[ Upstream commit 864449eea7c600596e305ffdc4a6a846414b222c ]
The firmware event workqueue should not be marked as WQ_MEM_RECLAIM as it's doesn't need to make forward progress under memory pressure. In the current state it will result in a deadlock if the device had been forcefully removed.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -1
@@ -8853,7 +8853,7 @@ _scsih_probe(struct pci_dev *pdev, constsnprintf (ioc->firmware_event_name,sizeof (ioc->firmware_event_name),"fw_event_%s%d" , ioc->driver_name, ioc->id); ioc->firmware_event_thread =alloc_ordered_workqueue ( - ioc->firmware_event_name,WQ_MEM_RECLAIM ); + ioc->firmware_event_name,0 );if (!ioc->firmware_event_thread) {pr_err (MPT3SAS_FMT "failure at %s:%d/%s()!\n" , ioc->name, __FILE__, __LINE__, __func__);
Greg Kroah-Hartman
maintainerPATCH 61/96 scsi: sd: Keep disk read-only when re-reading partition
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeremy Cline <[email protected]>
[ Upstream commit 20bd1d026aacc5399464f8328f305985c493cde3 ]
If the read-only flag is true on a SCSI disk, re-reading the partition table sets the flag back to false.
To observe this bug, you can run:
1. blockdev --setro /dev/sda
2. blockdev --rereadpt /dev/sda
3. blockdev --getro /dev/sda
This commit reads the disk's old state and combines it with the device disk-reported state rather than unconditionally marking it as RW.
--- drivers/scsi/sd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/sd.c +2 -1
@@ -2401,6 +2401,7 @@ sd_read_write_protect_flag(struct scsi_dint res;struct scsi_device *sdp = sdkp->device;struct scsi_mode_data data; +int disk_ro =get_disk_ro (sdkp->disk);int old_wp = sdkp->write_prot;set_disk_ro (sdkp->disk,0 );
@@ -2441,7 +2442,7 @@ sd_read_write_protect_flag(struct scsi_d "Test WP failed, assume Write Enabled\n"); }else { sdkp->write_prot = ((data.device_specific &0x80 ) !=0 ); -set_disk_ro (sdkp->disk, sdkp->write_prot); +set_disk_ro (sdkp->disk, sdkp->write_prot || disk_ro);if (sdkp->first_scan || old_wp != sdkp->write_prot) {sd_printk (KERN_NOTICE , sdkp,"Write Protect is %s\n" , sdkp->write_prot ?"on" :"off" );
Greg Kroah-Hartman
maintainerPATCH 62/96 scsi: aacraid: Insure command thread is not recursively stopped
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Carroll <[email protected]>
[ Upstream commit 1c6b41fb92936fa5facea464d5d7cbf855966d04 ]
If a recursive IOP_RESET is invoked, usually due to the eh_thread handling errors after the first reset, be sure we flag that the command thread has been stopped to avoid an Oops of the form;
[ 336.620256] CPU: 28 PID: 1193 Comm: scsi_eh_0 Kdump: loaded Not tainted 4.14.0-49.el7a.ppc64le #1 [ 336.620297] task: c000003fd630b800 task.stack: c000003fd61a4000 [ 336.620326] NIP: c000000000176794 LR: c00000000013038c CTR: c00000000024bc10 [ 336.620361] REGS: c000003fd61a7720 TRAP: 0300 Not tainted (4.14.0-49.el7a.ppc64le) [ 336.620395] MSR: 9000000000009033 <SF,HV,EE,ME,IR,DR,RI,LE> CR: 22084022 XER: 20040000 [ 336.620435] CFAR: c000000000130388 DAR: 0000000000000000 DSISR: 40000000 SOFTE: 1 [ 336.620435] GPR00: c00000000013038c c000003fd61a79a0 c0000000014c7e00 0000000000000000 [ 336.620435] GPR04: 000000000000000c 000000000000000c 9000000000009033 0000000000000477 [ 336.620435] GPR08: 0000000000000477 0000000000000000 0000000000000000 c008000010f7d940 [ 336.620435] GPR12: c00000000024bc10 c000000007a33400 c0000000001708a8 c000003fe3b881d8 [ 336.620435] GPR16: c000003fe3b88060 c000003fd61a7d10 fffffffffffff000 000000000000001e [ 336.620435] GPR20: 0000000000000001 c000000000ebf1a0 0000000000000001 c000003fe3b88000 [ 336.620435] GPR24: 0000000000000003 0000000000000002 c000003fe3b88840 c000003fe3b887e8 [ 336.620435] GPR28: c000003fe3b88000 c000003fc8181788 0000000000000000 c000003fc8181700 [ 336.620750] NIP [c000000000176794] exit_creds+0x34/0x160 [ 336.620775] LR [c00000000013038c] __put_task_struct+0x8c/0x1f0 [ 336.620804] Call Trace: [ 336.620817] [c000003fd61a79a0] [c000003fe3b88000] 0xc000003fe3b88000 (unreliable) [ 336.620853] [c000003fd61a79d0] [c00000000013038c] __put_task_struct+0x8c/0x1f0 [ 336.620889] [c000003fd61a7a00] [c000000000171418] kthread_stop+0x1e8/0x1f0 [ 336.620922] [c000003fd61a7a40] [c008000010f7448c] aac_reset_adapter+0x14c/0x8d0 [aacraid] [ 336.620959] [c000003fd61a7b00] [c008000010f60174] aac_eh_host_reset+0x84/0x100 [aacraid] [ 336.621010] [c000003fd61a7b30] [c000000000864f24] scsi_try_host_reset+0x74/0x180 [ 336.621046] [c000003fd61a7bb0] [c000000000867ac0] scsi_eh_ready_devs+0xc00/0x14d0 [ 336.625165] [c000003fd61a7ca0] [c0000000008699e0] scsi_error_handler+0x550/0x730 [ 336.632101] [c000003fd61a7dc0] [c000000000170a08] kthread+0x168/0x1b0 [ 336.639031] [c000003fd61a7e30] [c00000000000b528] ret_from_kernel_thread+0x5c/0xb4 [ 336.645971] Instruction dump: [ 336.648743] 384216a0 7c0802a6 fbe1fff8 f8010010 f821ffd1 7c7f1b78 60000000 60000000 [ 336.657056] 39400000 e87f0838 f95f0838 7c0004ac <7d401828> 314affff 7d40192d 40c2fff4 [ 336.663997] -[ end trace 4640cf8d4945ad95 ]-
So flag when the thread is stopped by setting the thread pointer to NULL.
--- drivers/scsi/aacraid/commsup.c | 4 +++- drivers/scsi/aacraid/linit.c | 1 + 2 files changed, 4 insertions(+), 1 deletion(-)
drivers/scsi/aacraid/commsup.c +3 -1
@@ -1374,9 +1374,10 @@ static int _aac_reset_adapter(struct aac host = aac->scsi_host_ptr;scsi_block_requests (host);aac_adapter_disable_int (aac); -if (aac->thread->pid != current->pid) { +if (aac->thread && aac->thread->pid != current->pid) {spin_unlock_irq (host->host_lock);kthread_stop (aac->thread); + aac->thread =NULL ; jafo =1 ; }
@@ -1445,6 +1446,7 @@ static int _aac_reset_adapter(struct aac aac->name);if (IS_ERR (aac->thread)) { retval =PTR_ERR (aac->thread); + aac->thread =NULL ; goto out; } }
drivers/scsi/aacraid/linit.c +1 -0
@@ -1083,6 +1083,7 @@ static void __aac_shutdown(struct aac_deup (&fib->event_wait); }kthread_stop (aac->thread); + aac->thread =NULL ; }aac_adapter_disable_int (aac); cpu =cpumask_first (cpu_online_mask);
Greg Kroah-Hartman
maintainerPATCH 63/96 scsi: mvsas: fix wrong endianness of sgpio api
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wilfried Weissmann <[email protected]>
[ Upstream commit e75fba9c0668b3767f608ea07485f48d33c270cf ]
This patch fixes the byte order of the SGPIO api and brings it back in sync with ledmon v0.80 and above.
[mkp: added missing SoB and fixed whitespace]
--- drivers/scsi/mvsas/mv_94xx.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/scsi/mvsas/mv_94xx.c +12 -11
@@ -1080,16 +1080,16 @@ static int mvs_94xx_gpio_write(struct mvvoid __iomem *regs = mvi->regs_ex -0x10200 ;int drive = (i/3 ) & (4 -1 );/* drive number on host */ -u32 block =mr32 (MVS_SGPIO_DCTRL + +int driveshift = drive *8 ;/* bit offset of drive */ +u32 block =ioread32be (regs +MVS_SGPIO_DCTRL +MVS_SGPIO_HOST_OFFSET * mvi->id); -/* * if bit is set then create a mask with the first * bit of the drive set in the mask ... */ -u32 bit = (write_data[i/8 ] & (1 << (i&(8 -1 )))) ? -1 <<(24 -drive*8 ) :0 ; +u32 bit =get_unaligned_be32 (write_data) & (1 << i) ? +1 << driveshift :0 ;/* * ... and then shift it to the right position based
@@ -1098,26 +1098,27 @@ static int mvs_94xx_gpio_write(struct mvswitch (i%3 ) {case 0 :/* activity */ block &= ~((0x7 <<MVS_SGPIO_DCTRL_ACT_SHIFT ) - << (24 -drive*8 )); + << driveshift);/* hardwire activity bit to SOF */ block |=LED_BLINKA_SOF << (MVS_SGPIO_DCTRL_ACT_SHIFT + - (24 -drive*8 )); + driveshift);break ;case 1 :/* id */ block &= ~((0x3 <<MVS_SGPIO_DCTRL_LOC_SHIFT ) - << (24 -drive*8 )); + << driveshift); block |= bit <<MVS_SGPIO_DCTRL_LOC_SHIFT ;break ;case 2 :/* fail */ block &= ~((0x7 <<MVS_SGPIO_DCTRL_ERR_SHIFT ) - << (24 -drive*8 )); + << driveshift); block |= bit <<MVS_SGPIO_DCTRL_ERR_SHIFT ;break ; } -mw32 (MVS_SGPIO_DCTRL +MVS_SGPIO_HOST_OFFSET * mvi->id, - block); +iowrite32be (block, + regs +MVS_SGPIO_DCTRL + +MVS_SGPIO_HOST_OFFSET * mvi->id); }
@@ -1132,7 +1133,7 @@ static int mvs_94xx_gpio_write(struct mvvoid __iomem *regs = mvi->regs_ex -0x10200 ;mw32 (MVS_SGPIO_DCTRL +MVS_SGPIO_HOST_OFFSET * mvi->id, -be32_to_cpu (((u32 *) write_data)[i])); + ((u32 *) write_data)[i]); }return reg_count; }
Greg Kroah-Hartman
maintainerPATCH 64/96 scsi: lpfc: Fix issue_lip if link is disabled
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Smart <[email protected]>
[ Upstream commit 2289e9598dde9705400559ca2606fb8c145c34f0 ]
The driver ignored checks on whether the link should be kept administratively down after a link bounce. Correct the checks.
--- drivers/scsi/lpfc/lpfc_attr.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/scsi/lpfc/lpfc_attr.c +5 -0
@@ -635,7 +635,12 @@ lpfc_issue_lip(struct Scsi_Host *shost)LPFC_MBOXQ_t *pmboxq;int mbxstatus =MBXERR_ERROR ; +/* +* If the link is offline, disabled or BLOCK_MGMT_IO +* it doesn't make any sense to allow issue_lip +*/ if ((vport->fc_flag &FC_OFFLINE_MODE ) || + (phba->hba_flag &LINK_DISABLED ) || (phba->sli.sli_flag &LPFC_BLOCK_MGMT_IO ))return -EPERM ;
Greg Kroah-Hartman
maintainerPATCH 65/96 scsi: lpfc: Fix soft lockup in lpfc worker thread during LIP testing
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Smart <[email protected]>
[ Upstream commit 161df4f09987ae2e9f0f97f0b38eee298b4a39ff ]
During link bounce testing in a point-to-point topology, the host may enter a soft lockup on the lpfc_worker thread:
Call Trace:
lpfc_work_done+0x1f3/0x1390 [lpfc]
lpfc_do_work+0x16f/0x180 [lpfc]
kthread+0xc7/0xe0
ret_from_fork+0x3f/0x70The driver was simultaneously setting a combination of flags that caused lpfc_do_work()to effectively spin between slow path work and new event data, causing the lockup.
Ensure in the typical wq completions, that new event data flags are set if the slow path flag is running. The slow path will eventually reschedule the wq handling.
--- drivers/scsi/lpfc/lpfc_hbadisc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_hbadisc.c +3 -2
@@ -690,8 +690,9 @@ lpfc_work_done(struct lpfc_hba *phba) (phba->hba_flag & HBA_SP_QUEUE_EVT)) {if (pring->flag &LPFC_STOP_IOCB_EVENT ) { pring->flag |=LPFC_DEFERRED_RING_EVENT ; -/* Set the lpfc data pending flag */ -set_bit (LPFC_DATA_READY , &phba->data_flags); +/* Preserve legacy behavior. */ +if (!(phba->hba_flag &HBA_SP_QUEUE_EVT )) +set_bit (LPFC_DATA_READY , &phba->data_flags); }else {if (phba->link_state >=LPFC_LINK_UP ) { pring->flag &= ~LPFC_DEFERRED_RING_EVENT ;
Greg Kroah-Hartman
maintainerPATCH 66/96 scsi: lpfc: Fix frequency of Release WQE CQEs
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Smart <[email protected]>
[ Upstream commit 04673e38f56b30cd39b1fa0f386137d818b17781 ]
The driver controls when the hardware sends completions that communicate consumption of elements from the WQ. This is done by setting a WQEC bit on a WQE.
The current driver sets it on every Nth WQE posting. However, the driver isn't clearing the bit if the WQE is reused. Thus, if the queue depth isn't evenly divisible by N, with enough time, it can be set on every element, creating a lot of overhead and risking CQ full conditions.
Correct by clearing the bit when not setting it on an Nth element.
--- drivers/scsi/lpfc/lpfc_sli.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/lpfc/lpfc_sli.c +2 -0
@@ -116,6 +116,8 @@ lpfc_sli4_wq_put(struct lpfc_queue *q, u/* set consumption flag every once in a while */ if (!((q->host_index +1 ) % q->entry_repost))bf_set (wqe_wqec, &wqe->generic.wqe_com,1 ); +else +bf_set (wqe_wqec, &wqe->generic.wqe_com,0 );if (q->phba->sli3_options &LPFC_SLI4_PHWQ_ENABLED )bf_set (wqe_wqid, &wqe->generic.wqe_com, q->queue_id);lpfc_sli_pcimem_bcopy (wqe, temp_wqe, q->entry_size);
Greg Kroah-Hartman
maintainerPATCH 67/96 ASoC: au1x: Fix timeout tests in au1xac97c_ac97_read()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 123af9043e93cb6f235207d260d50f832cdb5439 ]
The loop timeout doesn't work because it's a post op and ends with "tmo" set to -1. I changed it from a post-op to a pre-op and I changed the initial the starting value from 5 to 6 so we still iterate 5 times. I left the other as it was because it's a large number.
--- sound/soc/au1x/ac97c.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/au1x/ac97c.c +3 -3
@@ -91,8 +91,8 @@ static unsigned short au1xac97c_ac97_rea do { mutex_lock(&ctx->lock); - tmo = 5; - while ((RD(ctx, AC97_STATUS) & STAT_CP) && tmo--) + tmo = 6; + while ((RD(ctx, AC97_STATUS) & STAT_CP) && --tmo) udelay(21); /* wait an ac97 frame time */ if (!tmo) { pr_debug("ac97rd timeout #1\n");
@@ -105,7 +105,7 @@ static unsigned short au1xac97c_ac97_rea* poll, Forrest, poll... */ tmo =0x10000 ; -while ((RD (ctx,AC97_STATUS ) &STAT_CP ) && tmo--) +while ((RD (ctx,AC97_STATUS ) &STAT_CP ) && --tmo) asmvolatile ("nop" ); data =RD (ctx,AC97_CMDRESP );
Greg Kroah-Hartman
maintainerPATCH 68/96 ASoC: topology: create TLV data for dapm widgets
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ranjani Sridharan <[email protected]>
[ Upstream commit bde8b3887add8368ecf0ca71117baf2fd56a6fc9 ]
This patch adds the change required to create the TLV data for dapm widget kcontrols from topology. This also fixes the following TLV read error shown in amixer while showing the card control contents. "amixer: Control hw:1 element TLV read error: No such device or address"
--- sound/soc/soc-topology.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/soc-topology.c +3 -0
@@ -1180,6 +1180,9 @@ static struct snd_kcontrol_new *soc_tplgkfree (sm);continue ; } + +/* create any TLV data */ +soc_tplg_create_tlv (tplg, &kc[i], &mc->hdr); }return kc;
Greg Kroah-Hartman
maintainerPATCH 69/96 ASoC: samsung: i2s: Ensure the RCLK rate is properly determined
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sylwester Nawrocki <[email protected]>
[ Upstream commit 647d04f8e07afc7c3b7a42b3ee01a8b28db29631 ]
If the RCLK mux clock configuration is specified in DT and no set_sysclk() callback is used in the sound card driver the sclk_srcrate field will remain set to 0, leading to an incorrect PSR divider setting.
To fix this the frequency value is retrieved from the CLK_I2S_RCLK_SRC clock, so the actual RCLK mux selection is taken into account.
--- sound/soc/samsung/i2s.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
sound/soc/samsung/i2s.c +11 -2
@@ -642,8 +642,12 @@ static int i2s_set_fmt(struct snd_soc_da tmp |= mod_slave;break ;case SND_SOC_DAIFMT_CBS_CFS : -/* Set default source clock in Master mode */ -if (i2s->rclk_srcrate ==0 ) +/* +* Set default source clock in Master mode, only when the +* CLK_I2S_RCLK_SRC clock is not exposed so we ensure any +* clock configuration assigned in DT is not overwritten. +*/ +if (i2s->rclk_srcrate ==0 && i2s->clk_data.clks ==NULL )i2s_set_sysclk (dai,SAMSUNG_I2S_RCLKSRC_0 ,0 ,SND_SOC_CLOCK_IN );break ;
@@ -858,6 +862,11 @@ static int config_setup(struct i2s_dai *return 0 ;if (!(i2s->quirks &QUIRK_NO_MUXPSR )) { +struct clk *rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC ]; + +if (i2s->rclk_srcrate ==0 && rclksrc && !IS_ERR (rclksrc)) + i2s->rclk_srcrate =clk_get_rate (rclksrc); + psr = i2s->rclk_srcrate / i2s->frmclk / rfs;writel (((psr -1 ) <<8 ) |PSR_PSREN , i2s->addr +I2SPSR ); dev_dbg(&i2s->pdev->dev,
Greg Kroah-Hartman
maintainerPATCH 70/96 clk: rockchip: Fix wrong parent for SDMMC phase clock for rk3228
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Lin <[email protected]>
[ Upstream commit 4b0556a441dd37e598887215bc89b49a6ef525b3 ]
commit c420c1e4db22 ("clk: rockchip: Prevent calculating mmc phase if clock rate is zero") catches one gremlin again for clk-rk3228.c that the parent of SDMMC phase clock should be sclk_sdmmc0, but not sclk_sdmmc. However, the naming of the sdmmc clocks varies in the manual with the card clock having the 0 while the hclk is named without appended 0. So standardize one one format to prevent confusion, as there also is only one (non-sdio) mmc controller on the soc.
--- drivers/clk/rockchip/clk-rk3228.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/rockchip/clk-rk3228.c +1 -1
@@ -369,7 +369,7 @@ static struct rockchip_clk_branch rk3228 RK2928_CLKSEL_CON(23), 5, 2, MFLAGS, 0, 6, DFLAGS, RK2928_CLKGATE_CON(2), 15, GFLAGS), -COMPOSITE (SCLK_SDMMC ,"sclk_sdmmc0" , mux_mmc_src_p,0 , +COMPOSITE (SCLK_SDMMC ,"sclk_sdmmc" , mux_mmc_src_p,0 ,RK2928_CLKSEL_CON (11 ),8 ,2 ,MFLAGS ,0 ,8 ,DFLAGS , RK2928_CLKGATE_CON(2), 11, GFLAGS),
Greg Kroah-Hartman
maintainerPATCH 71/96 clk: Dont show the incorrect clock phase
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Lin <[email protected]>
[ Upstream commit 1f9c63e8de3d7b377c9d74e4a17524cfb60e6384 ]
It's found that the clock phase output from clk_summary is wrong compared to the actual phase reading from the register.
cat /sys/kernel/debug/clk/clk_summary | grep sdio_samplesdio_sample 0 1 0 50000000 0 -22
It exposes an issue that clk core, clk_core_get_phase, always returns the cached core->phase which should be either updated by calling clk_set_phase or directly from the first place the clk was registered.
When registering the clk, the core->phase geting from ->get_phase() may return negative value indicating error. This is quite common since the clk's phase may be highly related to its parent chain, but it was temporarily orphan when registered, since its parent chains hadn't be ready at that time, so the clk drivers decide to return error in this case. However, if no clk_set_phase is called or maybe the ->set_phase() isn't even implemented, the core->phase would never be updated. This is wrong, and we should try to update it when all its parent chains are settled down, like the way of updating clock rate for that. But it's not deserved to complicate the code now and just update it anyway when calling clk_core_get_phase, which would be much simple and enough.
--- drivers/clk/clk.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/clk.c +3 -0
@@ -1929,6 +1929,9 @@ static int clk_core_get_phase(struct clkint ret;clk_prepare_lock (); +/* Always try to update cached phase if possible */ +if (core->ops->get_phase) + core->phase = core->ops->get_phase (core->hw); ret = core->phase;clk_prepare_unlock ();
Greg Kroah-Hartman
maintainerPATCH 72/96 clk: tegra: Fix pll_u rate configuration
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcel Ziswiler <[email protected]>
[ Upstream commit c35b518f9ba06c9de79fb3ff62eed7462d804995 ]
Turns out latest upstream U-Boot does not configure/enable pll_u which leaves it at some default rate of 500 kHz:
root@apalis-t30:~# cat /sys/kernel/debug/clk/clk_summary | grep pll_u
pll_u 3 3 0 500000 0Of course this won't quite work leading to the following messages:
[ 6.559593] usb 2-1: new full-speed USB device number 2 using tegra- ehci [ 11.759173] usb 2-1: device descriptor read/64, error -110 [ 27.119453] usb 2-1: device descriptor read/64, error -110 [ 27.389217] usb 2-1: new full-speed USB device number 3 using tegra- ehci [ 32.559454] usb 2-1: device descriptor read/64, error -110 [ 47.929777] usb 2-1: device descriptor read/64, error -110 [ 48.049658] usb usb2-port1: attempt power cycle [ 48.759475] usb 2-1: new full-speed USB device number 4 using tegra- ehci [ 59.349457] usb 2-1: device not accepting address 4, error -110 [ 59.509449] usb 2-1: new full-speed USB device number 5 using tegra- ehci [ 70.069457] usb 2-1: device not accepting address 5, error -110 [ 70.079721] usb usb2-port1: unable to enumerate USB device
Fix this by actually allowing the rate also being set from within the Linux kernel.
--- drivers/clk/tegra/clk-pll.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/clk/tegra/clk-pll.c +2 -0
@@ -1145,6 +1145,8 @@ static const struct clk_ops tegra_clk_pl .enable = clk_pllu_enable, .disable = clk_pll_disable, .recalc_rate = clk_pll_recalc_rate, + .round_rate = clk_pll_round_rate, + .set_rate = clk_pll_set_rate, }; static int _pll_fixed_mdiv(struct tegra_clk_pll_params *pll_params,
Greg Kroah-Hartman
maintainerPATCH 73/96 media: cx23885: Set subdev host data to clk_freq pointer
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brad Love <[email protected]>
[ Upstream commit 5ceade1d97fc6687e050c44c257382c192f56276 ]
Currently clk_freq is ignored entirely, because the cx235840 driver configures the xtal at the chip defaults. This is an issue if a board is produced with a non-default frequency crystal. If clk_freq is not zero the cx25840 will attempt to use the setting provided, or fall back to defaults otherwise.
--- drivers/media/pci/cx23885/cx23885-cards.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/pci/cx23885/cx23885-cards.c +4 -0
@@ -2282,6 +2282,10 @@ void cx23885_card_setup(struct cx23885_d &dev->i2c_bus[2 ].i2c_adap, "cx25840", 0x88 >> 1, NULL);if (dev->sd_cx25840) { +/* set host data for clk_freq configuration */ +v4l2_set_subdev_hostdata (dev->sd_cx25840, + &dev->clk_freq); + dev->sd_cx25840->grp_id =CX23885_HW_AV_CORE ;v4l2_subdev_call (dev->sd_cx25840, core, load_fw); }
Greg Kroah-Hartman
maintainerPATCH 74/96 clk: rockchip: Prevent calculating mmc phase if clock rate is zero
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Lin <[email protected]>
[ Upstream commit 4bf59902b50012b1dddeeaa23b217d9c4956cdda ]
The MMC sample and drv clock for rockchip platforms are derived from the bus clock output to the MMC/SDIO card. So it should never happens that the clk rate is zero given it should inherits the clock rate from its parent. If something goes wrong and makes the clock rate to be zero, the calculation would be wrong but may still make the mmc tuning process work luckily. However it makes people harder to debug when the following data transfer is unstable.
--- drivers/clk/rockchip/clk-mmc-phase.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/clk/rockchip/clk-mmc-phase.c +23 -0
@@ -58,6 +58,12 @@ static int rockchip_mmc_get_phase(structu16 degrees;u32 delay_num =0 ; +/* See the comment for rockchip_mmc_set_phase below */ +if (!rate) { +pr_err ("%s: invalid clk rate\n" , __func__); +return -EINVAL ; + } + raw_value =readl (mmc_clock->reg) >> (mmc_clock->shift); degrees = (raw_value &ROCKCHIP_MMC_DEGREE_MASK ) *90 ;
@@ -84,6 +90,23 @@ static int rockchip_mmc_set_phase(structu32 raw_value;u32 delay; +/* +* The below calculation is based on the output clock from +* MMC host to the card, which expects the phase clock inherits +* the clock rate from its parent, namely the output clock +* provider of MMC host. However, things may go wrong if +* (1) It is orphan. +* (2) It is assigned to the wrong parent. +* +* This check help debug the case (1), which seems to be the +* most likely problem we often face and which makes it difficult +* for people to debug unstable mmc tuning results. +*/ +if (!rate) { +pr_err ("%s: invalid clk rate\n" , __func__); +return -EINVAL ; + } + nineties = degrees /90 ; remainder = (degrees %90 );
Greg Kroah-Hartman
maintainerPATCH 75/96 clk: samsung: s3c2410: Fix PLL rates
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Hajda <[email protected]>
[ Upstream commit 179db533c08431f509a3823077549773d519358b ]
Rates declared in PLL rate tables should match exactly rates calculated from the PLL coefficients. If that is not the case, rate of the PLL's child clock might be set not as expected. For instance, if in the PLL rates table we have a 393216000 Hz entry and the real value as returned by the PLL's recalc_rate callback is 393216003, after setting PLL's clk rate to 393216000 clk_get_rate will return 393216003. If we now attempt to set rate of a PLL's child divider clock to 393216000/2 its rate will be 131072001, rather than 196608000. That is, the divider will be set to 3 instead of 2, because 393216003/2 is greater than 196608000.
To fix this issue declared rates are changed to exactly match rates generated by the PLL, as calculated from the P, M, S, K coefficients.
--- drivers/clk/samsung/clk-s3c2410.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/clk/samsung/clk-s3c2410.c +8 -8
@@ -168,7 +168,7 @@ static struct samsung_pll_rate_table pllPLL_35XX_RATE (226000000 ,105 ,1 ,1 ),PLL_35XX_RATE (210000000 ,132 ,2 ,1 ),/* 2410 common */ -PLL_35XX_RATE (203000000 ,161 ,3 ,1 ), +PLL_35XX_RATE (202800000 ,161 ,3 ,1 ),PLL_35XX_RATE (192000000 ,88 ,1 ,1 ),PLL_35XX_RATE (186000000 ,85 ,1 ,1 ), PLL_35XX_RATE(180000000, 82, 1, 1),
@@ -178,18 +178,18 @@ static struct samsung_pll_rate_table pllPLL_35XX_RATE (147000000 ,90 ,2 ,1 ),PLL_35XX_RATE (135000000 ,82 ,2 ,1 ),PLL_35XX_RATE (124000000 ,116 ,1 ,2 ), -PLL_35XX_RATE (118000000 ,150 ,2 ,2 ), +PLL_35XX_RATE (118500000 ,150 ,2 ,2 ),PLL_35XX_RATE (113000000 ,105 ,1 ,2 ), -PLL_35XX_RATE (101000000 ,127 ,2 ,2 ), +PLL_35XX_RATE (101250000 ,127 ,2 ,2 ),PLL_35XX_RATE (90000000 ,112 ,2 ,2 ), -PLL_35XX_RATE (85000000 ,105 ,2 ,2 ), +PLL_35XX_RATE (84750000 ,105 ,2 ,2 ),PLL_35XX_RATE (79000000 ,71 ,1 ,2 ), -PLL_35XX_RATE (68000000 ,82 ,2 ,2 ), -PLL_35XX_RATE (56000000 ,142 ,2 ,3 ), +PLL_35XX_RATE (67500000 ,82 ,2 ,2 ), +PLL_35XX_RATE (56250000 ,142 ,2 ,3 ),PLL_35XX_RATE (48000000 ,120 ,2 ,3 ), -PLL_35XX_RATE (51000000 ,161 ,3 ,3 ), +PLL_35XX_RATE (50700000 ,161 ,3 ,3 ),PLL_35XX_RATE (45000000 ,82 ,1 ,3 ), - PLL_35XX_RATE(34000000, 82, 2, 3), + PLL_35XX_RATE(33750000, 82, 2, 3), { /* sentinel */ }, };
Greg Kroah-Hartman
maintainerPATCH 76/96 clk: samsung: exynos7: Fix PLL rates
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Hajda <[email protected]>
[ Upstream commit 7e4db0c2836e892766565965207eee051c8037b9 ]
Rates declared in PLL rate tables should match exactly rates calculated from the PLL coefficients. If that is not the case, rate of the PLL's child clock might be set not as expected. For instance, if in the PLL rates table we have a 393216000 Hz entry and the real value as returned by the PLL's recalc_rate callback is 393216003, after setting PLL's clk rate to 393216000 clk_get_rate will return 393216003. If we now attempt to set rate of a PLL's child divider clock to 393216000/2 its rate will be 131072001, rather than 196608000. That is, the divider will be set to 3 instead of 2, because 393216003/2 is greater than 196608000.
To fix this issue declared rates are changed to exactly match rates generated by the PLL, as calculated from the P, M, S, K coefficients.
--- drivers/clk/samsung/clk-exynos7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/samsung/clk-exynos7.c +1 -1
@@ -140,7 +140,7 @@ static const struct samsung_div_clock to };static const struct samsung_pll_rate_table pll1460x_24mhz_tbl[]__initconst = { -PLL_36XX_RATE (491520000 ,20 ,1 ,0 ,31457 ), +PLL_36XX_RATE (491519897 ,20 ,1 ,0 ,31457 ), {}, };
Greg Kroah-Hartman
maintainerPATCH 77/96 clk: samsung: exynos5260: Fix PLL rates
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Hajda <[email protected]>
[ Upstream commit cdb68fbd4e7962be742c4f29475220c5bf28d8a5 ]
Rates declared in PLL rate tables should match exactly rates calculated from the PLL coefficients. If that is not the case, rate of the PLL's child clock might be set not as expected. For instance, if in the PLL rates table we have a 393216000 Hz entry and the real value as returned by the PLL's recalc_rate callback is 393216003, after setting PLL's clk rate to 393216000 clk_get_rate will return 393216003. If we now attempt to set rate of a PLL's child divider clock to 393216000/2 its rate will be 131072001, rather than 196608000. That is, the divider will be set to 3 instead of 2, because 393216003/2 is greater than 196608000.
To fix this issue declared rates are changed to exactly match rates generated by the PLL, as calculated from the P, M, S, K coefficients.
--- drivers/clk/samsung/clk-exynos5260.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/samsung/clk-exynos5260.c +1 -1
@@ -65,7 +65,7 @@ static const struct samsung_pll_rate_tabPLL_36XX_RATE (480000000 ,160 ,2 ,2 ,0 ),PLL_36XX_RATE (432000000 ,144 ,2 ,2 ,0 ),PLL_36XX_RATE (400000000 ,200 ,3 ,2 ,0 ), -PLL_36XX_RATE (394073130 ,459 ,7 ,2 ,49282 ), +PLL_36XX_RATE (394073128 ,459 ,7 ,2 ,49282 ),PLL_36XX_RATE (333000000 ,111 ,2 ,2 ,0 ),PLL_36XX_RATE (300000000 ,100 ,2 ,2 ,0 ), PLL_36XX_RATE(266000000, 266, 3, 3, 0),
Greg Kroah-Hartman
maintainerPATCH 78/96 clk: samsung: exynos5433: Fix PLL rates
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Hajda <[email protected]>
[ Upstream commit ab0447845cffc0fd752df2ccd6b4e34006000ce4 ]
Rates declared in PLL rate tables should match exactly rates calculated from the PLL coefficients. If that is not the case, rate of the PLL's child clock might be set not as expected. For instance, if in the PLL rates table we have a 393216000 Hz entry and the real value as returned by the PLL's recalc_rate callback is 393216003, after setting PLL's clk rate to 393216000 clk_get_rate will return 393216003. If we now attempt to set rate of a PLL's child divider clock to 393216000/2 its rate will be 131072001, rather than 196608000. That is, the divider will be set to 3 instead of 2, because 393216003/2 is greater than 196608000.
To fix this issue declared rates are changed to exactly match rates generated by the PLL, as calculated from the P, M, S, K coefficients.
--- drivers/clk/samsung/clk-exynos5433.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/clk/samsung/clk-exynos5433.c +6 -6
@@ -725,7 +725,7 @@ static const struct samsung_pll_rate_tabPLL_35XX_RATE (800000000U ,400 ,6 ,1 ),PLL_35XX_RATE (733000000U ,733 ,12 ,1 ),PLL_35XX_RATE (700000000U ,175 ,3 ,1 ), -PLL_35XX_RATE (667000000U ,222 ,4 ,1 ), +PLL_35XX_RATE (666000000U ,222 ,4 ,1 ),PLL_35XX_RATE (633000000U ,211 ,4 ,1 ),PLL_35XX_RATE (600000000U ,500 ,5 ,2 ), PLL_35XX_RATE(552000000U, 460, 5, 2),
@@ -751,12 +751,12 @@ static const struct samsung_pll_rate_tab/* AUD_PLL */ static const struct samsung_pll_rate_table exynos5443_aud_pll_rates[]__initconst = {PLL_36XX_RATE (400000000U ,200 ,3 ,2 ,0 ), -PLL_36XX_RATE (393216000U ,197 ,3 ,2 ,-25690 ), +PLL_36XX_RATE (393216003U ,197 ,3 ,2 ,-25690 ),PLL_36XX_RATE (384000000U ,128 ,2 ,2 ,0 ), -PLL_36XX_RATE (368640000U ,246 ,4 ,2 ,-15729 ), -PLL_36XX_RATE (361507200U ,181 ,3 ,2 ,-16148 ), -PLL_36XX_RATE (338688000U ,113 ,2 ,2 ,-6816 ), -PLL_36XX_RATE (294912000U ,98 ,1 ,3 ,19923 ), +PLL_36XX_RATE (368639991U ,246 ,4 ,2 ,-15729 ), +PLL_36XX_RATE (361507202U ,181 ,3 ,2 ,-16148 ), +PLL_36XX_RATE (338687988U ,113 ,2 ,2 ,-6816 ), +PLL_36XX_RATE (294912002U ,98 ,1 ,3 ,19923 ),PLL_36XX_RATE (288000000U ,96 ,1 ,3 ,0 ),PLL_36XX_RATE (252000000U ,84 ,1 ,3 ,0 ), {/* sentinel */ }
Greg Kroah-Hartman
maintainerPATCH 79/96 clk: samsung: exynos5250: Fix PLL rates
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Hajda <[email protected]>
[ Upstream commit 2ac051eeabaa411ef89ae7cd5bb8e60cb41ad780 ]
Rates declared in PLL rate tables should match exactly rates calculated from PLL coefficients. If that is not the case, rate of the PLL's child clock might be set not as expected. For instance, if in the PLL rates table we have a 393216000 Hz entry and the real value as returned by the PLL's recalc_rate callback is 393216003, after setting PLL's clk rate to 393216000 clk_get_rate will return 393216003. If we now attempt to set rate of a PLL's child divider clock to 393216000/2 its rate will be 131072001, rather than 196608000. That is, the divider will be set to 3 instead of 2, because 393216003/2 is greater than 196608000.
To fix this issue declared rates are changed to exactly match rates generated by the PLL, as calculated from the P, M, S, K coefficients.
--- drivers/clk/samsung/clk-exynos5250.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/clk/samsung/clk-exynos5250.c +4 -4
@@ -711,13 +711,13 @@ static const struct samsung_pll_rate_tab/* sorted in descending order */ /* PLL_36XX_RATE(rate, m, p, s, k) */ PLL_36XX_RATE (192000000 ,64 ,2 ,2 ,0 ), -PLL_36XX_RATE (180633600 ,90 ,3 ,2 ,20762 ), +PLL_36XX_RATE (180633605 ,90 ,3 ,2 ,20762 ),PLL_36XX_RATE (180000000 ,90 ,3 ,2 ,0 ),PLL_36XX_RATE (73728000 ,98 ,2 ,4 ,19923 ), -PLL_36XX_RATE (67737600 ,90 ,2 ,4 ,20762 ), +PLL_36XX_RATE (67737602 ,90 ,2 ,4 ,20762 ),PLL_36XX_RATE (49152000 ,98 ,3 ,4 ,19923 ), -PLL_36XX_RATE (45158400 ,90 ,3 ,4 ,20762 ), - PLL_36XX_RATE(32768000, 131, 3, 5, 4719), +PLL_36XX_RATE (45158401 ,90 ,3 ,4 ,20762 ), + PLL_36XX_RATE(32768001, 131, 3, 5, 4719), { }, };
Greg Kroah-Hartman
maintainerPATCH 80/96 clk: samsung: exynos3250: Fix PLL rates
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrzej Hajda <[email protected]>
[ Upstream commit a8321e7887410a2b2e80ab89d1ef7b30562658ea ]
Rates declared in PLL rate tables should match exactly rates calculated from PLL coefficients. If that is not the case, rate of the PLL's child clock might be set not as expected. For instance, if in the PLL rates table we have a 393216000 Hz entry and the real value as returned by the PLL's recalc_rate callback is 393216003, after setting PLL's clk rate to 393216000 clk_get_rate will return 393216003. If we now attempt to set rate of a PLL's child divider clock to 393216000/2 its rate will be 131072001, rather than 196608000. That is, the divider will be set to 3 instead of 2, because 393216003/2 is greater than 196608000.
To fix this issue declared rates are changed to exactly match rates generated by the PLL, as calculated from the P, M, S, K coefficients.
In this patch an erroneous P value for 74176002 output frequency is also corrected.
--- drivers/clk/samsung/clk-exynos3250.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/samsung/clk-exynos3250.c +2 -2
@@ -698,7 +698,7 @@ static const struct samsung_pll_rate_tabPLL_36XX_RATE (144000000 ,96 ,2 ,3 ,0 ),PLL_36XX_RATE (96000000 ,128 ,2 ,4 ,0 ),PLL_36XX_RATE (84000000 ,112 ,2 ,4 ,0 ), -PLL_36XX_RATE (80000004 ,106 ,2 ,4 ,43691 ), +PLL_36XX_RATE (80000003 ,106 ,2 ,4 ,43691 ),PLL_36XX_RATE (73728000 ,98 ,2 ,4 ,19923 ),PLL_36XX_RATE (67737598 ,270 ,3 ,5 ,62285 ), PLL_36XX_RATE( 65535999, 174, 2, 5, 49982),
@@ -734,7 +734,7 @@ static const struct samsung_pll_rate_tabPLL_36XX_RATE (148352005 ,98 ,2 ,3 ,59070 ),PLL_36XX_RATE (108000000 ,144 ,2 ,4 ,0 ),PLL_36XX_RATE (74250000 ,99 ,2 ,4 ,0 ), -PLL_36XX_RATE (74176002 ,98 ,3 ,4 ,59070 ), +PLL_36XX_RATE (74176002 ,98 ,2 ,4 ,59070 ),PLL_36XX_RATE (54054000 ,216 ,3 ,5 ,14156 ), PLL_36XX_RATE( 54000000, 144, 2, 5, 0), { /* sentinel */ }
Greg Kroah-Hartman
maintainerPATCH 81/96 media: dmxdev: fix error code for invalid ioctls
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit a145f64c6107d3aa5a7cec9f8977d04ac2a896c9 ]
Returning -EINVAL when an ioctl is not implemented is a very bad idea, as it is hard to distinguish from other error contitions that an ioctl could lead. Replace it by its right error code: -ENOTTY.
--- drivers/media/dvb-core/dmxdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/dvb-core/dmxdev.c +1 -1
@@ -1071,7 +1071,7 @@ static int dvb_demux_do_ioctl(struct filbreak ;default : - ret = -EINVAL ; + ret = -ENOTTY ;break ; }mutex_unlock (&dmxdev->mutex);
Greg Kroah-Hartman
maintainerPATCH 82/96 media: cx23885: Override 888 ImpactVCBe crystal frequency
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brad Love <[email protected]>
[ Upstream commit 779c79d4b833ec646b0aed878da38edb45bbe156 ]
Hauppauge produced a revision of ImpactVCBe using an 888, with a 25MHz crystal, instead of using the default third overtone 50Mhz crystal. This overrides that frequency so that the cx25840 is properly configured. Without the proper crystal setup the cx25840 cannot load the firmware or decode video.
--- drivers/media/pci/cx23885/cx23885-core.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/media/pci/cx23885/cx23885-core.c +10 -0
@@ -872,6 +872,16 @@ static int cx23885_dev_setup(struct cx23if (cx23885_boards[dev->board].clk_freq >0 ) dev->clk_freq = cx23885_boards[dev->board].clk_freq; +if (dev->board ==CX23885_BOARD_HAUPPAUGE_IMPACTVCBE && + dev->pci->subsystem_device ==0x7137 ) { +/* Hauppauge ImpactVCBe device ID 0x7137 is populated +* with an 888, and a 25Mhz crystal, instead of the +* usual third overtone 50Mhz. The default clock rate must +* be overridden so the cx25840 is properly configured +*/ + dev->clk_freq =25000000 ; + } + dev->pci_bus = dev->pci->bus->number; dev->pci_slot =PCI_SLOT (dev->pci->devfn);cx23885_irq_add (dev,0x001f00 );
Greg Kroah-Hartman
maintainerPATCH 83/96 media: s3c-camif: fix out-of-bounds array access
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit a398e043637a4819a0e96467bfecaabf3224dd62 ]
While experimenting with older compiler versions, I ran into a warning that no longer shows up on gcc-4.8 or newer:
drivers/media/platform/s3c-camif/camif-capture.c: In function '__camif_subdev_try_format':drivers/media/platform/s3c-camif/camif-capture.c:1265:25: error: array subscript is below array bounds
This is an off-by-one bug, leading to an access before the start of the array, while newer compilers silently assume this undefined behavior cannot happen and leave the loop at index 0 if no other entry matches.
As Sylvester explains, we actually need to ensure that the value is within the range, so this reworks the loop to be easier to parse correctly, and an additional check to fall back on the first format value for any unexpected input.
I found an existing gcc bug for it and added a reduced version of the function there.
--- drivers/media/platform/s3c-camif/camif-capture.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/media/platform/s3c-camif/camif-capture.c +4 -3
@@ -1256,16 +1256,17 @@ static void __camif_subdev_try_format(st {const struct s3c_camif_variant *variant = camif->variant;const struct vp_pix_limits *pix_lim; -int i =ARRAY_SIZE (camif_mbus_formats); +unsigned int i;/* FIXME: constraints against codec or preview path ? */ pix_lim = &variant->vp_pix_limits[VP_CODEC ]; -while (i-- >=0 ) +for (i =0 ; i <ARRAY_SIZE (camif_mbus_formats); i++)if (camif_mbus_formats[i] == mf->code)break ; - mf->code = camif_mbus_formats[i]; +if (i ==ARRAY_SIZE (camif_mbus_formats)) + mf->code = camif_mbus_formats[0 ];if (pad ==CAMIF_SD_PAD_SINK ) { v4l_bound_align_image(&mf->width, 8, CAMIF_MAX_PIX_WIDTH,
Greg Kroah-Hartman
maintainerPATCH 84/96 media: vb2: Fix videobuf2 to map correct area
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masami Hiramatsu <[email protected]>
[ Upstream commit d13a0139d7874a0577b5955d6eed895517d23b72 ]
Fixes vb2_vmalloc_get_userptr() to ioremap correct area. Since the current code does ioremap the page address, if the offset > 0, it does not do ioremap the last page and results in kernel panic.
This fixes to pass the size + offset to ioremap so that ioremap can map correct area. Also, this uses __pfn_to_phys() to get the physical address of given PFN.
--- drivers/media/v4l2-core/videobuf2-vmalloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/v4l2-core/videobuf2-vmalloc.c +1 -1
@@ -104,7 +104,7 @@ static void *vb2_vmalloc_get_userptr(strif (nums[i-1 ] +1 != nums[i]) goto fail_map; buf->vaddr = (__force void *) -ioremap_nocache (nums[0 ] <<PAGE_SHIFT , size); +ioremap_nocache (__pfn_to_phys (nums[0 ]), size + offset); }else { buf->vaddr =vm_map_ram (frame_vector_pages (vec), n_pages,-1 ,PAGE_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 85/96 media: vivid: fix incorrect capabilities for radio
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Verkuil <[email protected]>
[ Upstream commit 65243386f41d38460bfd4375d231a7c0346d0401 ]
The vivid driver has two custom controls that change the behavior of RDS. Depending on the control setting the V4L2_CAP_READWRITE capability is toggled. However, after an earlier commit the capability was no longer set correctly. This is now fixed.
--- drivers/media/platform/vivid/vivid-ctrls.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/platform/vivid/vivid-ctrls.c +2 -0
@@ -1167,6 +1167,7 @@ static int vivid_radio_rx_s_ctrl(structv4l2_ctrl_activate (dev->radio_rx_rds_ta, dev->radio_rx_rds_controls);v4l2_ctrl_activate (dev->radio_rx_rds_tp, dev->radio_rx_rds_controls);v4l2_ctrl_activate (dev->radio_rx_rds_ms, dev->radio_rx_rds_controls); + dev->radio_rx_dev.device_caps = dev->radio_rx_caps;break ;case V4L2_CID_RDS_RECEPTION : dev->radio_rx_rds_enabled = ctrl->val;
@@ -1241,6 +1242,7 @@ static int vivid_radio_tx_s_ctrl(struct dev->radio_tx_caps &= ~V4L2_CAP_READWRITE ;if (!dev->radio_tx_rds_controls) dev->radio_tx_caps |=V4L2_CAP_READWRITE ; + dev->radio_tx_dev.device_caps = dev->radio_tx_caps;break ;case V4L2_CID_RDS_TX_PTY :if (dev->radio_rx_rds_controls)
Greg Kroah-Hartman
maintainerPATCH 86/96 media: cx25821: prevent out-of-bounds read on array card
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit 67300abdbe9f1717532aaf4e037222762716d0f6 ]
Currently an out of range dev->nr is detected by just reporting the issue and later on an out-of-bounds read on array card occurs because of this. Fix this by checking the upper range of dev->nr with the size of array card (removes the hard coded size), move this check earlier and also exit with the error -ENOSYS to avoid the later out-of-bounds array read.
Detected by CoverityScan, CID#711191 ("Out-of-bounds-read")
--- drivers/media/pci/cx25821/cx25821-core.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/media/pci/cx25821/cx25821-core.c +4 -3
@@ -871,6 +871,10 @@ static int cx25821_dev_setup(struct cx25 dev->nr = ++cx25821_devcount;sprintf (dev->name,"cx25821[%d]" , dev->nr); +if (dev->nr >=ARRAY_SIZE (card)) { +CX25821_INFO ("dev->nr >= %zd" ,ARRAY_SIZE (card)); +return -ENODEV ; + }if (dev->pci->device !=0x8210 ) {pr_info ("%s(): Exiting. Incorrect Hardware device = 0x%02x\n" , __func__, dev->pci->device);
@@ -886,9 +890,6 @@ static int cx25821_dev_setup(struct cx25 dev->channels[i].sram_channels = &cx25821_sram_channels[i]; } -if (dev->nr >1 ) -CX25821_INFO ("dev->nr > 1!" ); -/* board config */ dev->board =1 ;/* card[dev->nr]; */ dev->_max_num_decoders =MAX_DECODERS ;
Greg Kroah-Hartman
maintainerPATCH 87/96 serial: xuartps: Fix out-of-bounds access through DT alias
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit e7d75e18d0fc3f7193b65282b651f980c778d935 ]
The cdns_uart_port[] array is indexed using a value derived from the "serialN" alias in DT, which may lead to an out-of-bounds access.
Fix this by adding a range check.
--- drivers/tty/serial/xilinx_uartps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/xilinx_uartps.c +1 -1
@@ -1106,7 +1106,7 @@ static struct uart_port *cdns_uart_get_pstruct uart_port *port;/* Try the given port id if failed use default method */ -if (cdns_uart_port[id].mapbase !=0 ) { +if (id <CDNS_UART_NR_PORTS && cdns_uart_port[id].mapbase !=0 ) {/* Find the next unused port */ for (id =0 ; id <CDNS_UART_NR_PORTS ; id++)if (cdns_uart_port[id].mapbase ==0 )
Greg Kroah-Hartman
maintainerPATCH 88/96 serial: samsung: Fix out-of-bounds access through serial port index
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 49ee23b71877831ac087d6083f6f397dc19c9664 ]
The s3c24xx_serial_ports[] array is indexed using a value derived from the "serialN" alias in DT, or from an incrementing probe index, which may lead to an out-of-bounds access.
Fix this by adding a range check.
Note that the array size is defined by a Kconfig symbol (CONFIG_SERIAL_SAMSUNG_UARTS), so this can even be triggered using a legitimate DTB or legitimate board code.
--- drivers/tty/serial/samsung.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/serial/samsung.c +4 -0
@@ -1813,6 +1813,10 @@ static int s3c24xx_serial_probe(struct pdbg ("s3c24xx_serial_probe(%p) %d\n" , pdev, index); +if (index >=ARRAY_SIZE (s3c24xx_serial_ports)) { +dev_err (&pdev->dev,"serial%d out of range\n" , index); +return -EINVAL ; + } ourport = &s3c24xx_serial_ports[index]; ourport->drv_data =s3c24xx_get_driver_data (pdev);
Greg Kroah-Hartman
maintainerPATCH 89/96 serial: mxs-auart: Fix out-of-bounds access through serial port index
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit dd345a31bfdec350d2593e6de5964e55c7f19c76 ]
The auart_port[] array is indexed using a value derived from the "serialN" alias in DT, or from platform data, which may lead to an out-of-bounds access.
Fix this by adding a range check.
--- drivers/tty/serial/mxs-auart.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/serial/mxs-auart.c +4 -0
@@ -1664,6 +1664,10 @@ static int mxs_auart_probe(struct platfo s->port.line = pdev->id <0 ?0 : pdev->id; else if (ret < 0) return ret; + if (s->port.line >= ARRAY_SIZE(auart_port)) { +dev_err (&pdev->dev,"serial%d out of range\n" , s->port.line); +return -EINVAL ; + }if (of_id) { pdev->id_entry = of_id->data;
Greg Kroah-Hartman
maintainerPATCH 90/96 serial: imx: Fix out-of-bounds access through serial port index
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 5673444821406dda5fc25e4b52aca419f8065a19 ]
The imx_ports[] array is indexed using a value derived from the "serialN" alias in DT, or from platform data, which may lead to an out-of-bounds access.
Fix this by adding a range check.
--- drivers/tty/serial/imx.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/tty/serial/imx.c +6 -0
@@ -2080,6 +2080,12 @@ static int serial_imx_probe(struct platfelse if (ret <0 )return ret; +if (sport->port.line >=ARRAY_SIZE (imx_ports)) { +dev_err (&pdev->dev,"serial%d out of range\n" , + sport->port.line); +return -EINVAL ; + } + res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); base =devm_ioremap_resource (&pdev->dev, res);if (IS_ERR (base))
Greg Kroah-Hartman
maintainerPATCH 91/96 serial: fsl_lpuart: Fix out-of-bounds access through DT alias
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit ffab87fdecc655cc676f8be8dd1a2c5e22bd6d47 ]
The lpuart_ports[] array is indexed using a value derived from the "serialN" alias in DT, which may lead to an out-of-bounds access.
Fix this by adding a range check.
--- drivers/tty/serial/fsl_lpuart.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/serial/fsl_lpuart.c +4 -0
@@ -1902,6 +1902,10 @@ static int lpuart_probe(struct platform_dev_err (&pdev->dev,"failed to get alias id, errno %d\n" , ret);return ret; } +if (ret >=ARRAY_SIZE (lpuart_ports)) { +dev_err (&pdev->dev,"serial%d out of range\n" , ret); +return -EINVAL ; + } sport->port.line = ret; sport->lpuart32 =of_device_is_compatible (np,"fsl,ls1021a-lpuart" );
Greg Kroah-Hartman
maintainerPATCH 92/96 serial: arc_uart: Fix out-of-bounds access through DT alias
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit f9f5786987e81d166c60833edcb7d1836aa16944 ]
The arc_uart_ports[] array is indexed using a value derived from the "serialN" alias in DT, which may lead to an out-of-bounds access.
Fix this by adding a range check.
Note that the array size is defined by a Kconfig symbol (CONFIG_SERIAL_ARC_NR_PORTS), so this can even be triggered using a legitimate DTB.
--- drivers/tty/serial/arc_uart.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/tty/serial/arc_uart.c +5 -0
@@ -596,6 +596,11 @@ static int arc_serial_probe(struct platfif (dev_id <0 ) dev_id =0 ; +if (dev_id >=ARRAY_SIZE (arc_uart_ports)) { +dev_err (&pdev->dev,"serial%d out of range\n" , dev_id); +return -EINVAL ; + } + uart = &arc_uart_ports[dev_id]; port = &uart->port;
Greg Kroah-Hartman
maintainerPATCH 93/96 serial: 8250: Dont service RX FIFO if interrupts are disabled
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vignesh R <[email protected]>
[ Upstream commit 2e9fe539108320820016f78ca7704a7342788380 ]
Currently, data in RX FIFO is read based on UART_LSR register state even if RDI and RLSI interrupts are disabled in UART_IER register. This is because when IRQ handler is called due to TX FIFO empty event, RX FIFO is serviced based on UART_LSR register status instead of UART_IIR status. This defeats the purpose of disabling UART RX FIFO interrupts during throttling(see, omap_8250_throttle()) as IRQ handler continues to drain UART RX FIFO resulting in overflow of buffer at tty layer.
Fix this by making sure that driver drains UART RX FIFO only when UART_IIR_RDI is set along with UART_LSR_BI or UART_LSR_DR bits.
--- drivers/tty/serial/8250/8250_port.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/tty/serial/8250/8250_port.c +2 -1
@@ -1815,7 +1815,8 @@ int serial8250_handle_irq(struct uart_po status =serial_port_in (port,UART_LSR ); -if (status & (UART_LSR_DR |UART_LSR_BI )) { +if (status & (UART_LSR_DR |UART_LSR_BI ) && + iir &UART_IIR_RDI ) {if (!up->dma ||handle_rx_dma (up, iir)) status =serial8250_rx_chars (up, status); }
Greg Kroah-Hartman
maintainerPATCH 94/96 rtc: snvs: Fix usage of snvs_rtc_enable
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryan O'Donoghue <[email protected]>
[ Upstream commit 1485991c024603b2fb4ae77beb7a0d741128a48e ]
commit 179a502f8c46 ("rtc: snvs: add Freescale rtc-snvs driver") introduces the SNVS RTC driver with a function snvs_rtc_enable().
snvs_rtc_enable() can return an error on the enable path however this driver does not currently trap that failure on the probe() path and consequently if enabling the RTC fails we encounter a later error spinning forever in rtc_write_sync_lp().
[ 36.093481] [<c010d630>] (__irq_svc) from [<c0c2e9ec>] (_raw_spin_unlock_irqrestore+0x34/0x44) [ 36.102122] [<c0c2e9ec>] (_raw_spin_unlock_irqrestore) from [<c072e32c>] (regmap_read+0x4c/0x5c) [ 36.110938] [<c072e32c>] (regmap_read) from [<c085d0f4>] (rtc_write_sync_lp+0x6c/0x98) [ 36.118881] [<c085d0f4>] (rtc_write_sync_lp) from [<c085d160>] (snvs_rtc_alarm_irq_enable+0x40/0x4c) [ 36.128041] [<c085d160>] (snvs_rtc_alarm_irq_enable) from [<c08567b4>] (rtc_timer_do_work+0xd8/0x1a8) [ 36.137291] [<c08567b4>] (rtc_timer_do_work) from [<c01441b8>] (process_one_work+0x28c/0x76c) [ 36.145840] [<c01441b8>] (process_one_work) from [<c01446cc>] (worker_thread+0x34/0x58c) [ 36.153961] [<c01446cc>] (worker_thread) from [<c014aee4>] (kthread+0x138/0x150) [ 36.161388] [<c014aee4>] (kthread) from [<c0107e14>] (ret_from_fork+0x14/0x20) [ 36.168635] rcu_sched kthread starved for 2602 jiffies! g496 c495 f0x2 RCU_GP_WAIT_FQS(3) ->state=0x0 ->cpu=0 [ 36.178564] rcu_sched R running task 0 8 2 0x00000000 [ 36.185664] [<c0c288b0>] (__schedule) from [<c0c29134>] (schedule+0x3c/0xa0) [ 36.192739] [<c0c29134>] (schedule) from [<c0c2db80>] (schedule_timeout+0x78/0x4e0) [ 36.200422] [<c0c2db80>] (schedule_timeout) from [<c01a7ab0>] (rcu_gp_kthread+0x648/0x1864) [ 36.208800] [<c01a7ab0>] (rcu_gp_kthread) from [<c014aee4>] (kthread+0x138/0x150) [ 36.216309] [<c014aee4>] (kthread) from [<c0107e14>] (ret_from_fork+0x14/0x20)
This patch fixes by parsing the result of rtc_write_sync_lp() and propagating both in the probe and elsewhere. If the RTC doesn't start we don't proceed loading the driver and don't get into this loop mess later on.
--- drivers/rtc/rtc-snvs.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/rtc/rtc-snvs.c +11 -4
@@ -132,20 +132,23 @@ static int snvs_rtc_set_time(struct devi {struct snvs_rtc_data *data =dev_get_drvdata (dev);unsigned long time; +int ret;rtc_tm_to_time (tm, &time);/* Disable RTC first */ -snvs_rtc_enable (data, false); + ret =snvs_rtc_enable (data, false); +if (ret) +return ret;/* Write 32-bit time to 47-bit timer, leaving 15 LSBs blank */ regmap_write (data->regmap, data->offset +SNVS_LPSRTCLR , time <<CNTR_TO_SECS_SH );regmap_write (data->regmap, data->offset +SNVS_LPSRTCMR , time >> (32 -CNTR_TO_SECS_SH ));/* Enable RTC again */ -snvs_rtc_enable (data, true); + ret =snvs_rtc_enable (data, true); -return 0 ; +return ret; }static int snvs_rtc_read_alarm (struct device *dev,struct rtc_wkalrm *alrm)
@@ -287,7 +290,11 @@ static int snvs_rtc_probe(struct platforregmap_write (data->regmap, data->offset +SNVS_LPSR ,0xffffffff );/* Enable RTC */ -snvs_rtc_enable (data, true); + ret =snvs_rtc_enable (data, true); +if (ret) { +dev_err (&pdev->dev,"failed to enable rtc %d\n" , ret); + goto error_rtc_device_register; + }device_init_wakeup (&pdev->dev, true);
Greg Kroah-Hartman
maintainerPATCH 95/96 rtc: hctosys: Ensure system time doesnt overflow time_t
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Belloni <[email protected]>
[ Upstream commit b3a5ac42ab18b7d1a8f2f072ca0ee76a3b754a43 ]
On 32bit platforms, time_t is still a signed 32bit long. If it is overflowed, userspace and the kernel cant agree on the current system time. This causes multiple issues, in particular with systemd:
https://github.com/systemd/systemd/issues/1143
A good workaround is to simply avoid using hctosys which is something I greatly encourage as the time is better set by userspace.
However, many distribution enable it and use systemd which is rendering the system unusable in case the RTC holds a date after 2038 (and more so after 2106). Many drivers have workaround for this case and they should be eliminated so there is only one place left to fix when userspace is able to cope with dates after the 31bit overflow.
--- drivers/rtc/hctosys.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/rtc/hctosys.c +5 -0
@@ -49,6 +49,11 @@ static int __init rtc_hctosys(void) tv64.tv_sec =rtc_tm_to_time64 (&tm); +#if BITS_PER_LONG ==32 +if (tv64.tv_sec >INT_MAX ) + goto err_read; +#endif + err =do_settimeofday64 (&tv64); dev_info(rtc->dev.parent,
Greg Kroah-Hartman
maintainerPATCH 96/96 rtc: tx4939: avoid unintended sign extension on a 24 bit shift
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit 347876ad47b9923ce26e686173bbf46581802ffa ]
The shifting of buf[5] by 24 bits to the left will be promoted to a 32 bit signed int and then sign-extended to an unsigned long. If the top bit of buf[5] is set then all then all the upper bits sec end up as also being set because of the sign-extension. Fix this by casting buf[5] to an unsigned long before the shift.
Detected by CoverityScan, CID#1465292 ("Unintended sign extension")
--- drivers/rtc/rtc-tx4939.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/rtc/rtc-tx4939.c +4 -2
@@ -86,7 +86,8 @@ static int tx4939_rtc_read_time(struct dfor (i =2 ; i <6 ; i++) buf[i] =__raw_readl (&rtcreg->dat);spin_unlock_irq (&pdata->lock); - sec = (buf[5 ] <<24 ) | (buf[4 ] <<16 ) | (buf[3 ] <<8 ) | buf[2 ]; + sec = ((unsigned long )buf[5 ] <<24 ) | (buf[4 ] <<16 ) | + (buf[3 ] <<8 ) | buf[2 ];rtc_time_to_tm (sec, tm);return rtc_valid_tm (tm); }
@@ -147,7 +148,8 @@ static int tx4939_rtc_read_alarm(struct alrm->enabled = (ctl &TX4939_RTCCTL_ALME ) ?1 :0 ; alrm->pending = (ctl &TX4939_RTCCTL_ALMD ) ?1 :0 ;spin_unlock_irq (&pdata->lock); - sec = (buf[5 ] <<24 ) | (buf[4 ] <<16 ) | (buf[3 ] <<8 ) | buf[2 ]; + sec = ((unsigned long )buf[5 ] <<24 ) | (buf[4 ] <<16 ) | + (buf[3 ] <<8 ) | buf[2 ];rtc_time_to_tm (sec, &alrm->time);return rtc_valid_tm (&alrm->time); }
stable-rc/linux-4.9.y boot: 111 boots: 1 failed, 107 passed with 3 offline (v4.9.102-97-g190b92e2b8d4)
stable-rc/linux-4.9.y boot: 111 boots: 1 failed, 107 passed with 3 offline (v4.9.102-97-g190b92e2b8d4)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.9.y/kernel/v4.9.102-97-g190b92e2b8d4/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.9.y/kernel/v4.9.102-97-g190b92e2b8d4/
Tree: stable-rc
Branch: linux-4.9.y
Git Describe: v4.9.102-97-g190b92e2b8d4
Git Commit: 190b92e2b8d4d190a6b059732180a71f1ff17c4d
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 55 unique boards, 23 SoC families, 18 builds out of 183
Boot Failure Detected:
arm64:
defconfig
synquacer-acpi: 1 failed lab
Offline Platforms:
arm:
imx_v6_v7_defconfig:
imx7s-warp: 1 offline lab
multi_v7_defconfig:
imx7s-warp: 1 offline lab
arm64:
defconfig:
meson-gxbb-p200: 1 offline lab
---
For more info write to <[email protected]>
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.103 release. There are 96 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 Sat May 26 09:35:42 UTC 2018. Anything received after that time might be too late.
Build results:
total: 146 pass: 146 fail: 0 Qemu test results: total: 137 pass: 137 fail: 0
Details are available at http://kerneltests.org/builders/.
Guenter
Quoted 6 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.103 release. There are 96 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 Sat May 26 09:35:42 UTC 2018.
Results from Linaro’s test farm.
No regressions on arm64, arm and x86_64.
You may notice the report format has changed. I've removed a lot of the duplication that we had, while still trying to give an overall sense of the scope of testing.
Summary
------------------------------------------------------------------------
kernel: 4.9.103-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.9.y
git commit: 190b92e2b8d4d190a6b059732180a71f1ff17c4d
git describe: v4.9.102-97-g190b92e2b8d4
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.9-oe/build/v4.9.102-97-g190b92e2b8d4
No regressions (compared to build v4.9.102)
Ran 11084 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c - arm64
- hi6220-hikey - arm64
- juno-r2 - arm64
- qemu_arm
- qemu_arm64
- qemu_x86_64
- x15 - arm
- x86_64
Test Suites
-----------
* boot
* kselftest
* libhugetlbfs
* ltp-cap_bounds-tests
* ltp-containers-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-timers-tests
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.103 release. There are 96 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 Sat May 26 09:35:42 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.9.103-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.9.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah