4.9.86-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.9.86-stable review
This is the start of the stable review cycle for the 4.9.86 release. There are 56 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 Sun Mar 4 08:44:26 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.86-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.86-rc1
James Hogan <[email protected]>
MIPS: Implement __multi3 for GCC7 MIPS64r6 builds
Punit Agrawal <[email protected]>
KVM: arm/arm64: Fix check for hugepage size when allocating at Stage 2
Yangbo Lu <[email protected]>
net: gianfar_ptp: move set_fipers() to spinlock protecting area
Marcelo Ricardo Leitner <[email protected]>
sctp: make use of pre-calculated len
Ross Lagerwall <[email protected]>
xen/gntdev: Fix partial gntdev_mmap() cleanup
Ross Lagerwall <[email protected]>
xen/gntdev: Fix off-by-one error when unmapping with holes
Sergei Shtylyov <[email protected]>
SolutionEngine771x: fix Ether platform data
Christophe JAILLET <[email protected]>
mdio-sun4i: Fix a memory leak
Eduardo Otubo <[email protected]>
xen-netfront: enable device after manual module load
Venkat Duvvuru <[email protected]>
bnxt_en: Fix the 'Invalid VF' id check in bnxt_vf_ndo_prep routine.
Luu An Phu <[email protected]>
can: flex_can: Correct the checking for frame length in flexcan_start_xmit()
Johannes Berg <[email protected]>
mac80211: mesh: drop frames appearing to be from us
Hao Chen <[email protected]>
nl80211: Check for the required netlink attribute presence
Alexander Duyck <[email protected]>
i40e/i40evf: Account for frags split over multiple descriptors in check linearize
Felix Janda <[email protected]>
uapi libc compat: add fallback for unsupported libcs
Xiongwei Song <[email protected]>
drm/ttm: check the return value of kzalloc
SZ Lin (林上智) <[email protected]>
NET: usb: qmi_wwan: add support for YUGA CLM920-NC5 PID 0x9625
Tushar Dave <[email protected]>
e1000: fix disabling already-disabled warning
Gao Feng <[email protected]>
macvlan: Fix one possible double free
Aliaksei Karaliou <[email protected]>
xfs: quota: check result of register_shrinker()
Aliaksei Karaliou <[email protected]>
xfs: quota: fix missed destroy of qi_tree_lock
Erez Shitrit <[email protected]>
IB/ipoib: Fix race condition in neigh creation
Leon Romanovsky <[email protected]>
IB/mlx4: Fix mlx4_ib_alloc_mr error flow
Stefan Haberland <[email protected]>
s390/dasd: fix wrongly assigned configuration data
Guenter Roeck <[email protected]>
genirq: Guard handle_bad_irq log messages
Nitzan Carmi <[email protected]>
IB/mlx5: Fix mlx5_ib_alloc_mr error flow
Matthieu CASTET <[email protected]>
led: core: Fix brightness setting when setting delay_off=0
Guilherme G. Piccoli <[email protected]>
bnx2x: Improve reliability in case of nested PCI errors
Siva Reddy Kallam <[email protected]>
tg3: Enable PHY reset in MTU change path for 5720
Siva Reddy Kallam <[email protected]>
tg3: Add workaround to restrict 5762 MRRS to 2048
Tommi Rantala <[email protected]>
tipc: fix tipc_mon_delete() oops in tipc_enable_bearer() error path
Tommi Rantala <[email protected]>
tipc: error path leak fixes in tipc_enable_bearer()
James Hogan <[email protected]>
lib/mpi: Fix umul_ppmm() for MIPS64r6
Arnd Bergmann <[email protected]>
ARM: dts: ls1021a: fix incorrect clock references
Cathy Avery <[email protected]>
scsi: storvsc: Fix scsi_cmd error assignments in storvsc_handle_error
Fredrik Hallenberg <[email protected]>
net: stmmac: Fix TX timestamp calculation
Xin Long <[email protected]>
ip6_tunnel: get the min mtu properly in ip6_tnl_xmit
Alexander Kochetkov <[email protected]>
net: arc_emac: fix arc_emac_rx() error paths
Sean Wang <[email protected]>
net: mediatek: setup proper state for disabled GMAC on the default
Abhijeet Kumar <[email protected]>
ASoC: nau8825: fix issue that pop noise when start capture
Radu Pirea <[email protected]>
spi: atmel: fixed spin_lock usage inside atmel_spi_remove
Jia-Ju Bai <[email protected]>
mac80211_hwsim: Fix a possible sleep-in-atomic bug in hwsim_get_radio_nl
Karol Herbst <[email protected]>
drm/nouveau/pci: do a msi rearm on init
Alexey Khoroshilov <[email protected]>
net: phy: xgene: disable clk on error paths
Al Viro <[email protected]>
sget(): handle failures of register_shrinker()
Arnaldo Carvalho de Melo <[email protected]>
x86/asm: Allow again using asm.h when building for the 'bpf' clang target
Chunyan Zhang <[email protected]>
ARM: 8731/1: Fix csum_partial_copy_from_user() stack mismatch
Brendan McGrath <[email protected]>
ipv6: icmp6: Allow icmp messages to be looped back
Albert Hsieh <[email protected]>
mtd: nand: brcmnand: Zero bitflip is not an error
Sascha Hauer <[email protected]>
mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM
Daniele Palmas <[email protected]>
net: usb: qmi_wwan: add Telit ME910 PID 0x1101 support
Keith Busch <[email protected]>
nvme: check hw sectors before setting chunk sectors
Andreas Platschek <[email protected]>
dmaengine: fsl-edma: disable clks on all error paths
Yunlei He <[email protected]>
f2fs: fix a bug caused by NULL extent tree
Ben Gardner <[email protected]>
i2c: designware: must wait for enable
Anna-Maria Gleixner <[email protected]>
hrtimer: Ensure POSIX compliance (relative CLOCK_REALTIME hrtimers)
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/dts/ls1021a-qds.dts | 2 +- arch/arm/boot/dts/ls1021a-twr.dts | 2 +- arch/arm/kvm/mmu.c | 2 +- arch/arm/lib/csumpartialcopyuser.S | 4 ++ arch/mips/lib/Makefile | 3 +- arch/mips/lib/libgcc.h | 17 +++++++ arch/mips/lib/multi3.c | 54 +++++++++++++++++++++ arch/sh/boards/mach-se/770x/setup.c | 10 +++- arch/x86/include/asm/asm.h | 2 + drivers/dma/fsl-edma.c | 28 +++++------ drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c | 7 +++ drivers/gpu/drm/ttm/ttm_page_alloc.c | 2 + drivers/i2c/busses/i2c-designware-core.c | 2 +- drivers/infiniband/hw/mlx4/mr.c | 2 +- drivers/infiniband/hw/mlx5/mr.c | 1 + drivers/infiniband/ulp/ipoib/ipoib_main.c | 25 +++++++--- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 5 +- drivers/leds/led-core.c | 2 +- drivers/mtd/nand/brcmnand/brcmnand.c | 2 +- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 6 +-- drivers/net/can/flexcan.c | 2 +- drivers/net/ethernet/arc/emac_main.c | 53 ++++++++++++--------- drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 4 +- drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 14 +++++- drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 2 +- drivers/net/ethernet/broadcom/tg3.c | 13 ++++- drivers/net/ethernet/broadcom/tg3.h | 4 ++ drivers/net/ethernet/freescale/gianfar_ptp.c | 3 +- drivers/net/ethernet/intel/e1000/e1000.h | 3 +- drivers/net/ethernet/intel/e1000/e1000_main.c | 27 +++++++++-- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 26 ++++++++-- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 26 ++++++++-- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 +++-- .../net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 6 ++- drivers/net/macvlan.c | 7 ++- drivers/net/phy/mdio-sun4i.c | 6 ++- drivers/net/phy/mdio-xgene.c | 21 ++++++--- drivers/net/usb/qmi_wwan.c | 2 + drivers/net/wireless/mac80211_hwsim.c | 2 +- drivers/net/xen-netfront.c | 1 + drivers/nvme/host/core.c | 3 +- drivers/s390/block/dasd_3990_erp.c | 10 ++++ drivers/scsi/storvsc_drv.c | 3 +- drivers/spi/spi-atmel.c | 2 +- drivers/xen/gntdev.c | 8 ++-- fs/f2fs/extent_cache.c | 12 ++++- fs/super.c | 6 ++- fs/xfs/xfs_qm.c | 46 +++++++++++------- include/uapi/linux/libc-compat.h | 55 +++++++++++++++++++++- kernel/irq/debug.h | 5 ++ kernel/time/hrtimer.c | 7 ++- lib/mpi/longlong.h | 18 ++++++- net/ipv6/ip6_tunnel.c | 9 +++- net/ipv6/route.c | 1 + net/mac80211/rx.c | 2 + net/sctp/socket.c | 16 ++++--- net/tipc/bearer.c | 5 +- net/tipc/monitor.c | 6 ++- net/wireless/nl80211.c | 3 +- sound/soc/codecs/nau8825.c | 1 + 61 files changed, 498 insertions(+), 135 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/56 hrtimer: Ensure POSIX compliance (relative CLOCK_REALTIME hrtimers)
4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anna-Maria Gleixner <[email protected]>
commit 48d0c9becc7f3c66874c100c126459a9da0fdced upstream.
The POSIX specification defines that relative CLOCK_REALTIME timers are not affected by clock modifications. Those timers have to use CLOCK_MONOTONIC to ensure POSIX compliance.
The introduction of the additional HRTIMER_MODE_PINNED mode broke this requirement for pinned timers.
There is no user space visible impact because user space timers are not using pinned mode, but for consistency reasons this needs to be fixed.
Check whether the mode has the HRTIMER_MODE_REL bit set instead of comparing with HRTIMER_MODE_ABS.
--- kernel/time/hrtimer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
kernel/time/hrtimer.c +6 -1
@@ -1134,7 +1134,12 @@ static void __hrtimer_init(struct hrtime cpu_base =raw_cpu_ptr (&hrtimer_bases); -if (clock_id ==CLOCK_REALTIME && mode !=HRTIMER_MODE_ABS ) +/* +* POSIX magic: Relative CLOCK_REALTIME timers are not affected by +* clock modifications, so they needs to become CLOCK_MONOTONIC to +* ensure POSIX compliance. +*/ +if (clock_id ==CLOCK_REALTIME && mode &HRTIMER_MODE_REL ) clock_id =CLOCK_MONOTONIC ; base =hrtimer_clockid_to_base (clock_id);
Greg Kroah-Hartman
maintainerPATCH 2/56 i2c: designware: must wait for enable
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Gardner <[email protected]>
commit fba4adbbf670577e605f9ad306629db6031cd48b upstream.
One I2C bus on my Atom E3845 board has been broken since 4.9. It has two devices, both declared by ACPI and with built-in drivers.
There are two back-to-back transactions originating from the kernel, one targeting each device. The first transaction works, the second one locks up the I2C controller. The controller never recovers.
These kernel logs show up whenever an I2C transaction is attempted after this failure.
i2c-designware-pci 0000:00:18.3: timeout in disabling adapter i2c-designware-pci 0000:00:18.3: timeout waiting for bus ready
Waiting for the I2C controller status to indicate that it is enabled before programming it fixes the issue.
I have tested this patch on 4.14 and 4.15.
--- drivers/i2c/busses/i2c-designware-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-designware-core.c +1 -1
@@ -507,7 +507,7 @@ static void i2c_dw_xfer_init(struct dw_ii2c_dw_disable_int (dev);/* Enable the adapter */ -__i2c_dw_enable (dev, true); +__i2c_dw_enable_and_wait (dev, true);/* Clear and enable interrupts */ dw_readl (dev,DW_IC_CLR_INTR );
Greg Kroah-Hartman
maintainerPATCH 3/56 f2fs: fix a bug caused by NULL extent tree
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunlei He <[email protected]>
commit dad48e73127ba10279ea33e6dbc8d3905c4d31c0 upstream.
Thread A: Thread B:
-f2fs_remount
-sbi->mount_opt.opt = 0;
<--- -f2fs_iget
-do_read_inode
-f2fs_init_extent_tree
-F2FS_I(inode)->extent_tree is NULL
-default_options && parse_options
-remount return
<--- -f2fs_map_blocks
-f2fs_lookup_extent_tree
-f2fs_bug_on(sbi, !et);The same problem with f2fs_new_inode.
--- fs/f2fs/extent_cache.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
fs/f2fs/extent_cache.c +11 -1
@@ -177,7 +177,7 @@ static void __drop_largest_extent(struct }/* return true, if inode page is changed */ -bool f2fs_init_extent_tree (struct inode *inode,struct f2fs_extent *i_ext) +static bool __f2fs_init_extent_tree (struct inode *inode,struct f2fs_extent *i_ext) {struct f2fs_sb_info *sbi =F2FS_I_SB (inode);struct extent_tree *et;
@@ -215,6 +215,16 @@ out:return false; } +bool f2fs_init_extent_tree (struct inode *inode,struct f2fs_extent *i_ext) +{ +bool ret =__f2fs_init_extent_tree (inode, i_ext); + +if (!F2FS_I (inode)->extent_tree) +set_inode_flag (inode,FI_NO_EXTENT ); + +return ret; +} +static bool f2fs_lookup_extent_tree (struct inode *inode,pgoff_t pgofs,struct extent_info *ei) {
Greg Kroah-Hartman
maintainerPATCH 4/56 dmaengine: fsl-edma: disable clks on all error paths
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Platschek <[email protected]>
[ Upstream commit 2610acf46b9ed528ec2cacd717bc9d354e452b73 ]
Previously enabled clks are only disabled if clk_prepare_enable() fails. However, there are other error paths were the previously enabled clocks are not disabled.
To fix the problem, fsl_disable_clocks() now takes the number of clocks that shall be disabled + unprepared. For existing calls were all clocks were already successfully prepared + enabled, DMAMUX_NR is passed to disable + unprepare all clocks.
In error paths were only some clocks were successfully prepared + enabled the loop counter is passed, in order to disable + unprepare all successfully prepared + enabled clocks.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/dma/fsl-edma.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
drivers/dma/fsl-edma.c +14 -14
@@ -863,11 +863,11 @@ static void fsl_edma_irq_exit( } } -static void fsl_disable_clocks (struct fsl_edma_engine *fsl_edma) +static void fsl_disable_clocks (struct fsl_edma_engine *fsl_edma,int nr_clocks) {int i; -for (i =0 ; i <DMAMUX_NR ; i++) +for (i =0 ; i < nr_clocks; i++)clk_disable_unprepare (fsl_edma->muxclk[i]); }
@@ -904,25 +904,25 @@ static int fsl_edma_probe(struct platfor res =platform_get_resource (pdev,IORESOURCE_MEM ,1 + i); fsl_edma->muxbase[i] =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (fsl_edma->muxbase[i])) +if (IS_ERR (fsl_edma->muxbase[i])) { +/* on error: disable all previously enabled clks */ +fsl_disable_clocks (fsl_edma, i);return PTR_ERR (fsl_edma->muxbase[i]); + }sprintf (clkname,"dmamux%d" , i); fsl_edma->muxclk[i] =devm_clk_get (&pdev->dev, clkname);if (IS_ERR (fsl_edma->muxclk[i])) {dev_err (&pdev->dev,"Missing DMAMUX block clock.\n" ); +/* on error: disable all previously enabled clks */ +fsl_disable_clocks (fsl_edma, i);return PTR_ERR (fsl_edma->muxclk[i]); } ret =clk_prepare_enable (fsl_edma->muxclk[i]); -if (ret) { -/* disable only clks which were enabled on error */ -for (; i >=0 ; i--) -clk_disable_unprepare (fsl_edma->muxclk[i]); - -dev_err (&pdev->dev,"DMAMUX clk block failed.\n" ); -return ret; - } +if (ret) +/* on error: disable all previously enabled clks */ +fsl_disable_clocks (fsl_edma, i); }
@@ -976,7 +976,7 @@ static int fsl_edma_probe(struct platforif (ret) {dev_err (&pdev->dev,"Can't register Freescale eDMA engine. (%d)\n" , ret); -fsl_disable_clocks (fsl_edma); +fsl_disable_clocks (fsl_edma,DMAMUX_NR );return ret; }
@@ -985,7 +985,7 @@ static int fsl_edma_probe(struct platfordev_err (&pdev->dev,"Can't register Freescale eDMA of_dma. (%d)\n" , ret);dma_async_device_unregister (&fsl_edma->dma_dev); -fsl_disable_clocks (fsl_edma); +fsl_disable_clocks (fsl_edma,DMAMUX_NR );return ret; }
@@ -1015,7 +1015,7 @@ static int fsl_edma_remove(struct platfofsl_edma_cleanup_vchan (&fsl_edma->dma_dev);of_dma_controller_free (np);dma_async_device_unregister (&fsl_edma->dma_dev); -fsl_disable_clocks (fsl_edma); +fsl_disable_clocks (fsl_edma,DMAMUX_NR );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 5/56 nvme: check hw sectors before setting chunk sectors
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
[ Upstream commit 249159c5f15812140fa216f9997d799ac0023a1f ]
Some devices with IDs matching the "stripe" quirk don't actually have this quirk, and don't have an MDTS value. When MDTS is not set, the driver sets the max sectors to UINT_MAX, which is not a power of 2, hitting a BUG_ON from blk_queue_chunk_sectors. This patch skips setting chunk sectors for such devices.
--- drivers/nvme/host/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +2 -1
@@ -1204,7 +1204,8 @@ static void nvme_set_queue_limits(structblk_queue_max_hw_sectors (q, ctrl->max_hw_sectors);blk_queue_max_segments (q,min_t (u32, max_segments,USHRT_MAX )); } -if (ctrl->quirks &NVME_QUIRK_STRIPE_SIZE ) +if ((ctrl->quirks &NVME_QUIRK_STRIPE_SIZE ) && +is_power_of_2 (ctrl->max_hw_sectors))blk_queue_chunk_sectors (q, ctrl->max_hw_sectors);blk_queue_virt_boundary (q, ctrl->page_size -1 );if (ctrl->vwc &NVME_CTRL_VWC_PRESENT )
Greg Kroah-Hartman
maintainerPATCH 6/56 net: usb: qmi_wwan: add Telit ME910 PID 0x1101 support
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Palmas <[email protected]>
[ Upstream commit c647c0d62c82eb3ddf78a0d8b3d58819d9f552aa ]
This patch adds support for Telit ME910 PID 0x1101.
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -914,6 +914,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ + {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
Greg Kroah-Hartman
maintainerPATCH 7/56 mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sascha Hauer <[email protected]>
[ Upstream commit fdf2e821052958a114618a95ab18a300d0b080cb ]
When erased subpages are read then the BCH decoder returns STATUS_ERASED if they are all empty, or STATUS_UNCORRECTABLE if there are bitflips. When there are bitflips, we have to set these bits again to show the upper layers a completely erased page. When a bitflip happens in the exact byte where the bad block marker is, then this byte is swapped with another byte in block_mark_swapping(). The correction code then detects a bitflip in another subpage and no longer corrects the bitflip where it really happens.
Correct this behaviour by calling block_mark_swapping() after the bitflips have been corrected.
In our case UBIFS failed with this bug because it expects erased pages to be really empty:
UBIFS error (pid 187): ubifs_scan: corrupt empty space at LEB 36:118735 UBIFS error (pid 187): ubifs_scanned_corruption: corruption at LEB 36:118735 UBIFS error (pid 187): ubifs_scanned_corruption: first 8192 bytes from LEB 36:118735 UBIFS error (pid 187): ubifs_scan: LEB 36 scanning failed
UBIFS error (pid 187): do_commit: commit failed, error -117
--- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +3 -3
@@ -1059,9 +1059,6 @@ static int gpmi_ecc_read_page(struct mtdreturn ret; } -/* handle the block mark swapping */ -block_mark_swapping (this, payload_virt, auxiliary_virt); -/* Loop over status bytes, accumulating ECC status. */ status = auxiliary_virt + nfc_geo->auxiliary_status_offset;
@@ -1150,6 +1147,9 @@ static int gpmi_ecc_read_page(struct mtd max_bitflips = max_t(unsigned int, max_bitflips, *status); } +/* handle the block mark swapping */ +block_mark_swapping (this, buf, auxiliary_virt); +if (oob_required) {/* * It's time to deliver the OOB bytes. See gpmi_ecc_read_oob()
Greg Kroah-Hartman
maintainerPATCH 8/56 mtd: nand: brcmnand: Zero bitflip is not an error
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Albert Hsieh <[email protected]>
[ Upstream commit e44b9a9c135727f3410e029910275f40681dc8bc ]
A negative return value of brcmstb_nand_verify_erased_page() indicates a real bitflip error of an erased page, and other return values (>= 0) show the corrected bitflip number. Zero return value means no bitflip, but the current driver code treats it as an error, and eventually leads to falsely reported ECC error.
--- drivers/mtd/nand/brcmnand/brcmnand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/brcmnand/brcmnand.c +1 -1
@@ -1763,7 +1763,7 @@ try_dmaread: err =brcmstb_nand_verify_erased_page (mtd, chip, buf, addr);/* erased page bitflips corrected */ -if (err >0 ) +if (err >=0 )return err; }
Greg Kroah-Hartman
maintainerPATCH 9/56 ipv6: icmp6: Allow icmp messages to be looped back
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brendan McGrath <[email protected]>
[ Upstream commit 588753f1eb18978512b1c9b85fddb457d46f9033 ]
One example of when an ICMPv6 packet is required to be looped back is when a host acts as both a Multicast Listener and a Multicast Router.
A Multicast Router will listen on address ff02::16 for MLDv2 messages.
Currently, MLDv2 messages originating from a Multicast Listener running on the same host as the Multicast Router are not being delivered to the Multicast Router. This is due to dst.input being assigned the default value of dst_discard.
This results in the packet being looped back but discarded before being delivered to the Multicast Router.
This patch sets dst.input to ip6_input to ensure a looped back packet is delivered to the Multicast Router.
--- net/ipv6/route.c | 1 + 1 file changed, 1 insertion(+)
net/ipv6/route.c +1 -0
@@ -1651,6 +1651,7 @@ struct dst_entry *icmp6_dst_alloc(struct } rt->dst.flags |=DST_HOST ; + rt->dst.input = ip6_input; rt->dst.output = ip6_output;atomic_set (&rt->dst.__refcnt,1 ); rt->rt6i_gateway = fl6->daddr;
Greg Kroah-Hartman
maintainerPATCH 10/56 ARM: 8731/1: Fix csum_partial_copy_from_user() stack mismatch
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunyan Zhang <[email protected]>
[ Upstream commit 36b0cb84ee858f02c256d26f0cb4229c78e3399e ]
An additional 'ip' will be pushed to the stack, for restoring the DACR later, if CONFIG_CPU_SW_DOMAIN_PAN defined.
However, the fixup still get the err_ptr by add #8*4 to sp, which results in the fact that the code area pointed by the LR will be overwritten, or the kernel will crash if CONFIG_DEBUG_RODATA is enabled.
This patch fixes the stack mismatch.
--- arch/arm/lib/csumpartialcopyuser.S | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/lib/csumpartialcopyuser.S +4 -0
@@ -85,7 +85,11 @@ .pushsection .text.fixup,"ax" .align 4 9001: mov r4, #-EFAULT +#ifdef CONFIG_CPU_SW_DOMAIN_PAN + ldr r5, [sp, #9*4] @ *err_ptr +#else ldr r5, [sp, #8*4] @ *err_ptr +#endif str r4, [r5] ldmia sp, {r1, r2} @ retrieve dst, len add r2, r2, r1
Greg Kroah-Hartman
maintainerPATCH 11/56 x86/asm: Allow again using asm.h when building for the bpf clang target
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit ca26cffa4e4aaeb09bb9e308f95c7835cb149248 ]
Up to f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang") we were able to use x86 headers to build to the 'bpf' clang target, as done by the BPF code in tools/perf/.
With that commit, we ended up with following failure for 'perf test LLVM', this is because "clang ... -target bpf ..." fails since 4.0 does not have bpf inline asm support and 6.0 does not recognize the register 'esp', fix it by guarding that part with an #ifndef __BPF__, that is defined by clang when building to the "bpf" target.
# perf test -v LLVM 37: LLVM search and compile : 37.1: Basic BPF llvm compile : --- start --- test child forked, pid 25526 Kernel build dir is set to /lib/modules/4.14.0+/build set env: KBUILD_DIR=/lib/modules/4.14.0+/build unset env: KBUILD_OPTS include option is set to -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h set env: NR_CPUS=4 set env: LINUX_VERSION_CODE=0x40e00 set env: CLANG_EXEC=/usr/local/bin/clang set env: CLANG_OPTIONS=-xc set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h set env: WORKING_DIR=/lib/modules/4.14.0+/build set env: CLANG_SOURCE=- llvm compiling command template: echo '/* * bpf-script-example.c * Test basic LLVM building */ #ifndef LINUX_VERSION_CODE # error Need LINUX_VERSION_CODE # error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig' #endif #define BPF_ANY 0 #define BPF_MAP_TYPE_ARRAY 2 #define BPF_FUNC_map_lookup_elem 1 #define BPF_FUNC_map_update_elem 2
static void *(*bpf_map_lookup_elem)(void *map, void *key) =
(void *) BPF_FUNC_map_lookup_elem; static void *(*bpf_map_update_elem)(void *map, void *key, void *value, int flags) = (void *) BPF_FUNC_map_update_elem;
struct bpf_map_def {
unsigned int type;
unsigned int key_size;
unsigned int value_size;
unsigned int max_entries;};
#define SEC(NAME) __attribute__((section(NAME), used)) struct bpf_map_def SEC("maps") flip_table = {
.type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(int),
.value_size = sizeof(int), .max_entries = 1,
};
SEC("func=SyS_epoll_wait")
int bpf_func__SyS_epoll_wait(void *ctx)
{
int ind =0;
int *flag = bpf_map_lookup_elem(&flip_table, &ind);
int new_flag;
if (!flag)
return 0;
/* flip flag and store back */
new_flag = !*flag;
bpf_map_update_elem(&flip_table, &ind, &new_flag, BPF_ANY);
return new_flag;
}
char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o -
test child finished with 0
---- end ----
LLVM search and compile subtest 0: Ok
37.2: kbuild searching :
--- start ---
test child forked, pid 25950
Kernel build dir is set to /lib/modules/4.14.0+/build
set env: KBUILD_DIR=/lib/modules/4.14.0+/build
unset env: KBUILD_OPTS
include option is set to -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
set env: NR_CPUS=4
set env: LINUX_VERSION_CODE=0x40e00
set env: CLANG_EXEC=/usr/local/bin/clang
set env: CLANG_OPTIONS=-xc
set env: KERNEL_INC_OPTIONS= -nostdinc -isystem /usr/lib/gcc/x86_64-redhat-linux/7/include -I/home/acme/git/linux/arch/x86/include -I./arch/x86/include/generated -I/home/acme/git/linux/include -I./include -I/home/acme/git/linux/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/acme/git/linux/include/uapi -I./include/generated/uapi -include /home/acme/git/linux/include/linux/kconfig.h
set env: WORKING_DIR=/lib/modules/4.14.0+/build
set env: CLANG_SOURCE=-
llvm compiling command template: echo '/*
* bpf-script-test-kbuild.c
* Test include from kernel header
*/
#ifndef LINUX_VERSION_CODE
# error Need LINUX_VERSION_CODE
# error Example: for 4.2 kernel, put 'clang-opt="-DLINUX_VERSION_CODE=0x40200" into llvm section of ~/.perfconfig'
#endif
#define SEC(NAME) __attribute__((section(NAME), used))#include <uapi/linux/fs.h> #include <uapi/asm/ptrace.h>
SEC("func=vfs_llseek")
int bpf_func__vfs_llseek(void *ctx)
{
return 0;}
char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
' | $CLANG_EXEC -D__KERNEL__ -D__NR_CPUS__=$NR_CPUS -DLINUX_VERSION_CODE=$LINUX_VERSION_CODE $CLANG_OPTIONS $KERNEL_INC_OPTIONS -Wno-unused-value -Wno-pointer-sign -working-directory $WORKING_DIR -c "$CLANG_SOURCE" -target bpf -O2 -o - In file included from <stdin>:12:
In file included from /home/acme/git/linux/arch/x86/include/uapi/asm/ptrace.h:5:
In file included from /home/acme/git/linux/include/linux/compiler.h:242:
In file included from /home/acme/git/linux/arch/x86/include/asm/barrier.h:5:
In file included from /home/acme/git/linux/arch/x86/include/asm/alternative.h:10:
/home/acme/git/linux/arch/x86/include/asm/asm.h:145:50: error: unknown register name 'esp' in asm
register unsigned long current_stack_pointer asm(_ASM_SP);
^
/home/acme/git/linux/arch/x86/include/asm/asm.h:44:18: note: expanded from macro '_ASM_SP'
#define _ASM_SP __ASM_REG(sp)
^
/home/acme/git/linux/arch/x86/include/asm/asm.h:27:32: note: expanded from macro '__ASM_REG'
#define __ASM_REG(reg) __ASM_SEL_RAW(e##reg, r##reg)
^
/home/acme/git/linux/arch/x86/include/asm/asm.h:18:29: note: expanded from macro '__ASM_SEL_RAW'
# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
^
/home/acme/git/linux/arch/x86/include/asm/asm.h:11:32: note: expanded from macro '__ASM_FORM_RAW'
# define __ASM_FORM_RAW(x) #x
^
<scratch space>:4:1: note: expanded from here
"esp"
^
1 error generated.
ERROR: unable to compile -
Hint: Check error message shown above.
Hint: You can also pre-compile it into .o using:
clang -target bpf -O2 -c -
with proper -I and -D options.
Failed to compile test case: 'kbuild searching'
test child finished with -1
---- end ----
LLVM search and compile subtest 1: FAILED!--- arch/x86/include/asm/asm.h | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/include/asm/asm.h +2 -0
@@ -128,6 +128,7 @@#endif #ifndef __ASSEMBLY__ +#ifndef __BPF__/* * This output constraint should be used for any inline asm which has a "call" * instruction. Otherwise the asm may be inserted before the frame pointer
@@ -137,5 +138,6 @@ registerunsigned long current_stack_pointer asm (_ASM_SP );#define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer)#endif +#endif #endif /* _ASM_X86_ASM_H */
Greg Kroah-Hartman
maintainerPATCH 12/56 sget(): handle failures of register_shrinker()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
[ Upstream commit 9ee332d99e4d5a97548943b81c54668450ce641b ]
--- fs/super.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/super.c +5 -1
@@ -519,7 +519,11 @@ retry:hlist_add_head (&s->s_instances, &type->fs_supers);spin_unlock (&sb_lock);get_filesystem (type); -register_shrinker (&s->s_shrink); + err =register_shrinker (&s->s_shrink); +if (err) { +deactivate_locked_super (s); + s =ERR_PTR (err); + }return s; }
Greg Kroah-Hartman
maintainerPATCH 13/56 net: phy: xgene: disable clk on error paths
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Khoroshilov <[email protected]>
[ Upstream commit ab14436065c8066c265540312742390d6d07ddd2 ]
There are several error paths in xgene_mdio_probe(), where clk is left undisabled. The patch fixes them.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/net/phy/mdio-xgene.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
drivers/net/phy/mdio-xgene.c +15 -6
@@ -197,8 +197,11 @@ static int xgene_mdio_reset(struct xgene } ret =xgene_enet_ecc_init (pdata); -if (ret) +if (ret) { +if (pdata->dev->of_node) +clk_disable_unprepare (pdata->clk);return ret; + }xgene_gmac_reset (pdata);return 0 ;
@@ -364,8 +367,10 @@ static int xgene_mdio_probe(struct platfreturn ret; mdio_bus =mdiobus_alloc (); -if (!mdio_bus) -return -ENOMEM ; +if (!mdio_bus) { + ret = -ENOMEM ; + goto out_clk; + } mdio_bus->name ="APM X-Gene MDIO bus" ;
@@ -394,7 +399,7 @@ static int xgene_mdio_probe(struct platf mdio_bus->phy_mask = ~0 ; ret =mdiobus_register (mdio_bus);if (ret) - goto out; + goto out_mdiobus;acpi_walk_namespace (ACPI_TYPE_DEVICE ,ACPI_HANDLE (dev),1 , acpi_register_phy,NULL , mdio_bus,NULL );
@@ -402,16 +407,20 @@ static int xgene_mdio_probe(struct platf }if (ret) - goto out; + goto out_mdiobus; pdata->mdio_bus = mdio_bus; xgene_mdio_status = true;return 0 ; -out: +out_mdiobus:mdiobus_free (mdio_bus); +out_clk: +if (dev->of_node) +clk_disable_unprepare (pdata->clk); +return ret; }
Greg Kroah-Hartman
maintainerPATCH 14/56 drm/nouveau/pci: do a msi rearm on init
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karol Herbst <[email protected]>
[ Upstream commit a121027d2747168df0aac0c3da35509eea39f61c ]
On my GP107 when I load nouveau after unloading it, for some reason the GPU stopped sending or the CPU stopped receiving interrupts if MSI was enabled.
Doing a rearm once before getting any interrupts fixes this.
--- drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c +7 -0
@@ -136,6 +136,13 @@ nvkm_pci_init(struct nvkm_subdev *subdevreturn ret; pci->irq = pdev->irq; + +/* Ensure MSI interrupts are armed, for the case where there are +* already interrupts pending (for whatever reason) at load time. +*/ +if (pci->msi) + pci->func->msi_rearm (pci); +return ret; }
Greg Kroah-Hartman
maintainerPATCH 15/56 mac80211_hwsim: Fix a possible sleep-in-atomic bug in hwsim_get_radio_nl
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia-Ju Bai <[email protected]>
[ Upstream commit 162bd5e5fd921785077b5862d8f2ffabe2fe11e5 ]
The driver may sleep under a spinlock.
The function call path is:hwsim_get_radio_nl (acquire the spinlock)
nlmsg_new(GFP_KERNEL) --> may sleep
To fix it, GFP_KERNEL is replaced with GFP_ATOMIC.
This bug is found by my static analysis tool(DSAC) and checked by my code review.
--- drivers/net/wireless/mac80211_hwsim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mac80211_hwsim.c +1 -1
@@ -3154,7 +3154,7 @@ static int hwsim_get_radio_nl(struct sk_if (!net_eq (wiphy_net (data->hw->wiphy),genl_info_net (info)))continue ; - skb =nlmsg_new (NLMSG_DEFAULT_SIZE ,GFP_KERNEL ); + skb =nlmsg_new (NLMSG_DEFAULT_SIZE ,GFP_ATOMIC );if (!skb) { res = -ENOMEM ; goto out_err;
Greg Kroah-Hartman
maintainerPATCH 16/56 spi: atmel: fixed spin_lock usage inside atmel_spi_remove
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Radu Pirea <[email protected]>
[ Upstream commit 66e900a3d225575c8b48b59ae1fe74bb6e5a65cc ]
The only part of atmel_spi_remove which needs to be atomic is hardware reset.
atmel_spi_stop_dma calls dma_terminate_all and this needs interrupts enabled.atmel_spi_release_dma calls dma_release_channel and dma_release_channel locks a mutex inside of spin_lock.
So the call of these functions can't be inside a spin_lock.
--- drivers/spi/spi-atmel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-atmel.c +1 -1
@@ -1669,12 +1669,12 @@ static int atmel_spi_remove(struct platfpm_runtime_get_sync (&pdev->dev);/* reset the hardware and block queue progress */ -spin_lock_irq (&as->lock);if (as->use_dma) {atmel_spi_stop_dma (as);atmel_spi_release_dma (as); } +spin_lock_irq (&as->lock);spi_writel (as,CR ,SPI_BIT (SWRST ));spi_writel (as,CR ,SPI_BIT (SWRST ));/* AT91SAM9263 Rev B workaround */ spi_readl (as,SR );
Greg Kroah-Hartman
maintainerPATCH 17/56 ASoC: nau8825: fix issue that pop noise when start capture
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abhijeet Kumar <[email protected]>
[ Upstream commit d070f7c703ef26e3db613f24206823f916272fc6 ]
In skylake platform, we hear a loud pop noise(0 dB) at start of audio capture power up sequence. This patch removes the pop noise from the recording by adding a delay before enabling ADC.
--- sound/soc/codecs/nau8825.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/nau8825.c +1 -0
@@ -882,6 +882,7 @@ static int nau8825_adc_event(struct snd_switch (event) {case SND_SOC_DAPM_POST_PMU : +msleep (125 );regmap_update_bits (nau8825->regmap,NAU8825_REG_ENA_CTRL ,NAU8825_ENABLE_ADC ,NAU8825_ENABLE_ADC );break ;
Greg Kroah-Hartman
maintainerPATCH 18/56 net: mediatek: setup proper state for disabled GMAC on the default
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Wang <[email protected]>
[ Upstream commit 7352e252b5bf40d59342494a70354a2d436fd0cd ]
The current solution would setup fixed and force link of 1Gbps to the both GMAC on the default. However, The GMAC should always be put to link down state when the GMAC is disabled on certain target boards. Otherwise, the driver possibly receives unexpected data from the floating hardware connection through the unused GMAC. Although the driver had been added certain protection in RX path to get rid of such kind of unexpected data sent to the upper stack.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +6 -5
@@ -1842,11 +1842,12 @@ static int mtk_hw_init(struct mtk_eth *e/* set GE2 TUNE */ regmap_write (eth->pctl,GPIO_BIAS_CTRL ,0x0 ); -/* GE1, Force 1000M/FD, FC ON */ -mtk_w32 (eth,MAC_MCR_FIXED_LINK ,MTK_MAC_MCR (0 )); - -/* GE2, Force 1000M/FD, FC ON */ -mtk_w32 (eth,MAC_MCR_FIXED_LINK ,MTK_MAC_MCR (1 )); +/* Set linkdown as the default for each GMAC. Its own MCR would be set +* up with the more appropriate value when mtk_phy_link_adjust call is +* being invoked. +*/ +for (i =0 ; i <MTK_MAC_COUNT ; i++) +mtk_w32 (eth,0 ,MTK_MAC_MCR (i));/* Enable RX VLan Offloading */ mtk_w32 (eth,1 ,MTK_CDMP_EG_CTRL );
Greg Kroah-Hartman
maintainerPATCH 19/56 net: arc_emac: fix arc_emac_rx() error paths
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Kochetkov <[email protected]>
[ Upstream commit e688822d035b494071ecbadcccbd6f3325fb0f59 ]
arc_emac_rx() has some issues found by code review.
In case netdev_alloc_skb_ip_align() or dma_map_single() failure rx fifo entry will not be returned to EMAC.
In case dma_map_single() failure previously allocated skb became lost to driver. At the same time address of newly allocated skb will not be provided to EMAC.
--- drivers/net/ethernet/arc/emac_main.c | 53 ++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 22 deletions(-)
drivers/net/ethernet/arc/emac_main.c +31 -22
@@ -210,39 +210,48 @@ static int arc_emac_rx(struct net_devicecontinue ; } - pktlen = info &LEN_MASK ; - stats->rx_packets++; - stats->rx_bytes += pktlen; - skb = rx_buff->skb; -skb_put (skb, pktlen); - skb->dev = ndev; - skb->protocol =eth_type_trans (skb, ndev); - -dma_unmap_single (&ndev->dev,dma_unmap_addr (rx_buff, addr), -dma_unmap_len (rx_buff, len),DMA_FROM_DEVICE ); - -/* Prepare the BD for next cycle */ - rx_buff->skb =netdev_alloc_skb_ip_align (ndev, -EMAC_BUFFER_SIZE ); -if (unlikely (!rx_buff->skb)) { +/* Prepare the BD for next cycle. netif_receive_skb() +* only if new skb was allocated and mapped to avoid holes +* in the RX fifo. +*/ + skb =netdev_alloc_skb_ip_align (ndev,EMAC_BUFFER_SIZE ); +if (unlikely (!skb)) { +if (net_ratelimit ()) +netdev_err (ndev,"cannot allocate skb\n" ); +/* Return ownership to EMAC */ + rxbd->info =cpu_to_le32 (FOR_EMAC |EMAC_BUFFER_SIZE ); stats->rx_errors++; -/* Because receive_skb is below, increment rx_dropped */ stats->rx_dropped++;continue ; } -/* receive_skb only if new skb was allocated to avoid holes */ -netif_receive_skb (skb); - - addr =dma_map_single (&ndev->dev, (void *)rx_buff->skb->data, + addr =dma_map_single (&ndev->dev, (void *)skb->data,EMAC_BUFFER_SIZE ,DMA_FROM_DEVICE );if (dma_mapping_error (&ndev->dev, addr)) {if (net_ratelimit ()) -netdev_err (ndev,"cannot dma map\n" ); -dev_kfree_skb (rx_buff->skb); +netdev_err (ndev,"cannot map dma buffer\n" ); +dev_kfree_skb (skb); +/* Return ownership to EMAC */ + rxbd->info =cpu_to_le32 (FOR_EMAC |EMAC_BUFFER_SIZE ); stats->rx_errors++; + stats->rx_dropped++;continue ; } + +/* unmap previosly mapped skb */ +dma_unmap_single (&ndev->dev,dma_unmap_addr (rx_buff, addr), +dma_unmap_len (rx_buff, len),DMA_FROM_DEVICE ); + + pktlen = info &LEN_MASK ; + stats->rx_packets++; + stats->rx_bytes += pktlen; +skb_put (rx_buff->skb, pktlen); + rx_buff->skb->dev = ndev; + rx_buff->skb->protocol =eth_type_trans (rx_buff->skb, ndev); + +netif_receive_skb (rx_buff->skb); + + rx_buff->skb = skb;dma_unmap_addr_set (rx_buff, addr, addr);dma_unmap_len_set (rx_buff, len,EMAC_BUFFER_SIZE );
Greg Kroah-Hartman
maintainerPATCH 20/56 ip6_tunnel: get the min mtu properly in ip6_tnl_xmit
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit c9fefa08190fc879fb2e681035d7774e0a8c5170 ]
Now it's using IPV6_MIN_MTU as the min mtu in ip6_tnl_xmit, but IPV6_MIN_MTU actually only works when the inner packet is ipv6.
With IPV6_MIN_MTU for ipv4 packets, the new pmtu for inner dst couldn't be set less than 1280. It would cause tx_err and the packet to be dropped when the outer dst pmtu is close to 1280.
Jianlin found it by running ipv4 traffic with the topo:
(client) gre6 <---> eth1 (route) eth2 <---> gre6 (server)
After changing eth2 mtu to 1300, the performance became very low, or the connection was even broken. The issue also affects ip4ip6 and ip6ip6 tunnels.
So if the inner packet is ipv4, 576 should be considered as the min mtu.
Note that for ip4ip6 and ip6ip6 tunnels, the inner packet can only be ipv4 or ipv6, but for gre6 tunnel, it may also be ARP. This patch using 576 as the min mtu for non-ipv6 packet works for all those cases.
--- net/ipv6/ip6_tunnel.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
net/ipv6/ip6_tunnel.c +7 -2
@@ -1127,8 +1127,13 @@ route_lookup: max_headroom +=8 ; mtu -=8 ; } -if (mtu <IPV6_MIN_MTU ) - mtu =IPV6_MIN_MTU ; +if (skb->protocol ==htons (ETH_P_IPV6 )) { +if (mtu <IPV6_MIN_MTU ) + mtu =IPV6_MIN_MTU ; + }else if (mtu <576 ) { + mtu =576 ; + } +if (skb_dst (skb) && !t->parms.collect_md)skb_dst (skb)->ops->update_pmtu (skb_dst (skb),NULL , skb, mtu);if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso (skb)) {
Greg Kroah-Hartman
maintainerPATCH 21/56 net: stmmac: Fix TX timestamp calculation
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fredrik Hallenberg <[email protected]>
[ Upstream commit 200922c93f008e03ddc804c6dacdf26ca1ba86d7 ]
When using GMAC4 the value written in PTP_SSIR should be shifted however the shifted value is also used in subsequent calculations which results in a bad timestamp value.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c +4 -2
@@ -38,6 +38,7 @@ static u32 stmmac_config_sub_second_incr {u32 value =readl (ioaddr +PTP_TCR );unsigned long data; +u32 reg_value;/* For GMAC3.x, 4.x versions, convert the ptp_clock to nano second * formula = (1/ptp_clock) * 1000000000
@@ -54,10 +55,11 @@ static u32 stmmac_config_sub_second_incr data &=PTP_SSIR_SSINC_MASK ; + reg_value = data;if (gmac4) - data = data <<GMAC4_PTP_SSIR_SSINC_SHIFT ; + reg_value <<=GMAC4_PTP_SSIR_SSINC_SHIFT ; -writel (data, ioaddr +PTP_SSIR ); +writel (reg_value, ioaddr +PTP_SSIR );return data; }
Greg Kroah-Hartman
maintainerPATCH 22/56 scsi: storvsc: Fix scsi_cmd error assignments in storvsc_handle_error
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cathy Avery <[email protected]>
[ Upstream commit d1b8b2391c24751e44f618fcf86fb55d9a9247fd ]
When an I/O is returned with an srb_status of SRB_STATUS_INVALID_LUN which has zero good_bytes it must be assigned an error. Otherwise the I/O will be continuously requeued and will cause a deadlock in the case where disks are being hot added and removed. sd_probe_async will wait forever for its I/O to complete while holding scsi_sd_probe_domain.
Also returning the default error of DID_TARGET_FAILURE causes multipath to not retry the I/O resulting in applications receiving I/O errors before a failover can occur.
--- drivers/scsi/storvsc_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/storvsc_drv.c +2 -1
@@ -915,10 +915,11 @@ static void storvsc_handle_error(structcase TEST_UNIT_READY :break ;default : -set_host_byte (scmnd,DID_TARGET_FAILURE ); +set_host_byte (scmnd,DID_ERROR ); }break ;case SRB_STATUS_INVALID_LUN : +set_host_byte (scmnd,DID_NO_CONNECT ); do_work = true; process_err_fn = storvsc_remove_lun;break ;
Greg Kroah-Hartman
maintainerPATCH 23/56 ARM: dts: ls1021a: fix incorrect clock references
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 506e8a912661c97b41adc8a286b875d01323ec45 ]
dtc warns about two 'clocks' properties that have an extraneous '1' at the end:
arch/arm/boot/dts/ls1021a-qds.dtb: Warning (clocks_property): arch/arm/boot/dts/ls1021a-twr.dtb: Warning (clocks_property): Property 'clocks', cell 1 is not a phandle reference in /soc/i2c@2180000/mux@77/i2c@4/sgtl5000@2a arch/arm/boot/dts/ls1021a-qds.dtb: Warning (clocks_property): Missing property '#clock-cells' in node /soc/interrupt-controller@1400000 or bad phandle (referred from /soc/i2c@2180000/mux@77/i2c@4/sgtl5000@2a:clocks[1]) Property 'clocks', cell 1 is not a phandle reference in /soc/i2c@2190000/sgtl5000@aarch/arm/boot/dts/ls1021a-twr.dtb: Warning (clocks_property): Missing property '#clock-cells' in node /soc/interrupt-controller@1400000 or bad phandle (referred from /soc/i2c@2190000/sgtl5000@a:clocks[1])
The clocks that get referenced here are fixed-rate, so they do not take any argument, and dtc interprets the next cell as a phandle, which is invalid.
--- arch/arm/boot/dts/ls1021a-qds.dts | 2 +- arch/arm/boot/dts/ls1021a-twr.dts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/ls1021a-qds.dts +1 -1
@@ -215,7 +215,7 @@ reg = <0x2a>; VDDA-supply = <®_3p3v>; VDDIO-supply = <®_3p3v>; - clocks = <&sys_mclk 1>; + clocks = <&sys_mclk>; }; }; };
arch/arm/boot/dts/ls1021a-twr.dts +1 -1
@@ -187,7 +187,7 @@ reg = <0x0a>; VDDA-supply = <®_3p3v>; VDDIO-supply = <®_3p3v>; - clocks = <&sys_mclk 1>; + clocks = <&sys_mclk>; }; };
Greg Kroah-Hartman
maintainerPATCH 24/56 lib/mpi: Fix umul_ppmm() for MIPS64r6
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
[ Upstream commit bbc25bee37d2b32cf3a1fab9195b6da3a185614a ]
Current MIPS64r6 toolchains aren't able to generate efficient DMULU/DMUHU based code for the C implementation of umul_ppmm(), which performs an unsigned 64 x 64 bit multiply and returns the upper and lower 64-bit halves of the 128-bit result. Instead it widens the 64-bit inputs to 128-bits and emits a __multi3 intrinsic call to perform a 128 x 128 multiply. This is both inefficient, and it results in a link error since we don't include __multi3 in MIPS linux.
For example commit 90a53e4432b1 ("cfg80211: implement regdb signature checking") merged in v4.15-rc1 recently broke the 64r6_defconfig and 64r6el_defconfig builds by indirectly selecting MPILIB. The same build errors can be reproduced on older kernels by enabling e.g. CRYPTO_RSA:
lib/mpi/generic_mpih-mul1.o: In function `mpihelp_mul_1':lib/mpi/generic_mpih-mul1.c:50: undefined reference to __multi3' lib/mpi/generic_mpih-mul2.o: In function mpihelp_addmul_1':lib/mpi/generic_mpih-mul2.c:49: undefined reference to __multi3' lib/mpi/generic_mpih-mul3.o: In function mpihelp_submul_1':lib/mpi/generic_mpih-mul3.c:49: undefined reference to __multi3' lib/mpi/mpih-div.o In function mpihelp_divrem':lib/mpi/mpih-div.c:205: undefined reference to __multi3' lib/mpi/mpih-div.c:142: undefined reference to __multi3'
Therefore add an efficient MIPS64r6 implementation of umul_ppmm() using inline assembly and the DMULU/DMUHU instructions, to prevent __multi3 calls being emitted.
--- lib/mpi/longlong.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
lib/mpi/longlong.h +17 -1
@@ -671,7 +671,23 @@ do { \************** MIPS/64 ************** ***************************************/ #if (defined(__mips) && __mips >=3 ) &&W_TYPE_SIZE ==64 -#if (__GNUC__ >=5 ) || (__GNUC__ >=4 && __GNUC_MINOR__ >=4 ) +#if defined(__mips_isa_rev) && __mips_isa_rev >=6 +/* +* GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C +* code below, so we special case MIPS64r6 until the compiler can do better. +*/ +#define umul_ppmm (w1, w0, u, v) \ +do { \ + __asm__ ("dmulu %0,%1,%2" \ + : "=d" ((UDItype)(w0)) \ + : "d" ((UDItype)(u)), \ + "d" ((UDItype)(v))); \ + __asm__ ("dmuhu %0,%1,%2" \ + : "=d" ((UDItype)(w1)) \ + : "d" ((UDItype)(u)), \ + "d" ((UDItype)(v))); \ +} while (0) +#elif (__GNUC__ >=5 ) || (__GNUC__ >=4 && __GNUC_MINOR__ >=4 )#define umul_ppmm (w1, w0, u, v) \ do { \ typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \
Greg Kroah-Hartman
maintainerPATCH 25/56 tipc: error path leak fixes in tipc_enable_bearer()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tommi Rantala <[email protected]>
[ Upstream commit 19142551b2be4a9e13838099fde1351386e5e007 ]
Fix memory leak in tipc_enable_bearer() if enable_media() fails, and cleanup with bearer_disable() if tipc_mon_create() fails.
--- net/tipc/bearer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/tipc/bearer.c +4 -1
@@ -322,6 +322,7 @@ restart:if (res) {pr_warn ("Bearer <%s> rejected, enable failure (%d)\n" , name, -res); +kfree (b);return -EINVAL ; }
@@ -345,8 +346,10 @@ restart:if (skb)tipc_bearer_xmit_skb (net, bearer_id, skb, &b->bcast_addr); -if (tipc_mon_create (net, bearer_id)) +if (tipc_mon_create (net, bearer_id)) { +bearer_disable (net, b);return -ENOMEM ; + } pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n", name,
Greg Kroah-Hartman
maintainerPATCH 26/56 tipc: fix tipc_mon_delete() oops in tipc_enable_bearer() error path
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tommi Rantala <[email protected]>
[ Upstream commit 642a8439ddd8423b92f2e71960afe21ee1f66bb6 ]
Calling tipc_mon_delete() before the monitor has been created will oops. This can happen in tipc_enable_bearer() error path if tipc_disc_create() fails.
[ 48.589074] BUG: unable to handle kernel paging request at 0000000000001008 [ 48.590266] IP: tipc_mon_delete+0xea/0x270 [tipc] [ 48.591223] PGD 1e60c5067 P4D 1e60c5067 PUD 1eb0cf067 PMD 0 [ 48.592230] Oops: 0000 [#1] SMP KASAN [ 48.595610] CPU: 5 PID: 1199 Comm: tipc Tainted: G B 4.15.0-rc4-pc64-dirty #5 [ 48.597176] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-2.fc27 04/01/2014 [ 48.598489] RIP: 0010:tipc_mon_delete+0xea/0x270 [tipc] [ 48.599347] RSP: 0018:ffff8801d827f668 EFLAGS: 00010282 [ 48.600705] RAX: ffff8801ee813f00 RBX: 0000000000000204 RCX: 0000000000000000 [ 48.602183] RDX: 1ffffffff1de6a75 RSI: 0000000000000297 RDI: 0000000000000297 [ 48.604373] RBP: 0000000000000000 R08: 0000000000000000 R09: fffffbfff1dd1533 [ 48.605607] R10: ffffffff8eafbb05 R11: fffffbfff1dd1534 R12: 0000000000000050 [ 48.607082] R13: dead000000000200 R14: ffffffff8e73f310 R15: 0000000000001020 [ 48.608228] FS: 00007fc686484800(0000) GS:ffff8801f5540000(0000) knlGS:0000000000000000 [ 48.610189] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 48.611459] CR2: 0000000000001008 CR3: 00000001dda70002 CR4: 00000000003606e0 [ 48.612759] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 48.613831] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 48.615038] Call Trace: [ 48.615635] tipc_enable_bearer+0x415/0x5e0 [tipc] [ 48.620623] tipc_nl_bearer_enable+0x1ab/0x200 [tipc] [ 48.625118] genl_family_rcv_msg+0x36b/0x570 [ 48.631233] genl_rcv_msg+0x5a/0xa0 [ 48.631867] netlink_rcv_skb+0x1cc/0x220 [ 48.636373] genl_rcv+0x24/0x40 [ 48.637306] netlink_unicast+0x29c/0x350 [ 48.639664] netlink_sendmsg+0x439/0x590 [ 48.642014] SYSC_sendto+0x199/0x250 [ 48.649912] do_syscall_64+0xfd/0x2c0 [ 48.650651] entry_SYSCALL64_slow_path+0x25/0x25 [ 48.651843] RIP: 0033:0x7fc6859848e3 [ 48.652539] RSP: 002b:00007ffd25dff938 EFLAGS: 00000246 ORIG_RAX: 000000000000002c [ 48.654003] RAX: ffffffffffffffda RBX: 00007ffd25dff990 RCX: 00007fc6859848e3 [ 48.655303] RDX: 0000000000000054 RSI: 00007ffd25dff990 RDI: 0000000000000003 [ 48.656512] RBP: 00007ffd25dff980 R08: 00007fc685c35fc0 R09: 000000000000000c [ 48.657697] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000d13010 [ 48.658840] R13: 00007ffd25e009c0 R14: 0000000000000000 R15: 0000000000000000 [ 48.662972] RIP: tipc_mon_delete+0xea/0x270 [tipc] RSP: ffff8801d827f668 [ 48.664073] CR2: 0000000000001008 [ 48.664576] ---[ end trace e811818d54d5ce88 ]---
--- net/tipc/monitor.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/tipc/monitor.c +5 -1
@@ -633,9 +633,13 @@ void tipc_mon_delete(struct net *net, in {struct tipc_net *tn =tipc_net (net);struct tipc_monitor *mon =tipc_monitor (net, bearer_id); -struct tipc_peer *self =get_self (net, bearer_id); +struct tipc_peer *self;struct tipc_peer *peer, *tmp; +if (!mon) +return ; + + self =get_self (net, bearer_id);write_lock_bh (&mon->lock); tn->monitors[bearer_id] =NULL ;list_for_each_entry_safe (peer, tmp, &self->list, list) {
Greg Kroah-Hartman
maintainerPATCH 27/56 tg3: Add workaround to restrict 5762 MRRS to 2048
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siva Reddy Kallam <[email protected]>
[ Upstream commit 4419bb1cedcda0272e1dc410345c5a1d1da0e367 ]
One of AMD based server with 5762 hangs with jumbo frame traffic. This AMD platform has southbridge limitation which is restricting MRRS to 4000. As a work around, driver to restricts the MRRS to 2048 for this particular 5762 NX1 card.
--- drivers/net/ethernet/broadcom/tg3.c | 10 ++++++++++ drivers/net/ethernet/broadcom/tg3.h | 4 ++++ 2 files changed, 14 insertions(+)
drivers/net/ethernet/broadcom/tg3.c +10 -0
@@ -10049,6 +10049,16 @@ static int tg3_reset_hw(struct tg3 *tp,tw32 (GRC_MODE , tp->grc_mode | val); +/* On one of the AMD platform, MRRS is restricted to 4000 because of +* south bridge limitation. As a workaround, Driver is setting MRRS +* to 2048 instead of default 4096. +*/ +if (tp->pdev->subsystem_vendor ==PCI_VENDOR_ID_DELL && + tp->pdev->subsystem_device ==TG3PCI_SUBDEVICE_ID_DELL_5762 ) { + val =tr32 (TG3PCI_DEV_STATUS_CTRL ) & ~MAX_READ_REQ_MASK ; +tw32 (TG3PCI_DEV_STATUS_CTRL , val |MAX_READ_REQ_SIZE_2048 ); + } +/* Setup the timer prescalar register. Clock is always 66Mhz. */ val =tr32 (GRC_MISC_CFG ); val &= ~0xff ;
drivers/net/ethernet/broadcom/tg3.h +4 -0
@@ -95,6 +95,7 @@#define TG3PCI_SUBDEVICE_ID_DELL_JAGUAR 0x0106#define TG3PCI_SUBDEVICE_ID_DELL_MERLOT 0x0109#define TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT 0x010a +#define TG3PCI_SUBDEVICE_ID_DELL_5762 0x07f0#define TG3PCI_SUBVENDOR_ID_COMPAQ PCI_VENDOR_ID_COMPAQ#define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE 0x007c#define TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2 0x009a
@@ -280,6 +281,9 @@#define TG3PCI_STD_RING_PROD_IDX 0x00000098/* 64-bit */ #define TG3PCI_RCV_RET_RING_CON_IDX 0x000000a0/* 64-bit */ /* 0xa8 --> 0xb8 unused */ +#define TG3PCI_DEV_STATUS_CTRL 0x000000b4 +#define MAX_READ_REQ_SIZE_2048 0x00004000 +#define MAX_READ_REQ_MASK 0x00007000#define TG3PCI_DUAL_MAC_CTRL 0x000000b8#define DUAL_MAC_CTRL_CH_MASK 0x00000003#define DUAL_MAC_CTRL_ID 0x00000004
Greg Kroah-Hartman
maintainerPATCH 28/56 tg3: Enable PHY reset in MTU change path for 5720
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siva Reddy Kallam <[email protected]>
[ Upstream commit e60ee41aaf898584205a6af5c996860d0fe6a836 ]
A customer noticed RX path hang when MTU is changed on the fly while running heavy traffic with NCSI enabled for 5717 and 5719. Since 5720 belongs to same ASIC family, we observed same issue and same fix could solve this problem for 5720.
--- drivers/net/ethernet/broadcom/tg3.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/tg3.c +2 -1
@@ -14238,7 +14238,8 @@ static int tg3_change_mtu(struct net_dev*/ if (tg3_asic_rev (tp) ==ASIC_REV_57766 ||tg3_asic_rev (tp) ==ASIC_REV_5717 || -tg3_asic_rev (tp) ==ASIC_REV_5719 ) +tg3_asic_rev (tp) ==ASIC_REV_5719 || +tg3_asic_rev (tp) ==ASIC_REV_5720 ) reset_phy = true; err =tg3_restart_hw (tp, reset_phy);
Greg Kroah-Hartman
maintainerPATCH 29/56 bnx2x: Improve reliability in case of nested PCI errors
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Guilherme G. Piccoli" <[email protected]>
[ Upstream commit f7084059a9cb9e56a186e1677b1dcffd76c2cd24 ]
While in recovery process of PCI error (called EEH on PowerPC arch), another PCI transaction could be corrupted causing a situation of nested PCI errors. Also, this scenario could be reproduced with error injection mechanisms (for debug purposes).
We observe that in case of nested PCI errors, bnx2x might attempt to initialize its shmem and cause a kernel crash due to bad addresses read from MCP. Multiple different stack traces were observed depending on the point the second PCI error happens.
This patch avoids the crashes by:
* failing PCI recovery in case of nested errors (since multiple PCI errors in a row are not expected to lead to a functional adapter anyway), and by,
* preventing access to adapter FW when MCP is failed (we mark it as failed when shmem cannot get initialized properly).
--- drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 4 ++-- drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-)
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +2 -2
@@ -3034,7 +3034,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, idel_timer_sync (&bp->timer); -if (IS_PF (bp)) { +if (IS_PF (bp) && !BP_NOMCP (bp)) {/* Set ALWAYS_ALIVE bit in shmem */ bp->fw_drv_pulse_wr_seq |=DRV_PULSE_ALWAYS_ALIVE ;bnx2x_drv_pulse (bp);
@@ -3120,7 +3120,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, i bp->cnic_loaded = false;/* Clear driver version indication in shmem */ -if (IS_PF (bp)) +if (IS_PF (bp) && !BP_NOMCP (bp))bnx2x_update_mng_version (bp);/* Check if there are pending parity attentions. If there are - set
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +13 -1
@@ -9578,6 +9578,15 @@ static int bnx2x_init_shmem(struct bnx2x do { bp->common.shmem_base = REG_RD(bp, MISC_REG_SHARED_MEM_ADDR); + + /* If we read all 0xFFs, means we are in PCI error state and + * should bail out to avoid crashes on adapter's FW reads. + */ + if (bp->common.shmem_base == 0xFFFFFFFF) { + bp->flags |= NO_MCP_FLAG; + return -ENODEV; + } + if (bp->common.shmem_base) { val = SHMEM_RD(bp, validity_map[BP_PORT(bp)]); if (val & SHR_MEM_VALIDITY_MB)
@@ -14312,7 +14321,10 @@ static pci_ers_result_t bnx2x_io_slot_reBNX2X_ERR ("IO slot reset --> driver unload\n" );/* MCP should have been reset; Need to wait for validity */ -bnx2x_init_shmem (bp); +if (bnx2x_init_shmem (bp)) { +rtnl_unlock (); +return PCI_ERS_RESULT_DISCONNECT ; + }if (IS_PF (bp) &&SHMEM2_HAS (bp, drv_capabilities_flag)) {u32 v;
Greg Kroah-Hartman
maintainerPATCH 30/56 led: core: Fix brightness setting when setting delay_off=0
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu CASTET <[email protected]>
[ Upstream commit 2b83ff96f51d0b039c4561b9f95c824d7bddb85c ]
With the current code, the following sequence won't work :
echo timer > trigger
echo 0 > delay_off
* at this point we call
** led_delay_off_store
** led_blink_set
--- drivers/leds/led-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/leds/led-core.c +1 -1
@@ -186,7 +186,7 @@ void led_blink_set(struct led_classdev *unsigned long *delay_on, unsigned long *delay_off) { - del_timer_sync(&led_cdev->blink_timer); +led_stop_software_blink (led_cdev ); led_cdev->flags &= ~LED_BLINK_ONESHOT ; led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP ;
Greg Kroah-Hartman
maintainerPATCH 31/56 IB/mlx5: Fix mlx5_ib_alloc_mr error flow
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nitzan Carmi <[email protected]>
[ Upstream commit 45e6ae7ef21b907dacb18da62d5787d74a31d860 ]
ibmr.device is being set only after ib_alloc_mr() is (successfully) complete. Therefore, in case mlx5_core_create_mkey() return with error, the error flow calls mlx5_free_priv_descs() which uses ibmr.device (which doesn't exist yet), causing a NULL dereference oops.
To fix this, the IB device should be set in the mr struct earlier stage (e.g. prior to calling mlx5_core_create_mkey()).
--- drivers/infiniband/hw/mlx5/mr.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/hw/mlx5/mr.c +1 -0
@@ -1648,6 +1648,7 @@ struct ib_mr *mlx5_ib_alloc_mr(struct ibMLX5_SET (mkc, mkc, access_mode, mr->access_mode);MLX5_SET (mkc, mkc, umr_en,1 ); + mr->ibmr.device = pd->device; err =mlx5_core_create_mkey (dev->mdev, &mr->mmkey, in, inlen);if (err) goto err_destroy_psv;
Greg Kroah-Hartman
maintainerPATCH 32/56 genirq: Guard handle_bad_irq log messages
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit 11bca0a83f83f6093d816295668e74ef24595944 ]
An interrupt storm on a bad interrupt will cause the kernel log to be clogged.
[ 60.089234] ->handle_irq(): ffffffffbe2f803f, [ 60.090455] 0xffffffffbf2af380 [ 60.090510] handle_bad_irq+0x0/0x2e5 [ 60.090522] ->irq_data.chip(): ffffffffbf2af380, [ 60.090553] IRQ_NOPROBE set [ 60.090584] ->handle_irq(): ffffffffbe2f803f, [ 60.090590] handle_bad_irq+0x0/0x2e5 [ 60.090596] ->irq_data.chip(): ffffffffbf2af380, [ 60.090602] 0xffffffffbf2af380 [ 60.090608] ->action(): (null) [ 60.090779] handle_bad_irq+0x0/0x2e5
This was seen when running an upstream kernel on Acer Chromebook R11. The system was unstable as result.
Guard the log message with __printk_ratelimit to reduce the impact. This won't prevent the interrupt storm from happening, but at least the system remains stable.
--- kernel/irq/debug.h | 5 +++++ 1 file changed, 5 insertions(+)
kernel/irq/debug.h +5 -0
@@ -11,6 +11,11 @@static inline void print_irq_desc (unsigned int irq,struct irq_desc *desc) { + static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5); + +if (!__ratelimit (&ratelimit)) +return ; +printk ("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n" , irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled);printk ("->handle_irq(): %p, " , desc->handle_irq);
Greg Kroah-Hartman
maintainerPATCH 33/56 s390/dasd: fix wrongly assigned configuration data
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Haberland <[email protected]>
[ Upstream commit 8a9bd4f8ebc6800bfc0596e28631ff6809a2f615 ]
We store per path and per device configuration data to identify the path or device correctly. The per path configuration data might get mixed up if the original request gets into error recovery and is started with a random path mask.
This would lead to a wrong identification of a path in case of a CUIR event for example.
Fix by copying the path mask from the original request to the error recovery request in case it is a path verification request.
--- drivers/s390/block/dasd_3990_erp.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/s390/block/dasd_3990_erp.c +10 -0
@@ -2755,6 +2755,16 @@ dasd_3990_erp_action(struct dasd_ccw_req erp =dasd_3990_erp_handle_match_erp (cqr, erp); } + +/* +* For path verification work we need to stick with the path that was +* originally chosen so that the per path configuration data is +* assigned correctly. +*/ +if (test_bit (DASD_CQR_VERIFY_PATH , &erp->flags) && cqr->lpm) { + erp->lpm = cqr->lpm; + } +if (device->features &DASD_FEATURE_ERPLOG ) {/* print current erp_chain */ dev_err(&device->cdev->dev,
Greg Kroah-Hartman
maintainerPATCH 34/56 IB/mlx4: Fix mlx4_ib_alloc_mr error flow
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
[ Upstream commit 5a371cf87e145b86efd32007e46146e78c1eff6d ]
ibmr.device is being set only after ib_alloc_mr() is successfully complete. Therefore, in case imlx4_mr_enable() returns with error, the error flow unwinder calls to mlx4_free_priv_pages(), which uses ibmr.device.
Such usage causes to NULL dereference oops and to fix it, the IB device should be set in the mr struct earlier stage (e.g. prior to calling mlx4_free_priv_pages()).
--- drivers/infiniband/hw/mlx4/mr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mlx4/mr.c +1 -1
@@ -406,7 +406,6 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ib goto err_free_mr; mr->max_pages = max_num_sg; - err =mlx4_mr_enable (dev->dev, &mr->mmr);if (err) goto err_free_pl;
@@ -417,6 +416,7 @@ struct ib_mr *mlx4_ib_alloc_mr(struct ibreturn &mr->ibmr; err_free_pl: + mr->ibmr.device = pd->device;mlx4_free_priv_pages (mr); err_free_mr: (void )mlx4_mr_free (dev->dev, &mr->mmr);
Greg Kroah-Hartman
maintainerPATCH 35/56 IB/ipoib: Fix race condition in neigh creation
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Erez Shitrit <[email protected]>
[ Upstream commit 16ba3defb8bd01a9464ba4820a487f5b196b455b ]
When using enhanced mode for IPoIB, two threads may execute xmit in parallel to two different TX queues while the target is the same. In this case, both of them will add the same neighbor to the path's neigh link list and we might see the following message:
list_add double add: new=ffff88024767a348, prev=ffff88024767a348...
WARNING: lib/list_debug.c:31__list_add_valid+0x4e/0x70 ipoib_start_xmit+0x477/0x680 [ib_ipoib] dev_hard_start_xmit+0xb9/0x3e0 sch_direct_xmit+0xf9/0x250 __qdisc_run+0x176/0x5d0 __dev_queue_xmit+0x1f5/0xb10 __dev_queue_xmit+0x55/0xb10
Analysis:
Two SKB are scheduled to be transmitted from two cores.
In ipoib_start_xmit, both gets NULL when calling ipoib_neigh_get. Two calls to neigh_add_path are made. One thread takes the spin-lock and calls ipoib_neigh_alloc which creates the neigh structure, then (after the __path_find) the neigh is added to the path's neigh link list. When the second thread enters the critical section it also calls ipoib_neigh_alloc but in this case it gets the already allocated ipoib_neigh structure, which is already linked to the path's neigh link list and adds it again to the list. Which beside of triggering the list, it creates a loop in the linked list. This loop leads to endless loop inside path_rec_completion.
Solution:
Check list_empty(&neigh->list) before adding to the list. Add a similar fix in "ipoib_multicast.c::ipoib_mcast_send"
--- drivers/infiniband/ulp/ipoib/ipoib_main.c | 25 ++++++++++++++++++------- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 5 ++++- 2 files changed, 22 insertions(+), 8 deletions(-)
drivers/infiniband/ulp/ipoib/ipoib_main.c +18 -7
@@ -919,8 +919,8 @@ static int path_rec_start(struct net_devreturn 0 ; } -static void neigh_add_path (struct sk_buff *skb,u8 *daddr, -struct net_device *dev) +static struct ipoib_neigh *neigh_add_path (struct sk_buff *skb,u8 *daddr, +struct net_device *dev) {struct ipoib_dev_priv *priv =netdev_priv (dev);struct ipoib_path *path;
@@ -933,7 +933,15 @@ static void neigh_add_path(struct sk_bufspin_unlock_irqrestore (&priv->lock, flags); ++dev->stats.tx_dropped;dev_kfree_skb_any (skb); -return ; +return NULL ; + } + +/* To avoid race condition, make sure that the +* neigh will be added only once. +*/ +if (unlikely (!list_empty (&neigh->list))) { +spin_unlock_irqrestore (&priv->lock, flags); +return neigh; } path =__path_find (dev, daddr +4 );
@@ -971,7 +979,7 @@ static void neigh_add_path(struct sk_bufspin_unlock_irqrestore (&priv->lock, flags);ipoib_send (dev, skb, path->ah,IPOIB_QPN (daddr));ipoib_neigh_put (neigh); -return ; +return NULL ; } }else { neigh->ah =NULL ;
@@ -988,7 +996,7 @@ static void neigh_add_path(struct sk_bufspin_unlock_irqrestore (&priv->lock, flags);ipoib_neigh_put (neigh); -return ; +return NULL ; err_path:ipoib_neigh_free (neigh);
@@ -998,6 +1006,8 @@ err_drop:spin_unlock_irqrestore (&priv->lock, flags);ipoib_neigh_put (neigh); + +return NULL ; } static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
@@ -1103,8 +1113,9 @@ static int ipoib_start_xmit(struct sk_bucase htons (ETH_P_TIPC ): neigh =ipoib_neigh_get (dev, phdr->hwaddr);if (unlikely (!neigh)) { -neigh_add_path (skb, phdr->hwaddr, dev); -return NETDEV_TX_OK ; + neigh =neigh_add_path (skb, phdr->hwaddr, dev); +if (likely (!neigh)) +return NETDEV_TX_OK ; }break ;case htons (ETH_P_ARP ):
drivers/infiniband/ulp/ipoib/ipoib_multicast.c +4 -1
@@ -818,7 +818,10 @@ void ipoib_mcast_send(struct net_devicespin_lock_irqsave (&priv->lock, flags);if (!neigh) { neigh =ipoib_neigh_alloc (daddr, dev); -if (neigh) { +/* Make sure that the neigh will be added only +* once to mcast list. +*/ +if (neigh &&list_empty (&neigh->list)) {kref_get (&mcast->ah->ref); neigh->ah = mcast->ah;list_add_tail (&neigh->list, &mcast->neigh_list);
Greg Kroah-Hartman
maintainerPATCH 36/56 xfs: quota: fix missed destroy of qi_tree_lock
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aliaksei Karaliou <[email protected]>
[ Upstream commit 2196881566225f3c3428d1a5f847a992944daa5b ]
xfs_qm_destroy_quotainfo() does not destroy quotainfo->qi_tree_lock while destroys quotainfo->qi_quotaofflock.
--- fs/xfs/xfs_qm.c | 1 + 1 file changed, 1 insertion(+)
fs/xfs/xfs_qm.c +1 -0
@@ -735,6 +735,7 @@ xfs_qm_destroy_quotainfo(IRELE (qi->qi_pquotaip); qi->qi_pquotaip =NULL ; } +mutex_destroy (&qi->qi_tree_lock);mutex_destroy (&qi->qi_quotaofflock);kmem_free (qi); mp->m_quotainfo =NULL ;
Greg Kroah-Hartman
maintainerPATCH 37/56 xfs: quota: check result of register_shrinker()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aliaksei Karaliou <[email protected]>
[ Upstream commit 3a3882ff26fbdbaf5f7e13f6a0bccfbf7121041d ]
xfs_qm_init_quotainfo() does not check result of register_shrinker() which was tagged as __must_check recently, reported by sparse.
--- fs/xfs/xfs_qm.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-)
fs/xfs/xfs_qm.c +29 -16
@@ -47,7 +47,7 @@ STATIC int xfs_qm_init_quotainos(xfs_mount_t *); STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); - +STATIC void xfs_qm_destroy_quotainos(xfs_quotainfo_t *qi); STATIC void xfs_qm_dqfree_one(struct xfs_dquot *dqp);/* * We use the batch lookup interface to iterate over the dquots as it
@@ -694,9 +694,17 @@ xfs_qm_init_quotainfo( qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan; qinf->qi_shrinker.seeks =DEFAULT_SEEKS ; qinf->qi_shrinker.flags =SHRINKER_NUMA_AWARE ; -register_shrinker (&qinf->qi_shrinker); + + error =register_shrinker (&qinf->qi_shrinker); +if (error) + goto out_free_inos; +return 0 ; +out_free_inos: +mutex_destroy (&qinf->qi_quotaofflock); +mutex_destroy (&qinf->qi_tree_lock); +xfs_qm_destroy_quotainos (qinf); out_free_lru:list_lru_destroy (&qinf->qi_lru); out_free_qinf:
@@ -705,7 +713,6 @@ out_free_qinf:return error; } -/* * Gets called when unmounting a filesystem or when all quotas get * turned off.
@@ -722,19 +729,7 @@ xfs_qm_destroy_quotainfo(unregister_shrinker (&qi->qi_shrinker);list_lru_destroy (&qi->qi_lru); - -if (qi->qi_uquotaip) { -IRELE (qi->qi_uquotaip); - qi->qi_uquotaip =NULL ;/* paranoia */ - } -if (qi->qi_gquotaip) { -IRELE (qi->qi_gquotaip); - qi->qi_gquotaip =NULL ; - } -if (qi->qi_pquotaip) { -IRELE (qi->qi_pquotaip); - qi->qi_pquotaip =NULL ; - } +xfs_qm_destroy_quotainos (qi);mutex_destroy (&qi->qi_tree_lock);mutex_destroy (&qi->qi_quotaofflock);kmem_free (qi);
@@ -1621,6 +1616,24 @@ error_rele: } STATIC void +xfs_qm_destroy_quotainos ( +xfs_quotainfo_t *qi) +{ +if (qi->qi_uquotaip) { +IRELE (qi->qi_uquotaip); + qi->qi_uquotaip =NULL ;/* paranoia */ + } +if (qi->qi_gquotaip) { +IRELE (qi->qi_gquotaip); + qi->qi_gquotaip =NULL ; + } +if (qi->qi_pquotaip) { +IRELE (qi->qi_pquotaip); + qi->qi_pquotaip =NULL ; + } +} + +STATIC voidxfs_qm_dqfree_one (struct xfs_dquot *dqp) {
Greg Kroah-Hartman
maintainerPATCH 38/56 macvlan: Fix one possible double free
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Feng <[email protected]>
[ Upstream commit d02fd6e7d2933ede6478a15f9e4ce8a93845824e ]
Because the macvlan_uninit would free the macvlan port, so there is one double free case in macvlan_common_newlink. When the macvlan port is just created, then register_netdevice or netdev_upper_dev_link failed and they would invoke macvlan_uninit. Then it would reach the macvlan_port_destroy which triggers the double free.
--- drivers/net/macvlan.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/macvlan.c +6 -1
@@ -1377,9 +1377,14 @@ int macvlan_common_newlink(struct net *sreturn 0 ; unregister_netdev: +/* macvlan_uninit would free the macvlan port */ unregister_netdevice (dev); +return err; destroy_macvlan_port: -if (create) +/* the macvlan port may be freed by macvlan_uninit when fail to register. +* so we destroy the macvlan port only when it's valid. +*/ +if (create &&macvlan_port_get_rtnl (dev))macvlan_port_destroy (port->dev);return err; }
Greg Kroah-Hartman
maintainerPATCH 39/56 e1000: fix disabling already-disabled warning
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tushar Dave <[email protected]>
[ Upstream commit 0b76aae741abb9d16d2c0e67f8b1e766576f897d ]
This patch adds check so that driver does not disable already disabled device.
[ 44.637743] advantechwdt: Unexpected close, not stopping watchdog! [ 44.997548] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input6 [ 45.013419] e1000 0000:00:03.0: disabling already-disabled device [ 45.013447] ------------[ cut here ]------------ [ 45.014868] WARNING: CPU: 1 PID: 71 at drivers/pci/pci.c:1641 pci_disable_device+0xa1/0x105: pci_disable_device at drivers/pci/pci.c:1640 [ 45.016171] CPU: 1 PID: 71 Comm: rcu_perf_shutdo Not tainted 4.14.0-01330-g3c07399 #1 [ 45.017197] task: ffff88011bee9e40 task.stack: ffffc90000860000 [ 45.017987] RIP: 0010:pci_disable_device+0xa1/0x105: pci_disable_device at drivers/pci/pci.c:1640 [ 45.018603] RSP: 0000:ffffc90000863e30 EFLAGS: 00010286 [ 45.019282] RAX: 0000000000000035 RBX: ffff88013a230008 RCX: 0000000000000000 [ 45.020182] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000203 [ 45.021084] RBP: ffff88013a3f31e8 R08: 0000000000000001 R09: 0000000000000000 [ 45.021986] R10: ffffffff827ec29c R11: 0000000000000002 R12: 0000000000000001 [ 45.022946] R13: ffff88013a230008 R14: ffff880117802b20 R15: ffffc90000863e8f [ 45.023842] FS: 0000000000000000(0000) GS:ffff88013fd00000(0000) knlGS:0000000000000000 [ 45.024863] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 45.025583] CR2: ffffc900006d4000 CR3: 000000000220f000 CR4: 00000000000006a0 [ 45.026478] Call Trace: [ 45.026811] __e1000_shutdown+0x1d4/0x1e2: __e1000_shutdown at drivers/net/ethernet/intel/e1000/e1000_main.c:5162 [ 45.027344] ? rcu_perf_cleanup+0x2a1/0x2a1: rcu_perf_shutdown at kernel/rcu/rcuperf.c:627 [ 45.027883] e1000_shutdown+0x14/0x3a: e1000_shutdown at drivers/net/ethernet/intel/e1000/e1000_main.c:5235 [ 45.028351] device_shutdown+0x110/0x1aa: device_shutdown at drivers/base/core.c:2807 [ 45.028858] kernel_power_off+0x31/0x64: kernel_power_off at kernel/reboot.c:260 [ 45.029343] rcu_perf_shutdown+0x9b/0xa7: rcu_perf_shutdown at kernel/rcu/rcuperf.c:637 [ 45.029852] ? __wake_up_common_lock+0xa2/0xa2: autoremove_wake_function at kernel/sched/wait.c:376 [ 45.030414] kthread+0x126/0x12e: kthread at kernel/kthread.c:233 [ 45.030834] ? __kthread_bind_mask+0x8e/0x8e: kthread at kernel/kthread.c:190 [ 45.031399] ? ret_from_fork+0x1f/0x30: ret_from_fork at arch/x86/entry/entry_64.S:443 [ 45.031883] ? kernel_init+0xa/0xf5: kernel_init at init/main.c:997 [ 45.032325] ret_from_fork+0x1f/0x30: ret_from_fork at arch/x86/entry/entry_64.S:443 [ 45.032777] Code: 00 48 85 ed 75 07 48 8b ab a8 00 00 00 48 8d bb 98 00 00 00 e8 aa d1 11 00 48 89 ea 48 89 c6 48 c7 c7 d8 e4 0b 82 e8 55 7d da ff <0f> ff b9 01 00 00 00 31 d2 be 01 00 00 00 48 c7 c7 f0 b1 61 82 [ 45.035222] ---[ end trace c257137b1b1976ef ]--- [ 45.037838] ACPI: Preparing to enter system sleep state S5
--- drivers/net/ethernet/intel/e1000/e1000.h | 3 +- drivers/net/ethernet/intel/e1000/e1000_main.c | 27 +++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/e1000/e1000.h +2 -1
@@ -331,7 +331,8 @@ struct e1000_adapter {enum e1000_state_t { __E1000_TESTING, __E1000_RESETTING, - __E1000_DOWN + __E1000_DOWN, + __E1000_DISABLED };#undef pr_fmt
drivers/net/ethernet/intel/e1000/e1000_main.c +22 -5
@@ -940,7 +940,7 @@ static int e1000_init_hw_struct(struct estatic int e1000_probe (struct pci_dev *pdev,const struct pci_device_id *ent) {struct net_device *netdev; -struct e1000_adapter *adapter; +struct e1000_adapter *adapter =NULL ;struct e1000_hw *hw;static int cards_found;
@@ -950,6 +950,7 @@ static int e1000_probe(struct pci_dev *pu16 tmp =0 ;u16 eeprom_apme_mask =E1000_EEPROM_APME ;int bars, need_ioport; +bool disable_dev = false;/* do not allocate ioport bars when not needed */ need_ioport =e1000_is_need_ioport (pdev);
@@ -1250,11 +1251,13 @@ err_mdio_ioremap:iounmap (hw->ce4100_gbe_mdio_base_virt);iounmap (hw->hw_addr); err_ioremap: + disable_dev = !test_and_set_bit (__E1000_DISABLED, &adapter->flags);free_netdev (netdev); err_alloc_etherdev:pci_release_selected_regions (pdev, bars); err_pci_reg: -pci_disable_device (pdev); +if (!adapter || disable_dev) +pci_disable_device (pdev);return err; }
@@ -1272,6 +1275,7 @@ static void e1000_remove(struct pci_devstruct net_device *netdev =pci_get_drvdata (pdev);struct e1000_adapter *adapter =netdev_priv (netdev);struct e1000_hw *hw = &adapter->hw; +bool disable_dev;e1000_down_and_stop (adapter);e1000_release_manageability (adapter);
@@ -1290,9 +1294,11 @@ static void e1000_remove(struct pci_deviounmap (hw->flash_address);pci_release_selected_regions (pdev, adapter->bars); + disable_dev = !test_and_set_bit (__E1000_DISABLED, &adapter->flags);free_netdev (netdev); -pci_disable_device (pdev); +if (disable_dev) +pci_disable_device (pdev); }/**
@@ -5166,7 +5172,8 @@ static int __e1000_shutdown(struct pci_dif (netif_running (netdev))e1000_free_irq (adapter); -pci_disable_device (pdev); +if (!test_and_set_bit (__E1000_DISABLED, &adapter->flags)) +pci_disable_device (pdev);return 0 ; }
@@ -5210,6 +5217,10 @@ static int e1000_resume(struct pci_dev *pr_err ("Cannot enable PCI device from suspend\n" );return err; } + +/* flush memory to make sure state is correct */ +smp_mb__before_atomic (); +clear_bit (__E1000_DISABLED, &adapter->flags);pci_set_master (pdev);pci_enable_wake (pdev, PCI_D3hot,0 );
@@ -5284,7 +5295,9 @@ static pci_ers_result_t e1000_io_error_dif (netif_running (netdev))e1000_down (adapter); -pci_disable_device (pdev); + +if (!test_and_set_bit (__E1000_DISABLED, &adapter->flags)) +pci_disable_device (pdev);/* Request a slot slot reset. */ return PCI_ERS_RESULT_NEED_RESET ;
@@ -5312,6 +5325,10 @@ static pci_ers_result_t e1000_io_slot_repr_err ("Cannot re-enable PCI device after reset.\n" );return PCI_ERS_RESULT_DISCONNECT ; } + +/* flush memory to make sure state is correct */ +smp_mb__before_atomic (); +clear_bit (__E1000_DISABLED, &adapter->flags);pci_set_master (pdev);pci_enable_wake (pdev, PCI_D3hot,0 );
Greg Kroah-Hartman
maintainerPATCH 40/56 NET: usb: qmi_wwan: add support for YUGA CLM920-NC5 PID 0x9625
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: "SZ Lin (林上智)" <[email protected]>
[ Upstream commit bd30ffc414e55194ed6149fad69a145550cb7c18 ]
This patch adds support for PID 0x9625 of YUGA CLM920-NC5.
YUGA CLM920-NC5 needs to enable QMI_WWAN_QUIRK_DTR before QMI operation.
qmicli -d /dev/cdc-wdm0 -p --dms-get-revision
[/dev/cdc-wdm0] Device revision retrieved:
Revision: 'CLM920_NC5-V1 1 [Oct 23 2016 19:00:00]'
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -805,6 +805,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x05c6, 0x9084, 4)}, {QMI_FIXED_INTF(0x05c6, 0x920d, 0)}, {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, + {QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */ {QMI_FIXED_INTF(0x0846, 0x68a2, 8)}, {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */
Greg Kroah-Hartman
maintainerPATCH 41/56 drm/ttm: check the return value of kzalloc
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiongwei Song <[email protected]>
[ Upstream commit 19d859a7205bc59ffc38303eb25ae394f61d21dc ]
In the function ttm_page_alloc_init, kzalloc call is made for variable _manager, we need to check its return value, it may return NULL.
--- drivers/gpu/drm/ttm/ttm_page_alloc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/ttm/ttm_page_alloc.c +2 -0
@@ -818,6 +818,8 @@ int ttm_page_alloc_init(struct ttm_mem_gpr_info ("Initializing pool allocator\n" ); _manager =kzalloc (sizeof (*_manager),GFP_KERNEL ); +if (!_manager) +return -ENOMEM ;ttm_page_pool_init_locked (&_manager->wc_pool,GFP_HIGHUSER ,"wc" );
Greg Kroah-Hartman
maintainerPATCH 42/56 uapi libc compat: add fallback for unsupported libcs
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Janda <[email protected]>
[ Upstream commit c0bace798436bca0fdc221ff61143f1376a9c3de ]
libc-compat.h aims to prevent symbol collisions between uapi and libc headers for each supported libc. This requires continuous coordination between them.
The goal of this commit is to improve the situation for libcs (such as musl) which are not yet supported and/or do not wish to be explicitly supported, while not affecting supported libcs. More precisely, with this commit, unsupported libcs can request the suppression of any specific uapi definition by defining the correspondings _UAPI_DEF_* macro as 0. This can fix symbol collisions for them, as long as the libc headers are included before the uapi headers. Inclusion in the other order is outside the scope of this commit.
All infrastructure in order to enable this fallback for unsupported libcs is already in place, except that libc-compat.h unconditionally defines all _UAPI_DEF_* macros to 1 for all unsupported libcs so that any previous definitions are ignored. In order to fix this, this commit merely makes these definitions conditional.
This commit together with the musl libc commit
http://git.musl-libc.org/cgit/musl/commit/?id=04983f2272382af92eb8f8838964ff944fbb8258
fixes for example the following compiler errors when <linux/in6.h> is included after musl's <netinet/in.h>:
./linux/in6.h:32:8: error: redefinition of 'struct in6_addr' ./linux/in6.h:49:8: error: redefinition of 'struct sockaddr_in6' ./linux/in6.h:59:8: error: redefinition of 'struct ipv6_mreq'
The comments referencing glibc are still correct, but this file is not only used for glibc any more.
--- include/uapi/linux/libc-compat.h | 55 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-)
include/uapi/linux/libc-compat.h +54 -1
@@ -167,46 +167,99 @@/* If we did not see any headers from any supported C libraries, * or we are being included in the kernel, then define everything -* that we need. */ +* that we need. Check for previous __UAPI_* definitions to give +* unsupported C libraries a way to opt out of any kernel definition. */ #else /* !defined(__GLIBC__) */ /* Definitions for if.h */ +#ifndef __UAPI_DEF_IF_IFCONF#define __UAPI_DEF_IF_IFCONF 1 +#endif +#ifndef __UAPI_DEF_IF_IFMAP#define __UAPI_DEF_IF_IFMAP 1 +#endif +#ifndef __UAPI_DEF_IF_IFNAMSIZ#define __UAPI_DEF_IF_IFNAMSIZ 1 +#endif +#ifndef __UAPI_DEF_IF_IFREQ#define __UAPI_DEF_IF_IFREQ 1 +#endif /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 +#endif /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 +#endif /* Definitions for in.h */ +#ifndef __UAPI_DEF_IN_ADDR#define __UAPI_DEF_IN_ADDR 1 +#endif +#ifndef __UAPI_DEF_IN_IPPROTO#define __UAPI_DEF_IN_IPPROTO 1 +#endif +#ifndef __UAPI_DEF_IN_PKTINFO#define __UAPI_DEF_IN_PKTINFO 1 +#endif +#ifndef __UAPI_DEF_IP_MREQ#define __UAPI_DEF_IP_MREQ 1 +#endif +#ifndef __UAPI_DEF_SOCKADDR_IN#define __UAPI_DEF_SOCKADDR_IN 1 +#endif +#ifndef __UAPI_DEF_IN_CLASS#define __UAPI_DEF_IN_CLASS 1 +#endif /* Definitions for in6.h */ +#ifndef __UAPI_DEF_IN6_ADDR#define __UAPI_DEF_IN6_ADDR 1 +#endif +#ifndef __UAPI_DEF_IN6_ADDR_ALT#define __UAPI_DEF_IN6_ADDR_ALT 1 +#endif +#ifndef __UAPI_DEF_SOCKADDR_IN6#define __UAPI_DEF_SOCKADDR_IN6 1 +#endif +#ifndef __UAPI_DEF_IPV6_MREQ#define __UAPI_DEF_IPV6_MREQ 1 +#endif +#ifndef __UAPI_DEF_IPPROTO_V6#define __UAPI_DEF_IPPROTO_V6 1 +#endif +#ifndef __UAPI_DEF_IPV6_OPTIONS#define __UAPI_DEF_IPV6_OPTIONS 1 +#endif +#ifndef __UAPI_DEF_IN6_PKTINFO#define __UAPI_DEF_IN6_PKTINFO 1 +#endif +#ifndef __UAPI_DEF_IP6_MTUINFO#define __UAPI_DEF_IP6_MTUINFO 1 +#endif /* Definitions for ipx.h */ +#ifndef __UAPI_DEF_SOCKADDR_IPX#define __UAPI_DEF_SOCKADDR_IPX 1 +#endif +#ifndef __UAPI_DEF_IPX_ROUTE_DEFINITION#define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 +#endif +#ifndef __UAPI_DEF_IPX_INTERFACE_DEFINITION#define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 +#endif +#ifndef __UAPI_DEF_IPX_CONFIG_DATA#define __UAPI_DEF_IPX_CONFIG_DATA 1 +#endif +#ifndef __UAPI_DEF_IPX_ROUTE_DEF#define __UAPI_DEF_IPX_ROUTE_DEF 1 +#endif /* Definitions for xattr.h */ +#ifndef __UAPI_DEF_XATTR#define __UAPI_DEF_XATTR 1 +#endif #endif /* __GLIBC__ */
Greg Kroah-Hartman
maintainerPATCH 43/56 i40e/i40evf: Account for frags split over multiple descriptors in check linearize
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Duyck <[email protected]>
[ Upstream commit 248de22e638f10bd5bfc7624a357f940f66ba137 ]
The original code for __i40e_chk_linearize didn't take into account the fact that if a fragment is 16K in size or larger it has to be split over 2 descriptors and the smaller of those 2 descriptors will be on the trailing edge of the transmit. As a result we can get into situations where we didn't catch requests that could result in a Tx hang.
This patch takes care of that by subtracting the length of all but the trailing edge of the stale fragment before we test for sum. By doing this we can guarantee that we have all cases covered, including the case of a fragment that spans multiple descriptors. We don't need to worry about checking the inner portions of this since 12K is the maximum aligned DMA size and that is larger than any MSS will ever be since the MTU limit for jumbos is something on the order of 9K.
--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 26 +++++++++++++++++++++++--- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 26 +++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +23 -3
@@ -2670,10 +2670,30 @@ bool __i40e_chk_linearize(struct sk_buff/* Walk through fragments adding latest fragment, testing it, and * then removing stale fragments from the sum. */ - stale = &skb_shinfo (skb)->frags[0 ]; -for (;;) { +for (stale = &skb_shinfo (skb)->frags[0 ];; stale++) { +int stale_size =skb_frag_size (stale); + sum +=skb_frag_size (frag++); +/* The stale fragment may present us with a smaller +* descriptor than the actual fragment size. To account +* for that we need to remove all the data on the front and +* figure out what the remainder would be in the last +* descriptor associated with the fragment. +*/ +if (stale_size >I40E_MAX_DATA_PER_TXD ) { +int align_pad = -(stale->page_offset) & + (I40E_MAX_READ_REQ_SIZE -1 ); + + sum -= align_pad; + stale_size -= align_pad; + +do { + sum -=I40E_MAX_DATA_PER_TXD_ALIGNED ; + stale_size -=I40E_MAX_DATA_PER_TXD_ALIGNED ; + }while (stale_size >I40E_MAX_DATA_PER_TXD ); + } +/* if sum is negative we failed to make sufficient progress */ if (sum <0 )return true;
@@ -2681,7 +2701,7 @@ bool __i40e_chk_linearize(struct sk_buffif (!nr_frags--)break ; - sum -=skb_frag_size (stale++); + sum -= stale_size; }return false;
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +23 -3
@@ -1872,10 +1872,30 @@ bool __i40evf_chk_linearize(struct sk_bu/* Walk through fragments adding latest fragment, testing it, and * then removing stale fragments from the sum. */ - stale = &skb_shinfo (skb)->frags[0 ]; -for (;;) { +for (stale = &skb_shinfo (skb)->frags[0 ];; stale++) { +int stale_size =skb_frag_size (stale); + sum +=skb_frag_size (frag++); +/* The stale fragment may present us with a smaller +* descriptor than the actual fragment size. To account +* for that we need to remove all the data on the front and +* figure out what the remainder would be in the last +* descriptor associated with the fragment. +*/ +if (stale_size >I40E_MAX_DATA_PER_TXD ) { +int align_pad = -(stale->page_offset) & + (I40E_MAX_READ_REQ_SIZE -1 ); + + sum -= align_pad; + stale_size -= align_pad; + +do { + sum -=I40E_MAX_DATA_PER_TXD_ALIGNED ; + stale_size -=I40E_MAX_DATA_PER_TXD_ALIGNED ; + }while (stale_size >I40E_MAX_DATA_PER_TXD ); + } +/* if sum is negative we failed to make sufficient progress */ if (sum <0 )return true;
@@ -1883,7 +1903,7 @@ bool __i40evf_chk_linearize(struct sk_buif (!nr_frags--)break ; - sum -=skb_frag_size (stale++); + sum -= stale_size; }return false;
Greg Kroah-Hartman
maintainerPATCH 44/56 nl80211: Check for the required netlink attribute presence
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hao Chen <[email protected]>
[ Upstream commit 3ea15452ee85754f70f3b9fa1f23165ef2e77ba7 ]
nl80211_nan_add_func() does not check if the required attribute NL80211_NAN_FUNC_FOLLOW_UP_DEST is present when processing NL80211_CMD_ADD_NAN_FUNCTION request. This request can be issued by users with CAP_NET_ADMIN privilege and may result in NULL dereference and a system crash. Add a check for the required attribute presence.
--- net/wireless/nl80211.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/wireless/nl80211.c +2 -1
@@ -10777,7 +10777,8 @@ static int nl80211_nan_add_func(struct sbreak ;case NL80211_NAN_FUNC_FOLLOW_UP :if (!tb[NL80211_NAN_FUNC_FOLLOW_UP_ID ] || - !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID ]) { + !tb[NL80211_NAN_FUNC_FOLLOW_UP_REQ_ID ] || + !tb[NL80211_NAN_FUNC_FOLLOW_UP_DEST ]) { err = -EINVAL ; goto out; }
Greg Kroah-Hartman
maintainerPATCH 45/56 mac80211: mesh: drop frames appearing to be from us
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 736a80bbfda709fb3631f5f62056f250a38e5804 ]
If there are multiple mesh stations with the same MAC address, they will both get confused and start throwing warnings.
Obviously in this case nothing can actually work anyway, so just drop frames that look like they're from ourselves early on.
--- net/mac80211/rx.c | 2 ++ 1 file changed, 2 insertions(+)
net/mac80211/rx.c +2 -0
@@ -3611,6 +3611,8 @@ static bool ieee80211_accept_frame(struc }return true;case NL80211_IFTYPE_MESH_POINT : +if (ether_addr_equal (sdata->vif.addr, hdr->addr2)) +return false;if (multicast)return true;return ether_addr_equal (sdata->vif.addr, hdr->addr1);
Greg Kroah-Hartman
maintainerPATCH 46/56 can: flex_can: Correct the checking for frame length in flexcan_start_xmit()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luu An Phu <[email protected]>
[ Upstream commit 13454c14550065fcc1705d6bd4ee6d40e057099f ]
The flexcan_start_xmit() function compares the frame length with data register length to write frame content into data[0] and data[1] register. Data register length is 4 bytes and frame maximum length is 8 bytes.
Fix the check that compares frame length with 3. Because the register length is 4.
--- drivers/net/can/flexcan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/flexcan.c +1 -1
@@ -493,7 +493,7 @@ static int flexcan_start_xmit(struct sk_ data =be32_to_cpup ((__be32 *)&cf->data[0 ]);flexcan_write (data, ®s->mb[FLEXCAN_TX_BUF_ID ].data[0 ]); } -if (cf->can_dlc >3 ) { +if (cf->can_dlc >4 ) { data =be32_to_cpup ((__be32 *)&cf->data[4 ]);flexcan_write (data, ®s->mb[FLEXCAN_TX_BUF_ID ].data[1 ]); }
Greg Kroah-Hartman
maintainerPATCH 47/56 bnxt_en: Fix the Invalid VF id check in bnxt_vf_ndo_prep routine.
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Venkat Duvvuru <[email protected]>
[ Upstream commit 78f300049335ae81a5cc6b4b232481dc5e1f9d41 ]
In bnxt_vf_ndo_prep (which is called by bnxt_get_vf_config ndo), there is a check for "Invalid VF id". Currently, the check is done against max_vfs. However, the user doesn't always create max_vfs. So, the check should be against the created number of VFs. The number of bnxt_vf_info structures that are allocated in bnxt_alloc_vf_resources routine is the "number of requested VFs". So, if an "invalid VF id" falls between the requested number of VFs and the max_vfs, the driver will be dereferencing an invalid pointer.
--- drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +1 -1
@@ -68,7 +68,7 @@ static int bnxt_vf_ndo_prep(struct bnxtnetdev_err (bp->dev,"vf ndo called though sriov is disabled\n" );return -EINVAL ; } -if (vf_id >= bp->pf.max_vfs) { +if (vf_id >= bp->pf.active_vfs) {netdev_err (bp->dev,"Invalid VF id %d\n" , vf_id);return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 48/56 xen-netfront: enable device after manual module load
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduardo Otubo <[email protected]>
[ Upstream commit b707fda2df4070785d0fa8a278aa13944c5f51f8 ]
When loading the module after unloading it, the network interface would not be enabled and thus wouldn't have a backend counterpart and unable to be used by the guest.
The guest would face errors like:
[root@guest ~]# ethtool -i eth0
Cannot get driver information: No such device
[root@guest ~]# ifconfig eth0
eth0: error fetching interface information: Device not found
This patch initializes the state of the netfront device whenever it is loaded manually, this state would communicate the netback to create its device and establish the connection between them.
--- drivers/net/xen-netfront.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/xen-netfront.c +1 -0
@@ -1345,6 +1345,7 @@ static struct net_device *xennet_create_netif_carrier_off (netdev); +xenbus_switch_state (dev, XenbusStateInitialising);return netdev; exit:
Greg Kroah-Hartman
maintainerPATCH 49/56 mdio-sun4i: Fix a memory leak
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 56c0290202ab94a2f2780c449395d4ae8495fab4 ]
If the probing of the regulator is deferred, the memory allocated by 'mdiobus_alloc_size()' will be leaking.
It should be freed before the next call to 'sun4i_mdio_probe()' which will reallocate it.
--- drivers/net/phy/mdio-sun4i.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/phy/mdio-sun4i.c +4 -2
@@ -118,8 +118,10 @@ static int sun4i_mdio_probe(struct platf data->regulator =devm_regulator_get (&pdev->dev,"phy" );if (IS_ERR (data->regulator)) { -if (PTR_ERR (data->regulator) == -EPROBE_DEFER ) -return -EPROBE_DEFER ; +if (PTR_ERR (data->regulator) == -EPROBE_DEFER ) { + ret = -EPROBE_DEFER ; + goto err_out_free_mdiobus; + }dev_info (&pdev->dev,"no regulator found\n" ); data->regulator =NULL ;
Greg Kroah-Hartman
maintainerPATCH 50/56 SolutionEngine771x: fix Ether platform data
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergei Shtylyov <[email protected]>
[ Upstream commit 195e2addbce09e5afbc766efc1e6567c9ce840d3 ]
The 'sh_eth' driver's probe() method would fail on the SolutionEngine7710 board and crash on SolutionEngine7712 board as the platform code is hopelessly behind the driver's platform data -- it passes the PHY address instead of 'struct sh_eth_plat_data *'; pass the latter to the driver in order to fix the bug...
--- arch/sh/boards/mach-se/770x/setup.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/sh/boards/mach-se/770x/setup.c +8 -2
@@ -8,6 +8,7 @@*/ #include <linux/init.h> #include <linux/platform_device.h> +#include <linux/sh_eth.h> #include <mach-se/mach/se.h> #include <mach-se/mach/mrshpc.h> #include <asm/machvec.h>
@@ -114,6 +115,11 @@ static struct platform_device heartbeat_ #if defined(CONFIG_CPU_SUBTYPE_SH7710) ||\ defined(CONFIG_CPU_SUBTYPE_SH7712) /* SH771X Ethernet driver */ +static struct sh_eth_plat_data sh_eth_plat = { + .phy = PHY_ID, + .phy_interface = PHY_INTERFACE_MODE_MII, +}; + static struct resource sh_eth0_resources[] = { [0] = { .start = SH_ETH0_BASE,
@@ -131,7 +137,7 @@ static struct platform_device sh_eth0_de .name = "sh771x-ether", .id = 0, .dev = { - .platform_data = PHY_ID, + .platform_data = &sh_eth_plat, }, .num_resources = ARRAY_SIZE(sh_eth0_resources), .resource = sh_eth0_resources,
@@ -154,7 +160,7 @@ static struct platform_device sh_eth1_de .name = "sh771x-ether", .id = 1, .dev = { - .platform_data = PHY_ID, + .platform_data = &sh_eth_plat, }, .num_resources = ARRAY_SIZE(sh_eth1_resources), .resource = sh_eth1_resources,
Greg Kroah-Hartman
maintainerPATCH 51/56 xen/gntdev: Fix off-by-one error when unmapping with holes
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ross Lagerwall <[email protected]>
[ Upstream commit 951a010233625b77cde3430b4b8785a9a22968d1 ]
If the requested range has a hole, the calculation of the number of pages to unmap is off by one. Fix it.
--- drivers/xen/gntdev.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/xen/gntdev.c +1 -3
@@ -378,10 +378,8 @@ static int unmap_grant_pages(struct gran } range =0 ;while (range < pages) { -if (map->unmap_ops[offset+range].handle ==-1 ) { - range--; +if (map->unmap_ops[offset+range].handle ==-1 )break ; - } range++; } err =__unmap_grant_pages (map, offset, range);
Greg Kroah-Hartman
maintainerPATCH 52/56 xen/gntdev: Fix partial gntdev_mmap() cleanup
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ross Lagerwall <[email protected]>
[ Upstream commit cf2acf66ad43abb39735568f55e1f85f9844e990 ]
When cleaning up after a partially successful gntdev_mmap(), unmap the successfully mapped grant pages otherwise Xen will kill the domain if in debug mode (Attempt to implicitly unmap a granted PTE) or Linux will kill the process and emit "BUG: Bad page map in process" if Xen is in release mode.
This is only needed when use_ptemod is true because gntdev_put_map() will unmap grant pages itself when use_ptemod is false.
--- drivers/xen/gntdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/xen/gntdev.c +3 -1
@@ -1077,8 +1077,10 @@ unlock_out: out_unlock_put:mutex_unlock (&priv->lock); out_put_map: -if (use_ptemod) +if (use_ptemod) { map->vma =NULL ; +unmap_grant_pages (map,0 , map->count); + }gntdev_put_map (priv, map);return err; }
Greg Kroah-Hartman
maintainerPATCH 53/56 sctp: make use of pre-calculated len
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcelo Ricardo Leitner <[email protected]>
[ Upstream commit c76f97c99ae6d26d14c7f0e50e074382bfbc9f98 ]
Some sockopt handling functions were calculating the length of the buffer to be written to userspace and then calculating it again when actually writing the buffer, which could lead to some write not using an up-to-date length.
This patch updates such places to just make use of the len variable.
Also, replace some sizeof(type) to sizeof(var).
--- net/sctp/socket.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
net/sctp/socket.c +10 -6
@@ -4765,7 +4765,7 @@ static int sctp_getsockopt_autoclose(str len =sizeof (int );if (put_user (len, optlen))return -EFAULT ; -if (copy_to_user (optval, &sctp_sk (sk)->autoclose,sizeof (int ))) +if (copy_to_user (optval, &sctp_sk (sk)->autoclose, len))return -EFAULT ;return 0 ; }
@@ -5342,6 +5342,9 @@ copy_getaddrs: err = -EFAULT ; goto out; } +/* XXX: We should have accounted for sizeof(struct sctp_getaddrs) too, +* but we can't change it anymore. +*/ if (put_user (bytes_copied, optlen)) err = -EFAULT ; out:
@@ -5778,7 +5781,7 @@ static int sctp_getsockopt_maxseg(struct params.assoc_id =0 ; }else if (len >=sizeof (struct sctp_assoc_value )) { len =sizeof (struct sctp_assoc_value ); -if (copy_from_user (¶ms, optval,sizeof (params))) +if (copy_from_user (¶ms, optval, len))return -EFAULT ; }else return -EINVAL ;
@@ -5947,7 +5950,9 @@ static int sctp_getsockopt_active_key(stif (len <sizeof (struct sctp_authkeyid ))return -EINVAL ; -if (copy_from_user (&val, optval,sizeof (struct sctp_authkeyid ))) + + len =sizeof (struct sctp_authkeyid ); +if (copy_from_user (&val, optval, len))return -EFAULT ; asoc =sctp_id2assoc (sk, val.scact_assoc_id);
@@ -5959,7 +5964,6 @@ static int sctp_getsockopt_active_key(stelse val.scact_keynumber = ep->active_key_id; - len =sizeof (struct sctp_authkeyid );if (put_user (len, optlen))return -EFAULT ;if (copy_to_user (optval, &val, len))
@@ -5985,7 +5989,7 @@ static int sctp_getsockopt_peer_auth_chuif (len <sizeof (struct sctp_authchunks ))return -EINVAL ; -if (copy_from_user (&val, optval,sizeof (struct sctp_authchunks ))) +if (copy_from_user (&val, optval,sizeof (val)))return -EFAULT ; to = p->gauth_chunks;
@@ -6030,7 +6034,7 @@ static int sctp_getsockopt_local_auth_chif (len <sizeof (struct sctp_authchunks ))return -EINVAL ; -if (copy_from_user (&val, optval,sizeof (struct sctp_authchunks ))) +if (copy_from_user (&val, optval,sizeof (val)))return -EFAULT ; to = p->gauth_chunks;
Greg Kroah-Hartman
maintainerPATCH 54/56 net: gianfar_ptp: move set_fipers() to spinlock protecting area
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yangbo Lu <[email protected]>
[ Upstream commit 11d827a993a969c3c6ec56758ff63a44ba19b466 ]
set_fipers() calling should be protected by spinlock in case that any interrupt breaks related registers setting and the function we expect. This patch is to move set_fipers() to spinlock protecting area in ptp_gianfar_adjtime().
--- drivers/net/ethernet/freescale/gianfar_ptp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/freescale/gianfar_ptp.c +1 -2
@@ -314,11 +314,10 @@ static int ptp_gianfar_adjtime(struct pt now =tmr_cnt_read (etsects); now += delta;tmr_cnt_write (etsects, now); +set_fipers (etsects);spin_unlock_irqrestore (&etsects->lock, flags); -set_fipers (etsects); -return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 55/56 KVM: arm/arm64: Fix check for hugepage size when allocating at Stage 2
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Punit Agrawal <[email protected]>
Commit 45ee9d5e97a4 ("KVM: arm/arm64: Check pagesize when allocating a hugepage at Stage 2") lost the check for PMD_SIZE during the backport to 4.9.
Fix this by correcting the condition to detect hugepages during stage 2 allocation.
--- arch/arm/kvm/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/kvm/mmu.c +1 -1
@@ -1284,7 +1284,7 @@ static int user_mem_abort(struct kvm_vcpreturn -EFAULT ; } -if (vma_kernel_pagesize (vma) && !logging_active) { +if (vma_kernel_pagesize (vma) ==PMD_SIZE && !logging_active) { hugetlb = true; gfn = (fault_ipa &PMD_MASK ) >>PAGE_SHIFT ; }else {
Greg Kroah-Hartman
maintainerPATCH 56/56 MIPS: Implement __multi3 for GCC7 MIPS64r6 builds
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit ebabcf17bcd7ce968b1631ebe08236275698f39b upstream.
GCC7 is a bit too eager to generate suboptimal __multi3 calls (128bit multiply with 128bit result) for MIPS64r6 builds, even in code which doesn't explicitly use 128bit types, such as the following:
unsigned long func(unsigned long a, unsigned long b)
{
return a > (~0UL) / b;
}Which GCC rearanges to:
return (unsigned __int128)a * (unsigned __int128)b > 0xffffffffffffffff;
Therefore implement __multi3, but only for MIPS64r6 with GCC7 as under normal circumstances we wouldn't expect any calls to __multi3 to be generated from kernel code.
Patchwork: https://patchwork.linux-mips.org/patch/17890/
--- arch/mips/lib/Makefile | 3 +- arch/mips/lib/libgcc.h | 17 +++++++++++++++ arch/mips/lib/multi3.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-)
arch/mips/lib/Makefile +2 -1
@@ -15,4 +15,5 @@ obj-$(CONFIG_CPU_R3000) += r3k_dump_tlb obj-$(CONFIG_CPU_TX39XX) += r3k_dump_tlb.o # libgcc-style stuff needed in the kernel -obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o ucmpdi2.o +obj-y += ashldi3.o ashrdi3.o bswapsi.o bswapdi.o cmpdi2.o lshrdi3.o multi3.o \ + ucmpdi2.o
arch/mips/lib/libgcc.h +17 -0
@@ -9,10 +9,18 @@ typedef int word_type __attribute__ ((mostruct DWstruct {int high, low; }; + +struct TWstruct { +long long high, low; +};#elif defined(__LITTLE_ENDIAN)struct DWstruct {int low, high; }; + +struct TWstruct { +long long low, high; +};#else #error I feel sick.#endif
@@ -22,4 +30,13 @@ typedef union { long long ll; } DWunion; +#if defined(CONFIG_64BIT ) && defined(CONFIG_CPU_MIPSR6 ) +typedef int ti_type __attribute__((mode (TI ))); + +typedef union { +struct TWstruct s; +ti_type ti; +}TWunion ; +#endif +#endif /* __ASM_LIBGCC_H */
arch/mips/lib/multi3.c new file +54 -0
54 lines not on this page · raw message
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.86 release. There are 56 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 Sun Mar 4 08:44:26 UTC 2018. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 133 pass: 133 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.86 release. There are 56 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 Sun Mar 4 08:44:26 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.9.86-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
Results from Linaro’s test farm.
No regressions on arm64, arm and x86_64.
NOTE:
dragonboard-410c and qemu-system-x86_64 are added to testing device pool.
Summary
------------------------------------------------------------------------
kernel: 4.9.86-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: 85afb4e51ccfdb10f2969b24439ae2887fe0fcff
git describe: v4.9.85-57-g85afb4e51ccf
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.9-oe/build/v4.9.85-57-g85afb4e51ccf
No regressions (compared to build v4.9.85)
Boards, architectures and test suites:
-------------------------------------
dragonboard-410c
* boot - pass: 20,
* kselftest - pass: 38, skip: 27
* libhugetlbfs - pass: 90, skip: 1
* ltp-cap_bounds-tests - pass: 2,
* ltp-containers-tests - pass: 64, skip: 17
* ltp-fcntl-locktests-tests - pass: 2,
* ltp-filecaps-tests - pass: 2,
* ltp-fs-tests - pass: 61, skip: 2
* ltp-fs_bind-tests - pass: 2,
* ltp-fs_perms_simple-tests - pass: 19,
* ltp-fsx-tests - pass: 2,
* ltp-hugetlb-tests - pass: 21, skip: 1
* ltp-io-tests - pass: 3,
* ltp-ipc-tests - pass: 9,
* ltp-math-tests - pass: 11,
* ltp-nptl-tests - pass: 2,
* ltp-pty-tests - pass: 4,
* ltp-sched-tests - pass: 14,
* ltp-securebits-tests - pass: 4,
* ltp-syscalls-tests - pass: 1002, skip: 148
* ltp-timers-tests - pass: 12, skip: 1
hi6220-hikey - arm64
* boot - pass: 20,
* kselftest - pass: 40, skip: 24
* libhugetlbfs - pass: 90, skip: 1
* ltp-cap_bounds-tests - pass: 2,
* ltp-containers-tests - pass: 64, skip: 17
* ltp-fcntl-locktests-tests - pass: 2,
* ltp-filecaps-tests - pass: 2,
* ltp-fs-tests - pass: 61, skip: 2
* ltp-fs_bind-tests - pass: 2,
* ltp-fs_perms_simple-tests - pass: 19,
* ltp-fsx-tests - pass: 2,
* ltp-hugetlb-tests - pass: 21, skip: 1
* ltp-io-tests - pass: 3,
* ltp-ipc-tests - pass: 9,
* ltp-math-tests - pass: 11,
* ltp-nptl-tests - pass: 2,
* ltp-pty-tests - pass: 4,
* ltp-sched-tests - pass: 10, skip: 4
* ltp-securebits-tests - pass: 4,
* ltp-syscalls-tests - pass: 999, skip: 151
* ltp-timers-tests - pass: 12, skip: 1
juno-r2 - arm64
* boot - pass: 20,
* kselftest - pass: 42, skip: 23
* libhugetlbfs - pass: 90, skip: 1
* ltp-cap_bounds-tests - pass: 2,
* ltp-containers-tests - pass: 64, skip: 17
* ltp-fcntl-locktests-tests - pass: 2,
* ltp-filecaps-tests - pass: 2,
* ltp-fs-tests - pass: 61, skip: 2
* ltp-fs_bind-tests - pass: 2,
* ltp-fs_perms_simple-tests - pass: 19,
* ltp-fsx-tests - pass: 2,
* ltp-hugetlb-tests - pass: 22,
* ltp-io-tests - pass: 3,
* ltp-ipc-tests - pass: 9,
* ltp-math-tests - pass: 11,
* ltp-nptl-tests - pass: 2,
* ltp-pty-tests - pass: 4,
* ltp-sched-tests - pass: 10, skip: 4
* ltp-securebits-tests - pass: 4,
* ltp-syscalls-tests - pass: 1001, skip: 149
* ltp-timers-tests - pass: 12, skip: 1
qemu_x86_64
* boot - pass: 20,
* kselftest - pass: 62, skip: 20
* libhugetlbfs - pass: 90, skip: 1
* ltp-cap_bounds-tests - pass: 2,
* ltp-containers-tests - pass: 64, skip: 17
* ltp-fcntl-locktests-tests - pass: 2,
* ltp-filecaps-tests - pass: 2,
* ltp-fs-tests - pass: 57, skip: 6
* ltp-fs_bind-tests - pass: 2,
* ltp-fs_perms_simple-tests - pass: 19,
* ltp-fsx-tests - pass: 2,
* ltp-hugetlb-tests - pass: 22,
* ltp-io-tests - pass: 3,
* ltp-ipc-tests - pass: 9,
* ltp-math-tests - pass: 11,
* ltp-nptl-tests - pass: 2,
* ltp-pty-tests - pass: 4,
* ltp-sched-tests - pass: 13, skip: 1
* ltp-securebits-tests - pass: 4,
* ltp-syscalls-tests - pass: 1004, skip: 146
* ltp-timers-tests - pass: 12, skip: 1
x15 - arm
* boot - pass: 20,
* kselftest - pass: 39, skip: 25
* libhugetlbfs - pass: 87, skip: 1
* ltp-cap_bounds-tests - pass: 2,
* ltp-containers-tests - pass: 64, skip: 17
* ltp-fcntl-locktests-tests - pass: 2,
* ltp-filecaps-tests - pass: 2,
* ltp-fs-tests - pass: 61, skip: 2
* ltp-fs_bind-tests - pass: 2,
* ltp-fs_perms_simple-tests - pass: 19,
* ltp-fsx-tests - pass: 2,
* ltp-hugetlb-tests - pass: 20, skip: 2
* ltp-io-tests - pass: 3,
* ltp-ipc-tests - pass: 9,
* ltp-math-tests - pass: 11,
* ltp-nptl-tests - pass: 2,
* ltp-pty-tests - pass: 4,
* ltp-sched-tests - pass: 13, skip: 1
* ltp-securebits-tests - pass: 4,
* ltp-syscalls-tests - pass: 1053, skip: 97
* ltp-timers-tests - pass: 12, skip: 1
x86_64
* boot - pass: 20,
* kselftest - pass: 54, skip: 27
* libhugetlbfs - pass: 90, skip: 1
* ltp-cap_bounds-tests - pass: 2,
* ltp-containers-tests - pass: 64, skip: 17
* ltp-fcntl-locktests-tests - pass: 2,
* ltp-filecaps-tests - pass: 2,
* ltp-fs-tests - pass: 62, skip: 1
* ltp-fs_bind-tests - pass: 2,
* ltp-fs_perms_simple-tests - pass: 19,
* ltp-fsx-tests - pass: 2,
* ltp-hugetlb-tests - pass: 22,
* ltp-io-tests - pass: 3,
* ltp-ipc-tests - pass: 9,
* ltp-math-tests - pass: 11,
* ltp-nptl-tests - pass: 2,
* ltp-pty-tests - pass: 4,
* ltp-sched-tests - pass: 9, skip: 5
* ltp-securebits-tests - pass: 4,
* ltp-syscalls-tests - pass: 1030, skip: 119
* ltp-timers-tests - pass: 12, skip: 1
--
Linaro QA (beta)
https://qa-reports.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.86 release. There are 56 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 Sun Mar 4 08:44:26 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.86-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