4.4.29-stable review
Greg Kroah-Hartman
maintainercover 4.4.29-stable review
This is the start of the stable review cycle for the 4.4.29 release. There are 51 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 Mon Oct 31 13:49:01 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.29-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.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.29-rc1
Robert Jarzmik <[email protected]>
ARM: pxa: pxa_cplds: fix interrupt handling
Pan Xinhui <[email protected]>
powerpc/nvram: Fix an incorrect partition merge
Johannes Thumshirn <[email protected]>
mpt3sas: Don't spam logs if logging level is 0
Arnaldo Carvalho de Melo <[email protected]>
perf symbols: Fixup symbol sizes before picking best ones
Arnaldo Carvalho de Melo <[email protected]>
perf symbols: Check symbol_conf.allow_aliases for kallsyms loading too
Namhyung Kim <[email protected]>
perf hists browser: Fix event group display
Geert Uytterhoeven <[email protected]>
clk: divider: Fix clk_divider_round_rate() to use clk_readl()
Tang Yuantian <[email protected]>
clk: qoriq: fix a register offset error
Sascha Silbe <[email protected]>
s390/con3270: fix insufficient space padding
Sascha Silbe <[email protected]>
s390/con3270: fix use of uninitialised data
Sebastian Ott <[email protected]>
s390/cio: fix accidental interrupt enabling during resume
Tony Luck <[email protected]>
x86/mm: Expand the exception table logic to allow new handling options
Arnd Bergmann <[email protected]>
dmaengine: ipu: remove bogus NO_IRQ reference
Georges Savoundararadj <[email protected]>
power: bq24257: Fix use of uninitialized pointer bq->charger
Larry Finger <[email protected]>
staging: r8188eu: Fix scheduling while atomic splat
Chen-Yu Tsai <[email protected]>
ASoC: dapm: Fix kcontrol creation for output driver widget
Chen-Yu Tsai <[email protected]>
ASoC: dapm: Fix value setting for _ENUM_DOUBLE MUX's second channel
Chen-Yu Tsai <[email protected]>
ASoC: dapm: Fix possible uninitialized variable in snd_soc_dapm_get_volsw()
Wei Yongjun <[email protected]>
ASoC: topology: Fix error return code in soc_tplg_dapm_widget_create()
Dave Gerlach <[email protected]>
hwrng: omap - Only fail if pm_runtime_get_sync returns < 0
Ard Biesheuvel <[email protected]>
crypto: arm/ghash-ce - add missing async import/export
Ondrej Mosnáček <[email protected]>
crypto: gcm - Fix IV buffer size in crypto_gcm_setkey
Xinming Hu <[email protected]>
mwifiex: correct aid value during tdls setup
Wei Yongjun <[email protected]>
spi: spi-fsl-dspi: Drop extra spi_master_put in device remove function
Uwe Kleine-König <[email protected]>
ARM: clk-imx35: fix name for ckil clk
Jan Viktorin <[email protected]>
uio: fix dmem_region_start computation
Sebastian Frias <[email protected]>
genirq/generic_chip: Add irq_unmap callback
Jiri Olsa <[email protected]>
perf stat: Fix interval output values
Russell Currey <[email protected]>
powerpc/eeh: Null check uses of eeh_pe_bus_get
Jesse Gross <[email protected]>
tunnels: Remove encapsulation offloads on decap.
Jesse Gross <[email protected]>
tunnels: Don't apply GRO to multiple layers of encapsulation.
Jesse Gross <[email protected]>
ipip: Properly mark ipip GRO packets as encapsulated.
Jan Kara <[email protected]>
posix_acl: Clear SGID bit when setting file permissions
Arend Van Spriel <[email protected]>
brcmfmac: avoid potential stack overflow in brcmf_cfg80211_start_ap()
Gerald Schaefer <[email protected]>
mm/hugetlb: fix memory offline with hugepage size > memory block size
Chris Wilson <[email protected]>
drm/i915: Unalias obj->phys_handle and obj->userptr
Ville Syrjälä <[email protected]>
drm/i915: Account for TSEG size when determining 865G stolen base
David Weinehall <[email protected]>
Revert "drm/i915: Check live status before reading edid"
Paulo Zanoni <[email protected]>
drm/i915/gen9: fix the WaWmMemoryReadLatency implementation
Jan Beulich <[email protected]>
xenbus: don't look up transaction IDs for ordinary writes
Thomas Hellstrom <[email protected]>
drm/vmwgfx: Limit the user-space command buffer size
Alex Deucher <[email protected]>
drm/radeon: change vblank_time's calculation method to reduce computational error.
Alex Deucher <[email protected]>
drm/radeon/si/dpm: fix phase shedding setup
Alex Deucher <[email protected]>
drm/radeon: narrow asic_init for virtualization
Rex Zhu <[email protected]>
drm/amdgpu: change vblank_time's calculation method to reduce computational error.
Grazvydas Ignotas <[email protected]>
drm/amdgpu/dce11: add missing drm_mode_config_cleanup call
Alex Deucher <[email protected]>
drm/amdgpu/dce11: disable hpd on local panels
Alex Deucher <[email protected]>
drm/amdgpu/dce8: disable hpd on local panels
Alex Deucher <[email protected]>
drm/amdgpu/dce10: disable hpd on local panels
Alex Deucher <[email protected]>
drm/amdgpu: fix IB alignment for UVD
Chris Wilson <[email protected]>
drm/prime: Pass the right module owner through to dma_buf_export()
-------------
Diffstat:
Documentation/x86/exception-tables.txt | 35 ++++++++ Makefile | 4 +- arch/arm/crypto/ghash-ce-glue.c | 24 +++++ arch/arm/mach-pxa/pxa_cplds_irqs.c | 24 +++-- arch/powerpc/kernel/eeh_driver.c | 8 ++ arch/powerpc/kernel/nvram_64.c | 6 +- arch/powerpc/platforms/powernv/eeh-powernv.c | 5 ++ arch/x86/include/asm/asm.h | 40 +++++---- arch/x86/include/asm/uaccess.h | 16 ++-- arch/x86/kernel/early-quirks.c | 11 ++- arch/x86/kernel/kprobes/core.c | 2 +- arch/x86/kernel/traps.c | 6 +- arch/x86/mm/extable.c | 100 +++++++++++++++------ arch/x86/mm/fault.c | 2 +- crypto/gcm.c | 2 +- drivers/char/hw_random/omap-rng.c | 4 +- drivers/clk/clk-divider.c | 2 +- drivers/clk/clk-qoriq.c | 6 +- drivers/clk/imx/clk-imx35.c | 2 +- drivers/dma/ipu/ipu_irq.c | 9 +- drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c | 14 +-- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 2 +- drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 23 ++--- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 24 ++--- drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 48 ++++++++-- drivers/gpu/drm/drm_prime.c | 17 ++-- drivers/gpu/drm/i915/i915_drv.h | 24 +++-- drivers/gpu/drm/i915/i915_gem_stolen.c | 23 +++-- drivers/gpu/drm/i915/intel_dp.c | 2 +- drivers/gpu/drm/i915/intel_drv.h | 2 - drivers/gpu/drm/i915/intel_hdmi.c | 36 ++------ drivers/gpu/drm/i915/intel_pm.c | 42 ++++----- drivers/gpu/drm/radeon/r600_dpm.c | 15 ++-- drivers/gpu/drm/radeon/radeon_device.c | 5 +- drivers/gpu/drm/radeon/si_dpm.c | 2 +- drivers/gpu/drm/radeon/sislands_smc.h | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 6 +- drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 2 +- drivers/net/wireless/mwifiex/join.c | 3 +- drivers/power/bq24257_charger.c | 12 +-- drivers/s390/char/con3270.c | 11 ++- drivers/s390/cio/chsc.c | 20 +++-- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 +- drivers/spi/spi-fsl-dspi.c | 1 - drivers/staging/rtl8188eu/core/rtw_cmd.c | 4 +- drivers/uio/uio_dmem_genirq.c | 2 +- drivers/xen/xenbus/xenbus_dev_frontend.c | 2 +- fs/9p/acl.c | 40 ++++----- fs/btrfs/acl.c | 6 +- fs/ceph/acl.c | 6 +- fs/ext2/acl.c | 12 +-- fs/ext4/acl.c | 12 +-- fs/f2fs/acl.c | 6 +- fs/gfs2/acl.c | 12 +-- fs/hfsplus/posix_acl.c | 4 +- fs/jffs2/acl.c | 9 +- fs/jfs/acl.c | 6 +- fs/ocfs2/acl.c | 10 +-- fs/posix_acl.c | 31 +++++++ fs/reiserfs/xattr_acl.c | 8 +- fs/xfs/xfs_acl.c | 13 +-- include/drm/drmP.h | 3 +- include/linux/netdevice.h | 4 +- include/linux/posix_acl.h | 1 + include/net/ip_tunnels.h | 16 ++++ kernel/irq/generic-chip.c | 21 +++++ mm/hugetlb.c | 13 +-- net/core/dev.c | 2 +- net/ipv4/af_inet.c | 24 ++++- net/ipv4/fou.c | 13 ++- net/ipv4/gre_offload.c | 5 ++ net/ipv4/ip_tunnel_core.c | 3 +- net/ipv4/udp_offload.c | 6 +- net/ipv6/ip6_offload.c | 15 +++- net/ipv6/sit.c | 5 +- scripts/sortextable.c | 32 +++++++ sound/soc/soc-dapm.c | 6 +- sound/soc/soc-topology.c | 1 + tools/perf/ui/browsers/hists.c | 1 - tools/perf/util/stat.c | 10 +++ tools/perf/util/symbol-elf.c | 3 +- tools/perf/util/symbol.c | 5 +- 82 files changed, 658 insertions(+), 359 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 2/51 drm/amdgpu: fix IB alignment for UVD
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit c4795ca642b8bd76b5b6ffba41ba909543273d43 upstream.
According to the hw team, it should be 16, not 8.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +1 -1
@@ -227,7 +227,7 @@ static int amdgpu_info_ioctl(struct drm_ type =AMD_IP_BLOCK_TYPE_UVD ; ring_mask = adev->uvd.ring.ready ?1 :0 ; ib_start_alignment =AMDGPU_GPU_PAGE_SIZE ; - ib_size_alignment =8 ; + ib_size_alignment =16 ;break ;case AMDGPU_HW_IP_VCE : type =AMD_IP_BLOCK_TYPE_VCE ;
Greg Kroah-Hartman
maintainerPATCH 3/51 drm/amdgpu/dce10: disable hpd on local panels
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit e96ec90f496603c48e0945f8bdeb4cdf3088cbba upstream.
Otherwise we can get a hotplug interrupt storm when we turn the panel off if hpd interrupts were enabled by the bios.
bug:
https://bugs.freedesktop.org/show_bug.cgi?id=97471
--- drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-)
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +13 -10
@@ -419,16 +419,6 @@ static void dce_v10_0_hpd_init(struct amlist_for_each_entry (connector, &dev->mode_config.connector_list, head) {struct amdgpu_connector *amdgpu_connector =to_amdgpu_connector (connector); -if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || - connector->connector_type ==DRM_MODE_CONNECTOR_LVDS ) { -/* don't try to enable hpd on eDP or LVDS avoid breaking the -* aux dp channel on imac and help (but not completely fix) -* https://bugzilla.redhat.com/show_bug.cgi?id=726143 -* also avoid interrupt storms during dpms. -*/ -continue ; - } -switch (amdgpu_connector->hpd.hpd) {case AMDGPU_HPD_1 : idx =0 ;
@@ -452,6 +442,19 @@ static void dce_v10_0_hpd_init(struct amcontinue ; } +if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || + connector->connector_type ==DRM_MODE_CONNECTOR_LVDS ) { +/* don't try to enable hpd on eDP or LVDS avoid breaking the +* aux dp channel on imac and help (but not completely fix) +* https://bugzilla.redhat.com/show_bug.cgi?id=726143 +* also avoid interrupt storms during dpms. +*/ + tmp =RREG32 (mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); + tmp =REG_SET_FIELD (tmp,DC_HPD_INT_CONTROL ,DC_HPD_INT_EN ,0 ); +WREG32 (mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); +continue ; + } + tmp =RREG32 (mmDC_HPD_CONTROL + hpd_offsets[idx]); tmp =REG_SET_FIELD (tmp,DC_HPD_CONTROL ,DC_HPD_EN ,1 );WREG32 (mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
Greg Kroah-Hartman
maintainerPATCH 4/51 drm/amdgpu/dce8: disable hpd on local panels
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 324082586cc5918e3230f0b2f326656c653201eb upstream.
Otherwise we can get a hotplug interrupt storm when we turn the panel off if hpd interrupts were enabled by the bios.
bug:
https://bugs.freedesktop.org/show_bug.cgi?id=97471
--- drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 48 +++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +39 -9
@@ -392,15 +392,6 @@ static void dce_v8_0_hpd_init(struct amdlist_for_each_entry (connector, &dev->mode_config.connector_list, head) {struct amdgpu_connector *amdgpu_connector =to_amdgpu_connector (connector); -if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || - connector->connector_type ==DRM_MODE_CONNECTOR_LVDS ) { -/* don't try to enable hpd on eDP or LVDS avoid breaking the -* aux dp channel on imac and help (but not completely fix) -* https://bugzilla.redhat.com/show_bug.cgi?id=726143 -* also avoid interrupt storms during dpms. -*/ -continue ; - }switch (amdgpu_connector->hpd.hpd) {case AMDGPU_HPD_1 :WREG32 (mmDC_HPD1_CONTROL, tmp);
@@ -423,6 +414,45 @@ static void dce_v8_0_hpd_init(struct amddefault :break ; } + +if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || + connector->connector_type ==DRM_MODE_CONNECTOR_LVDS ) { +/* don't try to enable hpd on eDP or LVDS avoid breaking the +* aux dp channel on imac and help (but not completely fix) +* https://bugzilla.redhat.com/show_bug.cgi?id=726143 +* also avoid interrupt storms during dpms. +*/ +u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; + +switch (amdgpu_connector->hpd.hpd) { +case AMDGPU_HPD_1 : + dc_hpd_int_cntl_reg = mmDC_HPD1_INT_CONTROL; +break ; +case AMDGPU_HPD_2 : + dc_hpd_int_cntl_reg = mmDC_HPD2_INT_CONTROL; +break ; +case AMDGPU_HPD_3 : + dc_hpd_int_cntl_reg = mmDC_HPD3_INT_CONTROL; +break ; +case AMDGPU_HPD_4 : + dc_hpd_int_cntl_reg = mmDC_HPD4_INT_CONTROL; +break ; +case AMDGPU_HPD_5 : + dc_hpd_int_cntl_reg = mmDC_HPD5_INT_CONTROL; +break ; +case AMDGPU_HPD_6 : + dc_hpd_int_cntl_reg = mmDC_HPD6_INT_CONTROL; +break ; +default : +continue ; + } + + dc_hpd_int_cntl =RREG32 (dc_hpd_int_cntl_reg); + dc_hpd_int_cntl &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK ; +WREG32 (dc_hpd_int_cntl_reg, dc_hpd_int_cntl); +continue ; + } +dce_v8_0_hpd_set_polarity (adev, amdgpu_connector->hpd.hpd);amdgpu_irq_get (adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); }
Greg Kroah-Hartman
maintainerPATCH 5/51 drm/amdgpu/dce11: disable hpd on local panels
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 3a9d993ee9809c217f4322623a9b78c8d17fdd1f upstream.
Otherwise we can get a hotplug interrupt storm when we turn the panel off if hpd interrupts were enabled by the bios.
bug:
https://bugs.freedesktop.org/show_bug.cgi?id=97471
--- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-)
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +13 -10
@@ -409,16 +409,6 @@ static void dce_v11_0_hpd_init(struct amlist_for_each_entry (connector, &dev->mode_config.connector_list, head) {struct amdgpu_connector *amdgpu_connector =to_amdgpu_connector (connector); -if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || - connector->connector_type ==DRM_MODE_CONNECTOR_LVDS ) { -/* don't try to enable hpd on eDP or LVDS avoid breaking the -* aux dp channel on imac and help (but not completely fix) -* https://bugzilla.redhat.com/show_bug.cgi?id=726143 -* also avoid interrupt storms during dpms. -*/ -continue ; - } -switch (amdgpu_connector->hpd.hpd) {case AMDGPU_HPD_1 : idx =0 ;
@@ -442,6 +432,19 @@ static void dce_v11_0_hpd_init(struct amcontinue ; } +if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || + connector->connector_type ==DRM_MODE_CONNECTOR_LVDS ) { +/* don't try to enable hpd on eDP or LVDS avoid breaking the +* aux dp channel on imac and help (but not completely fix) +* https://bugzilla.redhat.com/show_bug.cgi?id=726143 +* also avoid interrupt storms during dpms. +*/ + tmp =RREG32 (mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); + tmp =REG_SET_FIELD (tmp,DC_HPD_INT_CONTROL ,DC_HPD_INT_EN ,0 ); +WREG32 (mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); +continue ; + } + tmp =RREG32 (mmDC_HPD_CONTROL + hpd_offsets[idx]); tmp =REG_SET_FIELD (tmp,DC_HPD_CONTROL ,DC_HPD_EN ,1 );WREG32 (mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
Greg Kroah-Hartman
maintainerPATCH 6/51 drm/amdgpu/dce11: add missing drm_mode_config_cleanup call
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Grazvydas Ignotas <[email protected]>
commit 140c94da3c3338c0ff4cc127cf9bec87905ca83c upstream.
All other amdgpu/dce_v* files have this call, it's only mysteriously missing from dce_v11_0.c since the file was added and causes leaks.
--- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +1 -0
@@ -3033,6 +3033,7 @@ static int dce_v11_0_sw_fini(void *handldce_v11_0_afmt_fini (adev); +drm_mode_config_cleanup (adev->ddev); adev->mode_info.mode_config_initialized = false;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 7/51 drm/amdgpu: change vblank_times calculation method to reduce computational error.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rex Zhu <[email protected]>
commit dc8184aa8621ee8048652496884d9f40d4bb407f upstream.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c +8 -6
@@ -113,24 +113,26 @@ void amdgpu_dpm_print_ps_status(struct aprintk ("\n" ); } +u32 amdgpu_dpm_get_vblank_time (struct amdgpu_device *adev) {struct drm_device *dev = adev->ddev;struct drm_crtc *crtc;struct amdgpu_crtc *amdgpu_crtc; -u32 line_time_us, vblank_lines; +u32 vblank_in_pixels;u32 vblank_time_us =0xffffffff ;/* if the displays are off, vblank time is max */ if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) {list_for_each_entry (crtc, &dev->mode_config.crtc_list, head) { amdgpu_crtc =to_amdgpu_crtc (crtc);if (crtc->enabled && amdgpu_crtc->enabled && amdgpu_crtc->hw_mode.clock) { - line_time_us = (amdgpu_crtc->hw_mode.crtc_htotal *1000 ) / - amdgpu_crtc->hw_mode.clock; - vblank_lines = amdgpu_crtc->hw_mode.crtc_vblank_end - + vblank_in_pixels = + amdgpu_crtc->hw_mode.crtc_htotal * + (amdgpu_crtc->hw_mode.crtc_vblank_end - amdgpu_crtc->hw_mode.crtc_vdisplay + - (amdgpu_crtc->v_border *2 ); - vblank_time_us = vblank_lines * line_time_us; + (amdgpu_crtc->v_border *2 )); + + vblank_time_us = vblank_in_pixels *1000 / amdgpu_crtc->hw_mode.clock;break ; } }
Greg Kroah-Hartman
maintainerPATCH 8/51 drm/radeon: narrow asic_init for virtualization
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 884031f0aacf57dad1575f96714efc80de9b19cc upstream.
Only needed on CIK+ due to the way pci reset is handled by the GPU.
--- drivers/gpu/drm/radeon/radeon_device.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/radeon_device.c +3 -2
@@ -660,8 +660,9 @@ bool radeon_card_posted(struct radeon_de {uint32_t reg; -/* for pass through, always force asic_init */ -if (radeon_device_is_virtual ()) +/* for pass through, always force asic_init for CI */ +if (rdev->family >=CHIP_BONAIRE && +radeon_device_is_virtual ())return false;/* required for EFI mode on macbook2,1 which uses an r5xx asic */
Greg Kroah-Hartman
maintainerPATCH 9/51 drm/radeon/si/dpm: fix phase shedding setup
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 427920292b00474d978d632bc03a8e4e50029af3 upstream.
Used the wrong index to setup the phase shedding mask.
--- drivers/gpu/drm/radeon/si_dpm.c | 2 +- drivers/gpu/drm/radeon/sislands_smc.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/radeon/si_dpm.c +1 -1
@@ -4112,7 +4112,7 @@ static int si_populate_smc_voltage_table &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) {si_populate_smc_voltage_table (rdev, &si_pi->vddc_phase_shed_table, table); - table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC ] = + table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING ] =cpu_to_be32 (si_pi->vddc_phase_shed_table.mask_low); si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay,
drivers/gpu/drm/radeon/sislands_smc.h +1 -0
@@ -194,6 +194,7 @@ typedef struct SISLANDS_SMC_SWSTATE SISL#define SISLANDS_SMC_VOLTAGEMASK_VDDC 0#define SISLANDS_SMC_VOLTAGEMASK_MVDD 1#define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2 +#define SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING 3#define SISLANDS_SMC_VOLTAGEMASK_MAX 4struct SISLANDS_SMC_VOLTAGEMASKTABLE
Greg Kroah-Hartman
maintainerPATCH 10/51 drm/radeon: change vblank_times calculation method to reduce computational error.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 02cfb5fccb0f9f968f0e208d89d9769aa16267bc upstream.
Ported from Rex's amdgpu change.
--- drivers/gpu/drm/radeon/r600_dpm.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/gpu/drm/radeon/r600_dpm.c +8 -7
@@ -156,19 +156,20 @@ u32 r600_dpm_get_vblank_time(struct radestruct drm_device *dev = rdev->ddev;struct drm_crtc *crtc;struct radeon_crtc *radeon_crtc; -u32 line_time_us, vblank_lines; +u32 vblank_in_pixels;u32 vblank_time_us =0xffffffff ;/* if the displays are off, vblank time is max */ if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) {list_for_each_entry (crtc, &dev->mode_config.crtc_list, head) { radeon_crtc =to_radeon_crtc (crtc);if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { - line_time_us = (radeon_crtc->hw_mode.crtc_htotal *1000 ) / - radeon_crtc->hw_mode.clock; - vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - - radeon_crtc->hw_mode.crtc_vdisplay + - (radeon_crtc->v_border *2 ); - vblank_time_us = vblank_lines * line_time_us; + vblank_in_pixels = + radeon_crtc->hw_mode.crtc_htotal * + (radeon_crtc->hw_mode.crtc_vblank_end - + radeon_crtc->hw_mode.crtc_vdisplay + + (radeon_crtc->v_border *2 )); + + vblank_time_us = vblank_in_pixels *1000 / radeon_crtc->hw_mode.clock;break ; } }
Greg Kroah-Hartman
maintainerPATCH 11/51 drm/vmwgfx: Limit the user-space command buffer size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Hellstrom <[email protected]>
commit 51ab70bed997f64f091a639dbe22b629725a7faf upstream.
With older hardware versions, the user could specify arbitrarily large command buffer sizes, causing a vmalloc / vmap space exhaustion.
--- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +3 -3
@@ -3830,14 +3830,14 @@ static void *vmw_execbuf_cmdbuf(struct vint ret; *header =NULL ; -if (!dev_priv->cman || kernel_commands) -return kernel_commands; -if (command_size >SVGA_CB_MAX_SIZE ) {DRM_ERROR ("Command buffer is too large.\n" );return ERR_PTR (-EINVAL ); } +if (!dev_priv->cman || kernel_commands) +return kernel_commands; +/* If possible, add a little space for fencing. */ cmdbuf_size = command_size +512 ; cmdbuf_size =min_t (size_t, cmdbuf_size,SVGA_CB_MAX_SIZE );
Greg Kroah-Hartman
maintainerPATCH 13/51 drm/i915/gen9: fix the WaWmMemoryReadLatency implementation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Zanoni <[email protected]>
commit 4e4d3814a9bb4d71cd3ff0701d8d7041edefd8f0 upstream.
Bspec says:
"The mailbox response data may not account for memory read latency.
If the mailbox response data for level 0 is 0us, add 2 microseconds to the result for each valid level."
This means we should only do the +2 in case wm[0] == 0, not always.
So split the sanitizing implementation from the WA implementation and fix the WA implementation.
v2: Add Fixes tag (Maarten).
--- drivers/gpu/drm/i915/intel_pm.c | 42 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-)
drivers/gpu/drm/i915/intel_pm.c +22 -20
@@ -2097,32 +2097,34 @@ static void intel_read_wm_latency(structGEN9_MEM_LATENCY_LEVEL_MASK ;/* +* If a level n (n > 1) has a 0us latency, all levels m (m >= n) +* need to be disabled. We make sure to sanitize the values out +* of the punit to satisfy this requirement. +*/ +for (level =1 ; level <= max_level; level++) { +if (wm[level] ==0 ) { +for (i = level +1 ; i <= max_level; i++) + wm[i] =0 ; +break ; + } + } + +/* * WaWmMemoryReadLatency:skl * * punit doesn't take into account the read latency so we need -* to add 2us to the various latency levels we retrieve from -* the punit. -* - W0 is a bit special in that it's the only level that -* can't be disabled if we want to have display working, so -* we always add 2us there. -* - For levels >=1, punit returns 0us latency when they are -* disabled, so we respect that and don't add 2us then -* -* Additionally, if a level n (n > 1) has a 0us latency, all -* levels m (m >= n) need to be disabled. We make sure to -* sanitize the values out of the punit to satisfy this -* requirement. +* to add 2us to the various latency levels we retrieve from the +* punit when level 0 response data us 0us. */ - wm[0 ] +=2 ; -for (level =1 ; level <= max_level; level++) -if (wm[level] !=0 ) +if (wm[0 ] ==0 ) { + wm[0 ] +=2 ; +for (level =1 ; level <= max_level; level++) { +if (wm[level] ==0 ) +break ; wm[level] +=2 ; -else { -for (i = level +1 ; i <= max_level; i++) - wm[i] =0 ; - -break ; } + } + }else if (IS_HASWELL (dev) ||IS_BROADWELL (dev)) {uint64_t sskpd =I915_READ64 (MCH_SSKPD );
Greg Kroah-Hartman
maintainerPATCH 14/51 Revert "drm/i915: Check live status before reading edid"
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Weinehall <[email protected]>
commit 23f889bdf6ee5cfff012d8b09f6bec920c691696 upstream.
This reverts commit 237ed86c693d8a8e4db476976aeb30df4deac74b.
Our current implementation of live status check (repeat 9 times with 10ms delays between each attempt as a workaround for buggy displays) imposes a rather serious penalty, time wise, on intel_hdmi_detect(). Since we we already skip live status checks on platforms before gen 7, and since we seem to have coped quite well before the live status check was introduced for newer platforms too, the previous behaviour is probably preferable, at least unless someone can point to a use-case that the live status check improves (apart from "Bspec says so".)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97139
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94014
--- drivers/gpu/drm/i915/intel_dp.c | 2 +- drivers/gpu/drm/i915/intel_drv.h | 2 -- drivers/gpu/drm/i915/intel_hdmi.c | 36 +++++++----------------------------- 3 files changed, 8 insertions(+), 32 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +1 -1
@@ -4648,7 +4648,7 @@ static bool bxt_digital_port_connected(s* * Return %true if @port is connected, %false otherwise. */ -bool intel_digital_port_connected (struct drm_i915_private *dev_priv, +static bool intel_digital_port_connected (struct drm_i915_private *dev_priv,struct intel_digital_port *port) {if (HAS_PCH_IBX (dev_priv))
drivers/gpu/drm/i915/intel_drv.h +0 -2
@@ -1231,8 +1231,6 @@ void intel_edp_drrs_disable(struct intelvoid intel_edp_drrs_invalidate (struct drm_device *dev,unsigned frontbuffer_bits);void intel_edp_drrs_flush (struct drm_device *dev,unsigned frontbuffer_bits); -bool intel_digital_port_connected (struct drm_i915_private *dev_priv, -struct intel_digital_port *port);void hsw_dp_set_ddi_pll_sel (struct intel_crtc_state *pipe_config);/* intel_dp_mst.c */
drivers/gpu/drm/i915/intel_hdmi.c +7 -29
@@ -1331,19 +1331,18 @@ intel_hdmi_unset_edid(struct drm_connect }static bool -intel_hdmi_set_edid (struct drm_connector *connector,bool force) +intel_hdmi_set_edid (struct drm_connector *connector) {struct drm_i915_private *dev_priv =to_i915 (connector->dev);struct intel_hdmi *intel_hdmi =intel_attached_hdmi (connector); -struct edid *edid =NULL ; +struct edid *edid;bool connected = false;intel_display_power_get (dev_priv,POWER_DOMAIN_GMBUS ); -if (force) - edid =drm_get_edid (connector, -intel_gmbus_get_adapter (dev_priv, - intel_hdmi->ddc_bus)); + edid =drm_get_edid (connector, +intel_gmbus_get_adapter (dev_priv, + intel_hdmi->ddc_bus));intel_display_power_put (dev_priv,POWER_DOMAIN_GMBUS );
@@ -1371,37 +1370,16 @@ static enum drm_connector_status intel_hdmi_detect(struct drm_connector *connector, bool force) {enum drm_connector_status status; -struct intel_hdmi *intel_hdmi =intel_attached_hdmi (connector);struct drm_i915_private *dev_priv =to_i915 (connector->dev); -bool live_status = false; -unsigned int try;DRM_DEBUG_KMS ("[CONNECTOR:%d:%s]\n" , connector->base.id, connector->name);intel_display_power_get (dev_priv,POWER_DOMAIN_GMBUS ); -for (try =0 ; !live_status && try <9 ; try++) { -if (try) -msleep (10 ); - live_status =intel_digital_port_connected (dev_priv, -hdmi_to_dig_port (intel_hdmi)); - } - -if (!live_status) { -DRM_DEBUG_KMS ("HDMI live status down\n" ); -/* -* Live status register is not reliable on all intel platforms. -* So consider live_status only for certain platforms, for -* others, read EDID to determine presence of sink. -*/ -if (INTEL_INFO (dev_priv)->gen <7 ||IS_IVYBRIDGE (dev_priv)) - live_status = true; - } -intel_hdmi_unset_edid (connector); -if (intel_hdmi_set_edid (connector, live_status)) { +if (intel_hdmi_set_edid (connector)) {struct intel_hdmi *intel_hdmi =intel_attached_hdmi (connector);hdmi_to_dig_port (intel_hdmi)->base.type =INTEL_OUTPUT_HDMI ;
@@ -1427,7 +1405,7 @@ intel_hdmi_force(struct drm_connector *cif (connector->status != connector_status_connected)return ; -intel_hdmi_set_edid (connector, true); +intel_hdmi_set_edid (connector);hdmi_to_dig_port (intel_hdmi)->base.type =INTEL_OUTPUT_HDMI ; }
Greg Kroah-Hartman
maintainerPATCH 16/51 drm/i915: Unalias obj->phys_handle and obj->userptr
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Wilson <[email protected]>
commit ca5732c53bf66ad755284786897e0dd10330de87 upstream.
We use obj->phys_handle to choose the pread/pwrite path, but as obj->phys_handle is a union with obj->userptr, we then mistakenly use the phys_handle path for userptr objects within pread/pwrite.
Testcase: igt/gem_userptr_blits/forbidden-operations
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97519
--- drivers/gpu/drm/i915/i915_drv.h | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +11 -13
@@ -2150,21 +2150,19 @@ struct drm_i915_gem_object {/** Record of address bit 17 of each page at last unbind. */ unsigned long *bit_17; -union { -/** for phy allocated objects */ -struct drm_dma_handle *phys_handle; - -struct i915_gem_userptr { -uintptr_t ptr; -unsigned read_only :1 ; -unsigned workers :4 ; +struct i915_gem_userptr { +uintptr_t ptr; +unsigned read_only :1 ; +unsigned workers :4 ;#define I915_GEM_USERPTR_MAX_WORKERS 15 -struct i915_mm_struct *mm; -struct i915_mmu_object *mmu_object; -struct work_struct *work; - } userptr; - }; +struct i915_mm_struct *mm; +struct i915_mmu_object *mmu_object; +struct work_struct *work; + } userptr; + +/** for phys allocated objects */ +struct drm_dma_handle *phys_handle; };#define to_intel_bo (x) container_of(x, struct drm_i915_gem_object, base)
Greg Kroah-Hartman
maintainerPATCH 17/51 mm/hugetlb: fix memory offline with hugepage size > memory block size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerald Schaefer <[email protected]>
commit 2247bb335ab9c40058484cac36ea74ee652f3b7b upstream.
Patch series "mm/hugetlb: memory offline issues with hugepages", v4.
This addresses several issues with hugepages and memory offline. While the first patch fixes a panic, and is therefore rather important, the last patch is just a performance optimization.
The second patch fixes a theoretical issue with reserved hugepages, while still leaving some ugly usability issue, see description.
This patch (of 3):
dissolve_free_huge_pages() will either run into the VM_BUG_ON() or a list corruption and addressing exception when trying to set a memory block offline that is part (but not the first part) of a "gigantic" hugetlb page with a size > memory block size.
When no other smaller hugetlb page sizes are present, the VM_BUG_ON() will trigger directly. In the other case we will run into an addressing exception later, because dissolve_free_huge_page() will not work on the head page of the compound hugetlb page which will result in a NULL hstate from page_hstate().
To fix this, first remove the VM_BUG_ON() because it is wrong, and then use the compound head page in dissolve_free_huge_page(). This means that an unused pre-allocated gigantic page that has any part of itself inside the memory block that is going offline will be dissolved completely. Losing an unused gigantic hugepage is preferable to failing the memory offline, for example in the situation where a (possibly faulty) memory DIMM needs to go offline.
Changes for v4.4 stable:
- make it apply w/o commit c1470b33 "mm/hugetlb: fix incorrect hugepages count during mem hotplug"
--- mm/hugetlb.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
mm/hugetlb.c +7 -6
@@ -1416,12 +1416,13 @@ static void dissolve_free_huge_page(stru {spin_lock (&hugetlb_lock);if (PageHuge (page) && !page_count (page)) { -struct hstate *h =page_hstate (page); -int nid =page_to_nid (page); -list_del (&page->lru); +struct page *head =compound_head (page); +struct hstate *h =page_hstate (head); +int nid =page_to_nid (head); +list_del (&head->lru); h->free_huge_pages--; h->free_huge_pages_node[nid]--; -update_and_free_page (h, page); +update_and_free_page (h, head); }spin_unlock (&hugetlb_lock); }
@@ -1429,7 +1430,8 @@ static void dissolve_free_huge_page(stru/* * Dissolve free hugepages in a given pfn range. Used by memory hotplug to * make specified memory blocks removable from the system. -* Note that start_pfn should aligned with (minimum) hugepage size. +* Note that this will dissolve a free gigantic hugepage completely, if any +* part of it lies within the given range. */ void dissolve_free_huge_pages (unsigned long start_pfn,unsigned long end_pfn) {
@@ -1438,7 +1440,6 @@ void dissolve_free_huge_pages(unsigned lif (!hugepages_supported ())return ; -VM_BUG_ON (!IS_ALIGNED (start_pfn,1 << minimum_order));for (pfn = start_pfn; pfn < end_pfn; pfn +=1 << minimum_order)dissolve_free_huge_page (pfn_to_page (pfn)); }
Greg Kroah-Hartman
maintainerPATCH 18/51 brcmfmac: avoid potential stack overflow in brcmf_cfg80211_start_ap()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arend Van Spriel <[email protected]>
commit ded89912156b1a47d940a0c954c43afbabd0c42c upstream.
User-space can choose to omit NL80211_ATTR_SSID and only provide raw IE TLV data. When doing so it can provide SSID IE with length exceeding the allowed size. The driver further processes this IE copying it into a local variable without checking the length. Hence stack can be corrupted and used as exploit.
--- drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c +1 -1
@@ -4102,7 +4102,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi (u8 *)&settings->beacon.head[ie_offset], settings->beacon.head_len - ie_offset, WLAN_EID_SSID); -if (!ssid_ie) +if (!ssid_ie || ssid_ie->len >IEEE80211_MAX_SSID_LEN )return -EINVAL ;memcpy (ssid_le.SSID, ssid_ie->data, ssid_ie->len);
Greg Kroah-Hartman
maintainerPATCH 19/51 posix_acl: Clear SGID bit when setting file permissions
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit 073931017b49d9458aa351605b43a7e34598caef upstream.
When file permissions are modified via chmod(2) and the user is not in the owning group or capable of CAP_FSETID, the setgid bit is cleared in inode_change_ok(). Setting a POSIX ACL via setxattr(2) sets the file permissions as well as the new ACL, but doesn't clear the setgid bit in a similar way; this allows to bypass the check in chmod(2). Fix that.
References: CVE-2016-7097
--- fs/9p/acl.c | 40 +++++++++++++++++----------------------- fs/btrfs/acl.c | 6 ++---- fs/ceph/acl.c | 6 ++---- fs/ext2/acl.c | 12 ++++-------- fs/ext4/acl.c | 12 ++++-------- fs/f2fs/acl.c | 6 ++---- fs/gfs2/acl.c | 12 +++--------- fs/hfsplus/posix_acl.c | 4 ++-- fs/jffs2/acl.c | 9 ++++----- fs/jfs/acl.c | 6 ++---- fs/ocfs2/acl.c | 10 ++++------ fs/posix_acl.c | 31 +++++++++++++++++++++++++++++++ fs/reiserfs/xattr_acl.c | 8 ++------ fs/xfs/xfs_acl.c | 13 ++++--------- include/linux/posix_acl.h | 1 + 15 files changed, 84 insertions(+), 92 deletions(-)
fs/9p/acl.c +17 -23
@@ -282,32 +282,26 @@ static int v9fs_xattr_set_acl(const struswitch (handler->flags) {case ACL_TYPE_ACCESS :if (acl) { -umode_t mode = inode->i_mode; - retval =posix_acl_equiv_mode (acl, &mode); -if (retval <0 ) +struct iattr iattr; + + retval =posix_acl_update_mode (inode, &iattr.ia_mode, &acl); +if (retval) goto err_out; -else { -struct iattr iattr; -if (retval ==0 ) { -/* -* ACL can be represented -* by the mode bits. So don't -* update ACL. -*/ - acl =NULL ; - value =NULL ; - size =0 ; - } -/* Updte the mode bits */ - iattr.ia_mode = ((mode &S_IALLUGO ) | - (inode->i_mode & ~S_IALLUGO )); - iattr.ia_valid =ATTR_MODE ; -/* FIXME should we update ctime ? -* What is the following setxattr update the -* mode ? +if (!acl) { +/* +* ACL can be represented +* by the mode bits. So don't +* update ACL. */ -v9fs_vfs_setattr_dotl (dentry, &iattr); + value =NULL ; + size =0 ; } + iattr.ia_valid =ATTR_MODE ; +/* FIXME should we update ctime ? +* What is the following setxattr update the +* mode ? +*/ +v9fs_vfs_setattr_dotl (dentry, &iattr); }break ;case ACL_TYPE_DEFAULT :
fs/btrfs/acl.c +2 -4
@@ -83,11 +83,9 @@ static int __btrfs_set_acl(struct btrfs_case ACL_TYPE_ACCESS : name =POSIX_ACL_XATTR_ACCESS ;if (acl) { - ret =posix_acl_equiv_mode (acl, &inode->i_mode); -if (ret <0 ) + ret =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (ret)return ret; -if (ret ==0 ) - acl =NULL ; } ret =0 ;break ;
fs/ceph/acl.c +2 -4
@@ -94,11 +94,9 @@ int ceph_set_acl(struct inode *inode, stcase ACL_TYPE_ACCESS : name =POSIX_ACL_XATTR_ACCESS ;if (acl) { - ret =posix_acl_equiv_mode (acl, &new_mode); -if (ret <0 ) + ret =posix_acl_update_mode (inode, &new_mode, &acl); +if (ret) goto out; -if (ret ==0 ) - acl =NULL ; }break ;case ACL_TYPE_DEFAULT :
fs/ext2/acl.c +4 -8
@@ -193,15 +193,11 @@ ext2_set_acl(struct inode *inode, structcase ACL_TYPE_ACCESS : name_index =EXT2_XATTR_INDEX_POSIX_ACL_ACCESS ;if (acl) { - error =posix_acl_equiv_mode (acl, &inode->i_mode); -if (error <0 ) + error =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (error)return error; -else { - inode->i_ctime =CURRENT_TIME_SEC ; -mark_inode_dirty (inode); -if (error ==0 ) - acl =NULL ; - } + inode->i_ctime =CURRENT_TIME_SEC ; +mark_inode_dirty (inode); }break ;
fs/ext4/acl.c +4 -8
@@ -196,15 +196,11 @@ __ext4_set_acl(handle_t *handle, structcase ACL_TYPE_ACCESS : name_index =EXT4_XATTR_INDEX_POSIX_ACL_ACCESS ;if (acl) { - error =posix_acl_equiv_mode (acl, &inode->i_mode); -if (error <0 ) + error =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (error)return error; -else { - inode->i_ctime =ext4_current_time (inode); -ext4_mark_inode_dirty (handle, inode); -if (error ==0 ) - acl =NULL ; - } + inode->i_ctime =ext4_current_time (inode); +ext4_mark_inode_dirty (handle, inode); }break ;
fs/f2fs/acl.c +2 -4
@@ -214,12 +214,10 @@ static int __f2fs_set_acl(struct inode *case ACL_TYPE_ACCESS : name_index =F2FS_XATTR_INDEX_POSIX_ACL_ACCESS ;if (acl) { - error =posix_acl_equiv_mode (acl, &inode->i_mode); -if (error <0 ) + error =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (error)return error;set_acl_inode (fi, inode->i_mode); -if (error ==0 ) - acl =NULL ; }break ;
fs/gfs2/acl.c +3 -9
@@ -79,17 +79,11 @@ int gfs2_set_acl(struct inode *inode, stif (type ==ACL_TYPE_ACCESS ) {umode_t mode = inode->i_mode; - error =posix_acl_equiv_mode (acl, &mode); -if (error <0 ) + error =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (error)return error; - -if (error ==0 ) - acl =NULL ; - -if (mode != inode->i_mode) { - inode->i_mode = mode; +if (mode != inode->i_mode)mark_inode_dirty (inode); - } }if (acl) {
fs/hfsplus/posix_acl.c +2 -2
@@ -68,8 +68,8 @@ int hfsplus_set_posix_acl(struct inode *case ACL_TYPE_ACCESS : xattr_name =POSIX_ACL_XATTR_ACCESS ;if (acl) { - err =posix_acl_equiv_mode (acl, &inode->i_mode); -if (err <0 ) + err =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (err)return err; } err =0 ;
fs/jffs2/acl.c +4 -5
@@ -235,9 +235,10 @@ int jffs2_set_acl(struct inode *inode, scase ACL_TYPE_ACCESS : xprefix =JFFS2_XPREFIX_ACL_ACCESS ;if (acl) { -umode_t mode = inode->i_mode; - rc =posix_acl_equiv_mode (acl, &mode); -if (rc <0 ) +umode_t mode; + + rc =posix_acl_update_mode (inode, &mode, &acl); +if (rc)return rc;if (inode->i_mode != mode) {struct iattr attr;
@@ -249,8 +250,6 @@ int jffs2_set_acl(struct inode *inode, sif (rc <0 )return rc; } -if (rc ==0 ) - acl =NULL ; }break ;case ACL_TYPE_DEFAULT :
fs/jfs/acl.c +2 -4
@@ -84,13 +84,11 @@ static int __jfs_set_acl(tid_t tid, strucase ACL_TYPE_ACCESS : ea_name =POSIX_ACL_XATTR_ACCESS ;if (acl) { - rc =posix_acl_equiv_mode (acl, &inode->i_mode); -if (rc <0 ) + rc =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (rc)return rc; inode->i_ctime =CURRENT_TIME ;mark_inode_dirty (inode); -if (rc ==0 ) - acl =NULL ; }break ;case ACL_TYPE_DEFAULT :
fs/ocfs2/acl.c +4 -6
@@ -241,13 +241,11 @@ int ocfs2_set_acl(handle_t *handle,case ACL_TYPE_ACCESS : name_index =OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS ;if (acl) { -umode_t mode = inode->i_mode; - ret =posix_acl_equiv_mode (acl, &mode); -if (ret <0 ) -return ret; +umode_t mode; -if (ret ==0 ) - acl =NULL ; + ret =posix_acl_update_mode (inode, &mode, &acl); +if (ret) +return ret; ret =ocfs2_acl_set_mode (inode, di_bh, handle, mode);
fs/posix_acl.c +31 -0
@@ -592,6 +592,37 @@ no_mem: }EXPORT_SYMBOL_GPL (posix_acl_create); +/** +* posix_acl_update_mode - update mode in set_acl +* +* Update the file mode when setting an ACL: compute the new file permission +* bits based on the ACL. In addition, if the ACL is equivalent to the new +* file mode, set *acl to NULL to indicate that no ACL should be set. +* +* As with chmod, clear the setgit bit if the caller is not in the owning group +* or capable of CAP_FSETID (see inode_change_ok). +* +* Called from set_acl inode operations. +*/ +int posix_acl_update_mode (struct inode *inode,umode_t *mode_p, +struct posix_acl **acl) +{ +umode_t mode = inode->i_mode; +int error; + + error =posix_acl_equiv_mode (*acl, &mode); +if (error <0 ) +return error; +if (error ==0 ) + *acl =NULL ; +if (!in_group_p (inode->i_gid) && + !capable_wrt_inode_uidgid (inode,CAP_FSETID )) + mode &= ~S_ISGID ; + *mode_p = mode; +return 0 ; +} +EXPORT_SYMBOL (posix_acl_update_mode); +/* * Fix up the uids and gids in posix acl extended attributes in place. */
fs/reiserfs/xattr_acl.c +2 -6
@@ -246,13 +246,9 @@ __reiserfs_set_acl(struct reiserfs_transcase ACL_TYPE_ACCESS : name =POSIX_ACL_XATTR_ACCESS ;if (acl) { - error =posix_acl_equiv_mode (acl, &inode->i_mode); -if (error <0 ) + error =posix_acl_update_mode (inode, &inode->i_mode, &acl); +if (error)return error; -else { -if (error ==0 ) - acl =NULL ; - } }break ;case ACL_TYPE_DEFAULT :
fs/xfs/xfs_acl.c +4 -9
@@ -288,16 +288,11 @@ xfs_set_acl(struct inode *inode, structreturn error;if (type ==ACL_TYPE_ACCESS ) { -umode_t mode = inode->i_mode; - error =posix_acl_equiv_mode (acl, &mode); - -if (error <=0 ) { - acl =NULL ; - -if (error <0 ) -return error; - } +umode_t mode; + error =posix_acl_update_mode (inode, &mode, &acl); +if (error) +return error; error =xfs_set_mode (inode, mode);if (error)return error;
include/linux/posix_acl.h +1 -0
@@ -95,6 +95,7 @@ extern int set_posix_acl(struct inode *,extern int posix_acl_chmod (struct inode *,umode_t );extern int posix_acl_create (struct inode *,umode_t *,struct posix_acl **,struct posix_acl **); +extern int posix_acl_update_mode (struct inode *,umode_t *,struct posix_acl **);extern int simple_set_acl (struct inode *,struct posix_acl *,int );extern int simple_acl_create (struct inode *,struct inode *);
Greg Kroah-Hartman
maintainerPATCH 20/51 ipip: Properly mark ipip GRO packets as encapsulated.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesse Gross <[email protected]>
commit b8cba75bdf6a48ea4811bbefb11a94a5c7281b68 upstream.
ipip encapsulated packets can be merged together by GRO but the result does not have the proper GSO type set or even marked as being encapsulated at all. Later retransmission of these packets will likely fail if the device does not support ipip offloads. This is similar to the issue resolved in IPv6 sit in feec0cb3
("ipv6: gro: support sit protocol").
--- net/ipv4/af_inet.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
net/ipv4/af_inet.c +8 -1
@@ -1425,6 +1425,13 @@ out_unlock:return err; } +static int ipip_gro_complete (struct sk_buff *skb,int nhoff) +{ + skb->encapsulation =1 ; +skb_shinfo (skb)->gso_type |=SKB_GSO_IPIP ; +return inet_gro_complete (skb, nhoff); +} +int inet_ctl_sock_create (struct sock **sk,unsigned short family,unsigned short type,unsigned char protocol,struct net *net)
@@ -1653,7 +1660,7 @@ static const struct net_offload ipip_off .callbacks = { .gso_segment = inet_gso_segment, .gro_receive = inet_gro_receive, - .gro_complete = inet_gro_complete, + .gro_complete = ipip_gro_complete, }, };
Greg Kroah-Hartman
maintainerPATCH 21/51 tunnels: Dont apply GRO to multiple layers of encapsulation.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesse Gross <[email protected]>
commit fac8e0f579695a3ecbc4d3cac369139d7f819971 upstream.
When drivers express support for TSO of encapsulated packets, they only mean that they can do it for one layer of encapsulation. Supporting additional levels would mean updating, at a minimum, more IP length fields and they are unaware of this.
No encapsulation device expresses support for handling offloaded encapsulated packets, so we won't generate these types of frames in the transmit path. However, GRO doesn't have a check for multiple levels of encapsulation and will attempt to build them.
UDP tunnel GRO actually does prevent this situation but it only handles multiple UDP tunnels stacked on top of each other. This generalizes that solution to prevent any kind of tunnel stacking that would cause problems.
--- include/linux/netdevice.h | 4 ++-- net/core/dev.c | 2 +- net/ipv4/af_inet.c | 15 ++++++++++++++- net/ipv4/gre_offload.c | 5 +++++ net/ipv4/udp_offload.c | 6 +++--- net/ipv6/ip6_offload.c | 15 ++++++++++++++- 6 files changed, 39 insertions(+), 8 deletions(-)
include/linux/netdevice.h +2 -2
@@ -1986,8 +1986,8 @@ struct napi_gro_cb {/* This is non-zero if the packet may be of the same flow. */ u8 same_flow:1; -/* Used in udp_gro_receive */ - u8 udp_mark:1; +/* Used in tunnel GRO receive */ + u8 encap_mark:1;/* GRO checksum is valid */ u8 csum_valid:1;
net/core/dev.c +1 -1
@@ -4239,7 +4239,7 @@ static enum gro_result dev_gro_receive(sNAPI_GRO_CB (skb)->same_flow =0 ;NAPI_GRO_CB (skb)->flush =0 ;NAPI_GRO_CB (skb)->free =0 ; -NAPI_GRO_CB (skb)->udp_mark =0 ; +NAPI_GRO_CB (skb)->encap_mark =0 ;NAPI_GRO_CB (skb)->gro_remcsum_start =0 ;/* Setup for GRO checksum validation */
net/ipv4/af_inet.c +14 -1
@@ -1383,6 +1383,19 @@ out:return pp; } +static struct sk_buff **ipip_gro_receive (struct sk_buff **head, +struct sk_buff *skb) +{ +if (NAPI_GRO_CB (skb)->encap_mark) { +NAPI_GRO_CB (skb)->flush =1 ; +return NULL ; + } + +NAPI_GRO_CB (skb)->encap_mark =1 ; + +return inet_gro_receive (head, skb); +} +int inet_recv_error (struct sock *sk,struct msghdr *msg,int len,int *addr_len) {if (sk->sk_family ==AF_INET )
@@ -1659,7 +1672,7 @@ static struct packet_offload ip_packet_ostatic const struct net_offload ipip_offload = { .callbacks = { .gso_segment = inet_gso_segment, - .gro_receive = inet_gro_receive, + .gro_receive = ipip_gro_receive, .gro_complete = ipip_gro_complete, }, };
net/ipv4/gre_offload.c +5 -0
@@ -128,6 +128,11 @@ static struct sk_buff **gre_gro_receive(struct packet_offload *ptype;__be16 type; +if (NAPI_GRO_CB (skb)->encap_mark) + goto out; + +NAPI_GRO_CB (skb)->encap_mark =1 ; + off =skb_gro_offset (skb); hlen = off +sizeof (*greh); greh =skb_gro_header_fast (skb, off);
net/ipv4/udp_offload.c +3 -3
@@ -299,14 +299,14 @@ struct sk_buff **udp_gro_receive(structunsigned int off =skb_gro_offset (skb);int flush =1 ; -if (NAPI_GRO_CB (skb)->udp_mark || +if (NAPI_GRO_CB (skb)->encap_mark || (skb->ip_summed !=CHECKSUM_PARTIAL &&NAPI_GRO_CB (skb)->csum_cnt ==0 && !NAPI_GRO_CB (skb)->csum_valid)) goto out; -/* mark that this skb passed once through the udp gro layer */ -NAPI_GRO_CB (skb)->udp_mark =1 ; +/* mark that this skb passed once through the tunnel gro layer */ +NAPI_GRO_CB (skb)->encap_mark =1 ;rcu_read_lock (); uo_priv =rcu_dereference (udp_offload_base);
net/ipv6/ip6_offload.c +14 -1
@@ -258,6 +258,19 @@ out:return pp; } +static struct sk_buff **sit_gro_receive (struct sk_buff **head, +struct sk_buff *skb) +{ +if (NAPI_GRO_CB (skb)->encap_mark) { +NAPI_GRO_CB (skb)->flush =1 ; +return NULL ; + } + +NAPI_GRO_CB (skb)->encap_mark =1 ; + +return ipv6_gro_receive (head, skb); +} +static int ipv6_gro_complete (struct sk_buff *skb,int nhoff) {const struct net_offload *ops;
@@ -302,7 +315,7 @@ static struct packet_offload ipv6_packetstatic const struct net_offload sit_offload = { .callbacks = { .gso_segment = ipv6_gso_segment, - .gro_receive = ipv6_gro_receive, + .gro_receive = sit_gro_receive, .gro_complete = sit_gro_complete, }, };
Greg Kroah-Hartman
maintainerPATCH 22/51 tunnels: Remove encapsulation offloads on decap.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesse Gross <[email protected]>
commit a09a4c8dd1ec7f830e1fb9e59eb72bddc965d168 upstream.
If a packet is either locally encapsulated or processed through GRO it is marked with the offloads that it requires. However, when it is decapsulated these tunnel offload indications are not removed. This means that if we receive an encapsulated TCP packet, aggregate it with GRO, decapsulate, and retransmit the resulting frame on a NIC that does not support encapsulation, we won't be able to take advantage of hardware offloads even though it is just a simple TCP packet at this point.
This fixes the problem by stripping off encapsulation offload indications when packets are decapsulated.
The performance impacts of this bug are significant. In a test where a Geneve encapsulated TCP stream is sent to a hypervisor, GRO'ed, decapsulated, and bridged to a VM performance is improved by 60% (5Gbps->8Gbps) as a result of avoiding unnecessary segmentation at the VM tap interface.
--- include/net/ip_tunnels.h | 16 ++++++++++++++++ net/ipv4/fou.c | 13 +++++++++++-- net/ipv4/ip_tunnel_core.c | 3 ++- net/ipv6/sit.c | 5 +++-- 4 files changed, 32 insertions(+), 5 deletions(-)
include/net/ip_tunnels.h +16 -0
@@ -283,6 +283,22 @@ struct metadata_dst *iptunnel_metadata_rstruct sk_buff *iptunnel_handle_offloads (struct sk_buff *skb,bool gre_csum,int gso_type_mask); +static inline int iptunnel_pull_offloads (struct sk_buff *skb) +{ +if (skb_is_gso (skb)) { +int err; + + err =skb_unclone (skb,GFP_ATOMIC ); +if (unlikely (err)) +return err; +skb_shinfo (skb)->gso_type &= ~(NETIF_F_GSO_ENCAP_ALL >> +NETIF_F_GSO_SHIFT ); + } + + skb->encapsulation =0 ; +return 0 ; +} +static inline void iptunnel_xmit_stats (int err,struct net_device_stats *err_stats,struct pcpu_sw_netstats __percpu *stats)
net/ipv4/fou.c +11 -2
@@ -48,7 +48,7 @@ static inline struct fou *fou_from_sock(return sk->sk_user_data; } -static void fou_recv_pull (struct sk_buff *skb,size_t len) +static int fou_recv_pull (struct sk_buff *skb,size_t len) {struct iphdr *iph =ip_hdr (skb);
@@ -59,6 +59,7 @@ static void fou_recv_pull(struct sk_buff__skb_pull (skb, len);skb_postpull_rcsum (skb,udp_hdr (skb), len);skb_reset_transport_header (skb); +return iptunnel_pull_offloads (skb); }static int fou_udp_recv (struct sock *sk,struct sk_buff *skb)
@@ -68,9 +69,14 @@ static int fou_udp_recv(struct sock *sk,if (!fou)return 1 ; -fou_recv_pull (skb,sizeof (struct udphdr )); +if (fou_recv_pull (skb,sizeof (struct udphdr ))) + goto drop;return -fou->protocol; + +drop: +kfree_skb (skb); +return 0 ; } static struct guehdr *gue_remcsum(struct sk_buff *skb, struct guehdr *guehdr,
@@ -170,6 +176,9 @@ static int gue_udp_recv(struct sock *sk,__skb_pull (skb,sizeof (struct udphdr ) + hdrlen);skb_reset_transport_header (skb); +if (iptunnel_pull_offloads (skb)) + goto drop; +return -guehdr->proto_ctype; drop:
net/ipv4/ip_tunnel_core.c +2 -1
@@ -116,7 +116,8 @@ int iptunnel_pull_header(struct sk_buff skb->vlan_tci =0 ;skb_set_queue_mapping (skb,0 ); skb->pkt_type =PACKET_HOST ; -return 0 ; + +return iptunnel_pull_offloads (skb); }EXPORT_SYMBOL_GPL (iptunnel_pull_header);
net/ipv6/sit.c +3 -2
@@ -681,14 +681,15 @@ static int ipip6_rcv(struct sk_buff *skb skb->mac_header = skb->network_header;skb_reset_network_header (skb);IPCB (skb)->flags =0 ; - skb->protocol =htons (ETH_P_IPV6 ); + skb->dev = tunnel->dev;if (packet_is_spoofed (skb, iph, tunnel)) { tunnel->dev->stats.rx_errors++; goto out; } -__skb_tunnel_rx (skb, tunnel->dev, tunnel->net); +if (iptunnel_pull_header (skb,0 ,htons (ETH_P_IPV6 ))) + goto out; err =IP_ECN_decapsulate (iph, skb);if (unlikely (err)) {
Greg Kroah-Hartman
maintainerPATCH 23/51 powerpc/eeh: Null check uses of eeh_pe_bus_get
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russell Currey <[email protected]>
commit 04fec21c06e35b169a83e75a84a015ab4606bf5e upstream.
eeh_pe_bus_get() can return NULL if a PCI bus isn't found for a given PE. Some callers don't check this, and can cause a null pointer dereference under certain circumstances.
Fix this by checking NULL everywhere eeh_pe_bus_get() is called.
--- arch/powerpc/kernel/eeh_driver.c | 8 ++++++++ arch/powerpc/platforms/powernv/eeh-powernv.c | 5 +++++ 2 files changed, 13 insertions(+)
arch/powerpc/kernel/eeh_driver.c +8 -0
@@ -909,6 +909,14 @@ static void eeh_handle_special_event(voi/* Notify all devices to be down */ eeh_pe_state_clear (pe,EEH_PE_PRI_BUS ); bus =eeh_pe_bus_get (phb_pe); +if (!bus) { +pr_err ("%s: Cannot find PCI bus for " +"PHB#%d-PE#%x\n" , + __func__, + pe->phb->global_number, + pe->addr); +break ; + }eeh_pe_dev_traverse (pe, eeh_report_failure,NULL );pcibios_remove_pci_devices (bus);
arch/powerpc/platforms/powernv/eeh-powernv.c +5 -0
@@ -956,6 +956,11 @@ static int pnv_eeh_reset(struct eeh_pe * } bus =eeh_pe_bus_get (pe); +if (!bus) { +pr_err ("%s: Cannot find PCI bus for PHB#%d-PE#%x\n" , + __func__, pe->phb->global_number, pe->addr); +return -EIO ; + }if (pci_is_root_bus (bus) ||pci_is_root_bus (bus->parent)) ret =pnv_eeh_root_reset (hose, option);
Greg Kroah-Hartman
maintainerPATCH 24/51 perf stat: Fix interval output values
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
commit 51fd2df1e882a3c2a3f4b6c9ff243a93c9046dba upstream.
We broke interval data displays with commit:
3f416f22d1e2 ("perf stat: Do not clean event's private stats")
This commit removed stats cleaning, which is important for '-r' option to carry counters data over the whole run. But it's necessary to clean it for interval mode, otherwise the displayed value is avg of all previous values.
Before:
$ perf stat -e cycles -a -I 1000 record
# time counts unit events
1.000240796 75,216,287 cycles
2.000512791 107,823,524 cycles $ perf stat report
# time counts unit events
1.000240796 75,216,287 cycles
2.000512791 91,519,906 cyclesNow:
$ perf stat report
# time counts unit events
1.000240796 75,216,287 cycles
2.000512791 107,823,524 cyclesNotice the second value being bigger (91,.. < 107,..).
This could be easily verified by using perf script which displays raw stat data:
$ perf script
CPU THREAD VAL ENA RUN TIME EVENT
0 -1 23855779 1000209530 1000209530 1000240796 cycles
1 -1 33340397 1000224964 1000224964 1000240796 cycles
2 -1 15835415 1000226695 1000226695 1000240796 cycles
3 -1 2184696 1000228245 1000228245 1000240796 cycles
0 -1 97014312 2000514533 2000514533 2000512791 cycles
1 -1 46121497 2000543795 2000543795 2000512791 cycles
2 -1 32269530 2000543566 2000543566 2000512791 cycles
3 -1 7634472 2000544108 2000544108 2000512791 cyclesThe sum of the first 4 values is the first interval aggregated value:
23855779 + 33340397 + 15835415 + 2184696 = 75,216,287
The sum of the second 4 values minus first value is the second interval aggregated value:
97014312 + 46121497 + 32269530 + 7634472 - 75216287 = 107,823,524
--- tools/perf/util/stat.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
tools/perf/util/stat.c +10 -0
@@ -311,6 +311,16 @@ int perf_stat_process_counter(struct per aggr->val = aggr->ena = aggr->run =0 ; +/* +* We calculate counter's data every interval, +* and the display code shows ps->res_stats +* avg value. We need to zero the stats for +* interval mode, otherwise overall avg running +* averages will be shown for each interval. +*/ +if (config->interval) +init_stats (ps->res_stats); +if (counter->per_pkg)zero_per_pkg (counter);
Greg Kroah-Hartman
maintainerPATCH 25/51 genirq/generic_chip: Add irq_unmap callback
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Frias <[email protected]>
commit ee26c013cdee0b947e29d6cadfb9ff3341c69ff9 upstream.
Without this patch irq_domain_disassociate() cannot properly release the interrupt. In fact, irq_map_generic_chip() checks a bit on 'gc->installed' but said bit is never cleared, only set.
Commit 088f40b7b027 ("genirq: Generic chip: Add linear irq domain support") added irq_map_generic_chip() function and also stated "This lacks a removal function for now".
This commit provides an implementation of an unmap function that can be called by irq_domain_disassociate().
[ tglx: Made the function static and removed the export as we have neither
a prototype nor a modular user. ]
--- kernel/irq/generic-chip.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
kernel/irq/generic-chip.c +21 -0
@@ -411,8 +411,29 @@ int irq_map_generic_chip(struct irq_doma }EXPORT_SYMBOL_GPL (irq_map_generic_chip); +static void irq_unmap_generic_chip (struct irq_domain *d,unsigned int virq) +{ +struct irq_data *data =irq_domain_get_irq_data (d, virq); +struct irq_domain_chip_generic *dgc = d->gc; +unsigned int hw_irq = data->hwirq; +struct irq_chip_generic *gc; +int irq_idx; + + gc =irq_get_domain_generic_chip (d, hw_irq); +if (!gc) +return ; + + irq_idx = hw_irq % dgc->irqs_per_chip; + +clear_bit (irq_idx, &gc->installed); +irq_domain_set_info (d, virq, hw_irq, &no_irq_chip,NULL ,NULL ,NULL , +NULL ); + +} +struct irq_domain_ops irq_generic_chip_ops = { .map = irq_map_generic_chip, + .unmap = irq_unmap_generic_chip, .xlate = irq_domain_xlate_onetwocell, };EXPORT_SYMBOL_GPL (irq_generic_chip_ops);
Greg Kroah-Hartman
maintainerPATCH 26/51 uio: fix dmem_region_start computation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Viktorin <[email protected]>
commit 4d31a2588ae37a5d0f61f4d956454e9504846aeb upstream.
The variable i contains a total number of resources (including IORESOURCE_IRQ). However, we want the dmem_region_start to point after the last resource of type IORESOURCE_MEM. The original behaviour leads (very likely) to skipping several UIO mapping regions and makes them useless. Fix this by computing dmem_region_start from the uiomem which points to the last used UIO mapping.
--- drivers/uio/uio_dmem_genirq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/uio/uio_dmem_genirq.c +1 -1
@@ -229,7 +229,7 @@ static int uio_dmem_genirq_probe(struct ++uiomem; } - priv->dmem_region_start = i; + priv->dmem_region_start = uiomem - &uioinfo->mem[0 ]; priv->num_dmem_regions = pdata->num_dynamic_regions;for (i =0 ; i < pdata->num_dynamic_regions; ++i) {
Greg Kroah-Hartman
maintainerPATCH 28/51 spi: spi-fsl-dspi: Drop extra spi_master_put in device remove function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit 6999aeabbb703a81a204cb6f9f8f151759a99ac4 upstream.
The call sequence spi_alloc_master/spi_register_master/spi_unregister_master is complete; it reduces the device reference count to zero, which and results in device memory being freed. The subsequent call to spi_master_put is unnecessary and results in an access to free memory. Drop it.
--- drivers/spi/spi-fsl-dspi.c | 1 - 1 file changed, 1 deletion(-)
drivers/spi/spi-fsl-dspi.c +0 -1
@@ -753,7 +753,6 @@ static int dspi_remove(struct platform_d/* Disconnect from the SPI framework */ clk_disable_unprepare (dspi->clk);spi_unregister_master (dspi->master); -spi_master_put (dspi->master);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 29/51 mwifiex: correct aid value during tdls setup
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xinming Hu <[email protected]>
commit b64db1b252e9974a43a51ba083fa7d03e4716167 upstream.
AID gets updated during TDLS setup, but modified value isn't reflected in "priv->assoc_rsp_buf". This causes TDLS setup failure. The problem is fixed here.
--- drivers/net/wireless/mwifiex/join.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/wireless/mwifiex/join.c +1 -2
@@ -661,9 +661,8 @@ int mwifiex_ret_802_11_associate(struct priv->assoc_rsp_size =min (le16_to_cpu (resp->size) -S_DS_GEN ,sizeof (priv->assoc_rsp_buf)); -memcpy (priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size); - assoc_rsp->a_id =cpu_to_le16 (aid); +memcpy (priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size);if (status_code) { priv->adapter->dbg.num_cmd_assoc_failure++;
Greg Kroah-Hartman
maintainerPATCH 31/51 crypto: arm/ghash-ce - add missing async import/export
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit ed4767d612fd2c39e2c4c69eba484c1219dcddb6 upstream.
Since commit 8996eafdcbad ("crypto: ahash - ensure statesize is non-zero"), all ahash drivers are required to implement import()/export(), and must have a non-zero statesize. Fix this for the ARM Crypto Extensions GHASH implementation.
--- arch/arm/crypto/ghash-ce-glue.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
arch/arm/crypto/ghash-ce-glue.c +24 -0
@@ -226,6 +226,27 @@ static int ghash_async_digest(struct aha } } +static int ghash_async_import (struct ahash_request *req,const void *in) +{ +struct ahash_request *cryptd_req =ahash_request_ctx (req); +struct crypto_ahash *tfm =crypto_ahash_reqtfm (req); +struct ghash_async_ctx *ctx =crypto_ahash_ctx (tfm); +struct shash_desc *desc =cryptd_shash_desc (cryptd_req); + + desc->tfm =cryptd_ahash_child (ctx->cryptd_tfm); + desc->flags = req->base.flags; + +return crypto_shash_import (desc, in); +} + +static int ghash_async_export (struct ahash_request *req,void *out) +{ +struct ahash_request *cryptd_req =ahash_request_ctx (req); +struct shash_desc *desc =cryptd_shash_desc (cryptd_req); + +return crypto_shash_export (desc, out); +} +static int ghash_async_setkey (struct crypto_ahash *tfm,const u8 *key,unsigned int keylen) {
@@ -274,7 +295,10 @@ static struct ahash_alg ghash_async_alg .final = ghash_async_final, .setkey = ghash_async_setkey, .digest = ghash_async_digest, + .import = ghash_async_import, + .export = ghash_async_export, .halg.digestsize = GHASH_DIGEST_SIZE, + .halg.statesize = sizeof(struct ghash_desc_ctx), .halg.base = { .cra_name = "ghash", .cra_driver_name = "ghash-ce",
Greg Kroah-Hartman
maintainerPATCH 32/51 hwrng: omap - Only fail if pm_runtime_get_sync returns < 0
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Gerlach <[email protected]>
commit ad8529fde9e3601180a839867a8ab041109aebb5 upstream.
Currently omap-rng checks the return value of pm_runtime_get_sync and reports failure if anything is returned, however it should be checking if ret < 0 as pm_runtime_get_sync return 0 on success but also can return 1 if the device was already active which is not a failure case. Only values < 0 are actual failures.
--- drivers/char/hw_random/omap-rng.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/char/hw_random/omap-rng.c +2 -2
@@ -385,7 +385,7 @@ static int omap_rng_probe(struct platforpm_runtime_enable (&pdev->dev); ret =pm_runtime_get_sync (&pdev->dev); -if (ret) { +if (ret <0 ) {dev_err (&pdev->dev,"Failed to runtime_get device: %d\n" , ret);pm_runtime_put_noidle (&pdev->dev); goto err_ioremap;
@@ -443,7 +443,7 @@ static int __maybe_unused omap_rng_resumint ret; ret =pm_runtime_get_sync (dev); -if (ret) { +if (ret <0 ) {dev_err (dev,"Failed to runtime_get device: %d\n" , ret);pm_runtime_put_noidle (dev);return ret;
Greg Kroah-Hartman
maintainerPATCH 33/51 ASoC: topology: Fix error return code in soc_tplg_dapm_widget_create()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit 8ae3ea48df0d746b663057cf0b972a18d0777b7b upstream.
Fix to return error code -ENOMEM instead of 0 when failed to create widget, as done elsewhere in this function.
--- sound/soc/soc-topology.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/soc-topology.c +1 -0
@@ -1484,6 +1484,7 @@ widget:if (widget ==NULL ) {dev_err (tplg->dev,"ASoC: failed to create widget %s controls\n" , w->name); + ret = -ENOMEM ; goto hdr_err; }
Greg Kroah-Hartman
maintainerPATCH 34/51 ASoC: dapm: Fix possible uninitialized variable in snd_soc_dapm_get_volsw()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
commit 01ad5e7de67b408d9b48b437b06a9938ddf460b5 upstream.
If soc_dapm_read() fails, val will be uninitialized, and bogus values will be written later:
ret = soc_dapm_read(dapm, reg, &val); val = (val >> shift) & mask;
However, the compiler does not give a warning. Return on error before val is really used to avoid this.
This is similar to the commit 6912831623c5 ("ASoC: dapm: Fix uninitialized variable in snd_soc_dapm_get_enum_double()")
--- sound/soc/soc-dapm.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/soc-dapm.c +3 -0
@@ -3015,6 +3015,9 @@ int snd_soc_dapm_get_volsw(struct snd_kc }mutex_unlock (&card->dapm_mutex); +if (ret) +return ret; +if (invert) ucontrol->value.integer.value[0 ] = max - val;else
Greg Kroah-Hartman
maintainerPATCH 35/51 ASoC: dapm: Fix value setting for _ENUM_DOUBLE MUXs second channel
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
commit 071133a209354f39d4e5785d5a6a390e03241841 upstream.
The value for the second channel in _ENUM_DOUBLE (double channel) MUXs is not correctly updated, due to using the wrong bit shift.
Use the correct bit shift, so both channels toggle together.
--- sound/soc/soc-dapm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/soc-dapm.c +1 -1
@@ -3169,7 +3169,7 @@ int snd_soc_dapm_put_enum_double(structif (e->shift_l != e->shift_r) {if (item[1 ] > e->items)return -EINVAL ; - val |=snd_soc_enum_item_to_val (e, item[1 ]) << e->shift_l; + val |=snd_soc_enum_item_to_val (e, item[1 ]) << e->shift_r; mask |= e->mask << e->shift_r; }
Greg Kroah-Hartman
maintainerPATCH 36/51 ASoC: dapm: Fix kcontrol creation for output driver widget
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
commit a3930ed060df4ccf2a06cf0b68738dec3e6ff89a upstream.
Commit d88429a695a4 ("ASoC: dapm: Add output driver widget") added the snd_soc_dapm_out_drv ID for the output driver widget, which is the same as the PGA widget, with a later power sequence number.
Commit 19a2557b76d6 ("ASoC: dapm: Add kcontrol support for PGAs") then added kcontrol support for PGA widgets, but failed to account for output driver widgets. Attempts to use kcontrols with output driver widgets result in silent failures, with the developer having little idea about what went on.
Add snd_soc_dapm_out_drv to the switch/case block under snd_soc_dapm_pga in dapm_create_or_share_kcontrol, since they are essentially the same.
--- sound/soc/soc-dapm.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/soc-dapm.c +1 -0
@@ -823,6 +823,7 @@ static int dapm_create_or_share_kcontrolcase snd_soc_dapm_switch:case snd_soc_dapm_mixer:case snd_soc_dapm_pga: +case snd_soc_dapm_out_drv: wname_in_long_name = true; kcname_in_long_name = true;break ;
Greg Kroah-Hartman
maintainerPATCH 37/51 staging: r8188eu: Fix scheduling while atomic splat
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit 1335a9516d3d52f157ad87456efdd8dc9ae1747b upstream.
Commit fadbe0cd5292851608e2e01b91d9295fa287b9fe ("staging: rtl8188eu:
Remove rtw_zmalloc(), wrapper for kzalloc()") changed all allocation calls to be GFP_KERNEL even though the original wrapper was testing to determine if the caller was in atomic mode. Most of the mistakes were corrected with commit 33dc85c3c667209c930b2dac5ccbc2a365e06b7a ("staging: r8188eu: Fix scheduling while atomic error introduced in commit fadbe0cd"); however, two kzalloc calls were missed as the call only happens when the driver is shutting down.
--- drivers/staging/rtl8188eu/core/rtw_cmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/rtl8188eu/core/rtw_cmd.c +2 -2
@@ -718,13 +718,13 @@ u8 rtw_addbareq_cmd(struct adapter *padau8 res = _SUCCESS; - ph2c =kzalloc (sizeof (struct cmd_obj ),GFP_KERNEL ); + ph2c =kzalloc (sizeof (struct cmd_obj ),GFP_ATOMIC );if (ph2c ==NULL ) { res = _FAIL; goto exit; } - paddbareq_parm =kzalloc (sizeof (struct addBaReq_parm ),GFP_KERNEL ); + paddbareq_parm =kzalloc (sizeof (struct addBaReq_parm ),GFP_ATOMIC );if (paddbareq_parm ==NULL ) {kfree (ph2c); res = _FAIL;
Greg Kroah-Hartman
maintainerPATCH 38/51 power: bq24257: Fix use of uninitialized pointer bq->charger
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Georges Savoundararadj <[email protected]>
commit 0610735928ee47870e083d5901caa371089216f1 upstream.
bq->charger is initialized in bq24257_power_supply_init. Therefore, bq24257_power_supply_init should be called before the registration of the IRQ handler bq24257_irq_handler_thread that calls power_supply_changed(bq->charger).
--- drivers/power/bq24257_charger.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/power/bq24257_charger.c +6 -6
@@ -1068,6 +1068,12 @@ static int bq24257_probe(struct i2c_cliereturn ret; } + ret =bq24257_power_supply_init (bq); +if (ret <0 ) { +dev_err (dev,"Failed to register power supply\n" ); +return ret; + } + ret = devm_request_threaded_irq(dev, client->irq, NULL, bq24257_irq_handler_thread, IRQF_TRIGGER_FALLING |
@@ -1078,12 +1084,6 @@ static int bq24257_probe(struct i2c_cliereturn ret; } - ret =bq24257_power_supply_init (bq); -if (ret <0 ) { -dev_err (dev,"Failed to register power supply\n" ); -return ret; - } - ret =sysfs_create_group (&bq->charger->dev.kobj, &bq24257_attr_group);if (ret <0 ) {dev_err (dev,"Can't create sysfs entries\n" );
Greg Kroah-Hartman
maintainerPATCH 39/51 dmaengine: ipu: remove bogus NO_IRQ reference
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 86c7e6836479c4045a9a81ed5ea76c51d719f9c1 upstream.
A workaround for a warning introduced a use of the NO_IRQ macro that should have been gone for a long time.
It is clear from the code that the value cannot actually be used, but apparently there was a configuration at some point that caused a warning, so instead of just reverting that patch, this rearranges the code in a way that the warning cannot reappear.
--- drivers/dma/ipu/ipu_irq.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/dma/ipu/ipu_irq.c +4 -5
@@ -286,22 +286,21 @@ static void ipu_irq_handler(struct irq_draw_spin_unlock (&bank_lock);while ((line =ffs (status))) {struct ipu_irq_map *map; -unsigned int irq =NO_IRQ ; +unsigned int irq; line--; status &= ~(1UL << line);raw_spin_lock (&bank_lock); map =src2map (32 * i + line); -if (map) - irq = map->irq; -raw_spin_unlock (&bank_lock); -if (!map) { +raw_spin_unlock (&bank_lock);pr_err ("IPU: Interrupt on unmapped source %u bank %d\n" , line, i);continue ; } + irq = map->irq; +raw_spin_unlock (&bank_lock);generic_handle_irq (irq); } }
Greg Kroah-Hartman
maintainerPATCH 40/51 x86/mm: Expand the exception table logic to allow new handling options
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Luck <[email protected]>
commit 548acf19234dbda5a52d5a8e7e205af46e9da840 upstream.
Huge amounts of help from Andy Lutomirski and Borislav Petkov to produce this. Andy provided the inspiration to add classes to the exception table with a clever bit-squeezing trick, Boris pointed out how much cleaner it would all be if we just had a new field.
Linus Torvalds blessed the expansion with:
' I'd rather not be clever in order to save just a tiny amount of space
in the exception table, which isn't really criticial for anybody. '
The third field is another relative function pointer, this one to a handler that executes the actions.
We start out with three handlers:
1: Legacy - just jumps the to fixup IP
2: Fault - provide the trap number in %ax to the fixup code 3: Cleaned up legacy for the uaccess error hack
--- Documentation/x86/exception-tables.txt | 35 +++++++++++ arch/x86/include/asm/asm.h | 40 +++++++----- arch/x86/include/asm/uaccess.h | 16 ++--- arch/x86/kernel/kprobes/core.c | 2 arch/x86/kernel/traps.c | 6 - arch/x86/mm/extable.c | 102 +++++++++++++++++++++++---------- arch/x86/mm/fault.c | 2 scripts/sortextable.c | 32 ++++++++++ 8 files changed, 177 insertions(+), 58 deletions(-)
Documentation/x86/exception-tables.txt +35 -0
@@ -290,3 +290,38 @@ Due to the way that the exception table only use exceptions for code in the .text section. Any other section will cause the exception table to not be sorted correctly, and the exceptions will fail. + +Things changed when 64-bit support was added to x86 Linux. Rather than +double the size of the exception table by expanding the two entries +from 32-bits to 64 bits, a clever trick was used to store addresses +as relative offsets from the table itself. The assembly code changed +from: + .long 1b,3b +to: + .long (from) - . + .long (to) - . + +and the C-code that uses these values converts back to absolute addresses +like this: + + ex_insn_addr(const struct exception_table_entry *x) + { + return (unsigned long)&x->insn + x->insn; + } + +In v4.6 the exception table entry was expanded with a new field "handler". +This is also 32-bits wide and contains a third relative function +pointer which points to one of: + +1) int ex_handler_default(const struct exception_table_entry *fixup) + This is legacy case that just jumps to the fixup code +2) int ex_handler_fault(const struct exception_table_entry *fixup) + This case provides the fault number of the trap that occurred at + entry->insn. It is used to distinguish page faults from machine + check. +3) int ex_handler_ext(const struct exception_table_entry *fixup) + This case is used for uaccess_err ... we need to set a flag + in the task structure. Before the handler functions existed this + case was handled by adding a large offset to the fixup to tag + it as special. +More functions can easily be added.
arch/x86/include/asm/asm.h +24 -16
@@ -44,19 +44,22 @@/* Exception table entry */ #ifdef __ASSEMBLY__ -# define _ASM_EXTABLE (from,to) \ +# define _ASM_EXTABLE_HANDLE (from, to, handler) \ .pushsection "__ex_table","a" ; \ - .balign 8 ; \ + .balign 4 ; \ .long (from) - . ; \ .long (to) - . ; \ + .long (handler) - . ; \ .popsection -# define _ASM_EXTABLE_EX (from,to) \ - .pushsection "__ex_table","a" ; \ - .balign 8 ; \ - .long (from) - . ; \ - .long (to) - . + 0x7ffffff0 ; \ - .popsection +# define _ASM_EXTABLE (from, to) \ + _ASM_EXTABLE_HANDLE(from, to, ex_handler_default) + +# define _ASM_EXTABLE_FAULT (from, to) \ + _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault) + +# define _ASM_EXTABLE_EX (from, to) \ + _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext)# define _ASM_NOKPROBE (entry) \ .pushsection "_kprobe_blacklist","aw" ; \
@@ -89,19 +92,24 @@ .endm#else -# define _ASM_EXTABLE (from,to) \ +# define _EXPAND_EXTABLE_HANDLE (x) #x +# define _ASM_EXTABLE_HANDLE (from, to, handler) \ " .pushsection \"__ex_table\",\"a\"\n" \ - " .balign 8\n" \ + " .balign 4\n" \ " .long (" #from ") - .\n" \ " .long (" #to ") - .\n" \ + " .long (" _EXPAND_EXTABLE_HANDLE(handler) ") - .\n" \ " .popsection\n" -# define _ASM_EXTABLE_EX (from,to) \ - " .pushsection \"__ex_table\",\"a\"\n" \ - " .balign 8\n" \ - " .long (" #from ") - .\n" \ - " .long (" #to ") - . + 0x7ffffff0\n" \ - " .popsection\n" +# define _ASM_EXTABLE (from, to) \ + _ASM_EXTABLE_HANDLE(from, to, ex_handler_default) + +# define _ASM_EXTABLE_FAULT (from, to) \ + _ASM_EXTABLE_HANDLE(from, to, ex_handler_fault) + +# define _ASM_EXTABLE_EX (from, to) \ + _ASM_EXTABLE_HANDLE(from, to, ex_handler_ext) +/* For C file, we already have NOKPROBE_SYMBOL macro */ #endif
arch/x86/include/asm/uaccess.h +8 -8
@@ -90,12 +90,11 @@ static inline bool __chk_range_not_ok(unlikely (!__range_not_ok (addr, size,user_addr_max ()))/* -* The exception table consists of pairs of addresses relative to the -* exception table enty itself: the first is the address of an -* instruction that is allowed to fault, and the second is the address -* at which the program should continue. No registers are modified, -* so it is entirely up to the continuation code to figure out what to -* do. +* The exception table consists of triples of addresses relative to the +* exception table entry itself. The first address is of an instruction +* that is allowed to fault, the second is the target at which the program +* should continue. The third is a handler function to deal with the fault +* caused by the instruction in the first field. * * All the routines below use bits of fixup code that are out of line * with the main instruction path. This means when everything is well,
@@ -104,13 +103,14 @@ static inline bool __chk_range_not_ok(un*/ struct exception_table_entry { -int insn, fixup; +int insn, fixup, handler; };/* This is not the generic standard exception_table_entry format */ #define ARCH_HAS_SORT_EXTABLE #define ARCH_HAS_SEARCH_EXTABLE -extern int fixup_exception (struct pt_regs *regs); +extern int fixup_exception (struct pt_regs *regs,int trapnr); +extern bool ex_has_fault_handler (unsigned long ip);extern int early_fixup_exception (unsigned long *ip);/*
arch/x86/kernel/kprobes/core.c +1 -1
@@ -1000,7 +1000,7 @@ int kprobe_fault_handler(struct pt_regs* In case the user-specified fault handler returned * zero, try to fix up. */ -if (fixup_exception (regs)) +if (fixup_exception (regs, trapnr))return 1 ;/*
arch/x86/kernel/traps.c +3 -3
@@ -199,7 +199,7 @@ do_trap_no_signal(struct task_struct *ts }if (!user_mode (regs)) { -if (!fixup_exception (regs)) { +if (!fixup_exception (regs, trapnr)) { tsk->thread.error_code = error_code; tsk->thread.trap_nr = trapnr;die (str, regs, error_code);
@@ -453,7 +453,7 @@ do_general_protection(struct pt_regs *re tsk = current;if (!user_mode (regs)) { -if (fixup_exception (regs)) +if (fixup_exception (regs,X86_TRAP_GP ))return ; tsk->thread.error_code = error_code;
@@ -699,7 +699,7 @@ static void math_error(struct pt_regs *rconditional_sti (regs);if (!user_mode (regs)) { -if (!fixup_exception (regs)) { +if (!fixup_exception (regs, trapnr)) { task->thread.error_code = error_code; task->thread.trap_nr = trapnr;die (str, regs, error_code);
arch/x86/mm/extable.c +73 -29
144 lines not on this page · raw message
arch/x86/mm/fault.c +1 -1
@@ -663,7 +663,7 @@ no_context(struct pt_regs *regs, unsigneint sig;/* Are we prepared to handle this kernel fault? */ -if (fixup_exception (regs)) { +if (fixup_exception (regs,X86_TRAP_PF )) {/* * Any interrupt that takes a fault gets the fixup. This makes * the below recursive fault logic only apply to a faults from
scripts/sortextable.c +32 -0
@@ -209,6 +209,35 @@ static int compare_relative_table(constreturn 0 ; } +static void x86_sort_relative_table (char *extab_image,int image_size) +{ +int i; + + i =0 ; +while (i < image_size) { +uint32_t *loc = (uint32_t *)(extab_image + i); + +w (r (loc) + i, loc); +w (r (loc +1 ) + i +4 , loc +1 ); +w (r (loc +2 ) + i +8 , loc +2 ); + + i +=sizeof (uint32_t ) *3 ; + } + +qsort (extab_image, image_size /12 ,12 , compare_relative_table); + + i =0 ; +while (i < image_size) { +uint32_t *loc = (uint32_t *)(extab_image + i); + +w (r (loc) - i, loc); +w (r (loc +1 ) - (i +4 ), loc +1 ); +w (r (loc +2 ) - (i +8 ), loc +2 ); + + i +=sizeof (uint32_t ) *3 ; + } +} +static void sort_relative_table (char *extab_image,int image_size) {int i;
@@ -281,6 +310,9 @@ do_file(char const *const fname)break ;case EM_386 :case EM_X86_64 : + custom_sort = x86_sort_relative_table; +break ; +case EM_S390 : custom_sort = sort_relative_table;break ;
Greg Kroah-Hartman
maintainerPATCH 41/51 s390/cio: fix accidental interrupt enabling during resume
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Ott <[email protected]>
commit d53c51f26145657aa7c55fa396f93677e613548d upstream.
Since commit 9f3d6d7 chsc_get_channel_measurement_chars is called with interrupts disabled during resume from hibernate. Since this function used spin_unlock_irq, interrupts have been enabled accidentally. Fix this by using the irqsave variant.
Since we can't guarantee the IRQ-enablement state for all (future/ external) callers, change the locking in related functions to prevent similar bugs in the future.
--- drivers/s390/cio/chsc.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/s390/cio/chsc.c +12 -8
@@ -95,12 +95,13 @@ struct chsc_ssd_area {int chsc_get_ssd_info (struct subchannel_id schid,struct chsc_ssd_info *ssd) {struct chsc_ssd_area *ssd_area; +unsigned long flags;int ccode;int ret;int i;int mask; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); ssd_area = chsc_page; ssd_area->request.length =0x0010 ;
@@ -144,7 +145,7 @@ int chsc_get_ssd_info(struct subchannel_ ssd->fla[i] = ssd_area->fla[i]; } out: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return ret; }
@@ -832,9 +833,10 @@ int __chsc_do_secm(struct channel_subsys u32 fmt : 4; u32 :16 ; } __attribute__ ((packed)) *secm_area; +unsigned long flags;int ret, ccode; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); secm_area = chsc_page; secm_area->request.length =0x0050 ;
@@ -864,7 +866,7 @@ int __chsc_do_secm(struct channel_subsysCIO_CRW_EVENT (2 ,"chsc: secm failed (rc=%04x)\n" , secm_area->response.code); out: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return ret; }
@@ -993,6 +995,7 @@ chsc_initialize_cmg_chars(struct channelint chsc_get_channel_measurement_chars (struct channel_path *chp) { +unsigned long flags;int ccode, ret;struct {
@@ -1022,7 +1025,7 @@ int chsc_get_channel_measurement_chars(sif (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm)return 0 ; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); scmc_area = chsc_page; scmc_area->request.length =0x0010 ;
@@ -1054,7 +1057,7 @@ int chsc_get_channel_measurement_chars(schsc_initialize_cmg_chars (chp, scmc_area->cmcv, (struct cmg_chars *) &scmc_area->data); out: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return ret; }
@@ -1135,6 +1138,7 @@ struct css_chsc_char css_chsc_characteriint __init chsc_determine_css_characteristics (void ) { +unsigned long flags;int result;struct {struct chsc_header request;
@@ -1147,7 +1151,7 @@ chsc_determine_css_characteristics(void)u32 chsc_char[508 ]; } __attribute__ ((packed)) *scsc_area; -spin_lock_irq (&chsc_page_lock); +spin_lock_irqsave (&chsc_page_lock, flags);memset (chsc_page,0 ,PAGE_SIZE ); scsc_area = chsc_page; scsc_area->request.length =0x0010 ;
@@ -1169,7 +1173,7 @@ chsc_determine_css_characteristics(void)CIO_CRW_EVENT (2 ,"chsc: scsc failed (rc=%04x)\n" , scsc_area->response.code); exit: -spin_unlock_irq (&chsc_page_lock); +spin_unlock_irqrestore (&chsc_page_lock, flags);return result; }
Greg Kroah-Hartman
maintainerPATCH 42/51 s390/con3270: fix use of uninitialised data
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sascha Silbe <[email protected]>
commit c14f2aac7aa147861793eed9f41f91dd530f0be1 upstream.
con3270 contains an optimisation that reduces the amount of data to be transmitted to the 3270 terminal by putting a Repeat to Address (RA) order into the data stream. The RA order itself takes up space, so con3270 only uses it if there's enough space left in the line buffer. Otherwise it just pads out the line manually.
For lines too long to include the RA order, one byte was left uninitialised. This was caused by an off-by-one bug in the loop that pads out the line. Since the buffer is allocated from a common pool, the single byte left uninitialised contained some previous buffer content. Usually this was just a space or some character (which can result in clutter but is otherwise harmless). Sometimes, however, it was a Repeat to Address order, messing up the entire screen layout and causing the display to send the entire buffer content on every keystroke.
--- drivers/s390/char/con3270.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/s390/char/con3270.c +1 -1
@@ -465,7 +465,7 @@ con3270_cline_end(struct con3270 *cp) s->string[s->len -4 ] =TO_RA ; s->string[s->len -1 ] =0 ; }else { -while (--size > cp->cline->len) +while (--size >= cp->cline->len) s->string[size] = cp->view.ascebc[' ' ]; }/* Replace cline with allocated line s and reset cline. */
Greg Kroah-Hartman
maintainerPATCH 43/51 s390/con3270: fix insufficient space padding
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sascha Silbe <[email protected]>
commit 6cd997db911f28f2510b771691270c52b63ed2e6 upstream.
con3270 contains an optimisation that reduces the amount of data to be transmitted to the 3270 terminal by putting a Repeat to Address (RA) order into the data stream. The RA order itself takes up space, so con3270 only uses it if there's enough space left in the line buffer. Otherwise it just pads out the line manually.
For lines that were _just_ short enough that the RA order still fit in the line buffer, the line was instead padded with an insufficient amount of spaces. This was caused by examining the size of the allocated line buffer rather than the length of the string to be displayed.
For con3270_cline_end(), we just compare against the line length. For con3270_update_string() however that isn't available anymore, so we check whether the Repeat to Address order is present.
--- drivers/s390/char/con3270.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/s390/char/con3270.c +7 -2
@@ -124,7 +124,12 @@ con3270_create_status(struct con3270 *cpstatic void con3270_update_string (struct con3270 *cp,struct string *s,int nr) { -if (s->len >= cp->view.cols -5 ) +if (s->len <4 ) { +/* This indicates a bug, but printing a warning would +* cause a deadlock. */ +return ; + } +if (s->string[s->len -4 ] !=TO_RA )return ;raw3270_buffer_address (cp->view.dev, s->string + s->len -3 , cp->view.cols * (nr +1 ));
@@ -461,7 +466,7 @@ con3270_cline_end(struct con3270 *cp) cp->cline->len + 4 : cp->view.cols; s =con3270_alloc_string (cp, size);memcpy (s->string, cp->cline->string, cp->cline->len); -if (s->len < cp->view.cols -5 ) { +if (cp->cline->len < cp->view.cols -5 ) { s->string[s->len -4 ] =TO_RA ; s->string[s->len -1 ] =0 ; }else {
Greg Kroah-Hartman
maintainerPATCH 44/51 clk: qoriq: fix a register offset error
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tang Yuantian <[email protected]>
commit 8964193f6bfda5c4cf14eedb7e94892c1f1c34f0 upstream.
The offset of Core Cluster clock control/status register on cluster group V3 version is different from others, and should be plus 0x70000.
--- drivers/clk/clk-qoriq.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/clk/clk-qoriq.c +5 -1
@@ -766,7 +766,11 @@ static struct clk * __init create_one_cmif (!hwc)return NULL ; - hwc->reg = cg->regs +0x20 * idx; +if (cg->info.flags &CG_VER3 ) + hwc->reg = cg->regs +0x70000 +0x20 * idx; +else + hwc->reg = cg->regs +0x20 * idx; + hwc->info = cg->info.cmux_groups[cg->info.cmux_to_group[idx]];/*
Greg Kroah-Hartman
maintainerPATCH 45/51 clk: divider: Fix clk_divider_round_rate() to use clk_readl()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 2cf9a57811bddb6fa6b0f8d7376da164d5534813 upstream.
clk-divider uses clk_readl()/clk_writel() everywhere, except in clk_divider_round_rate(), where plain readl() is used. Change this to clk_readl(), as it makes a difference on powerpc.
--- drivers/clk/clk-divider.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/clk-divider.c +1 -1
@@ -354,7 +354,7 @@ static long clk_divider_round_rate(struc/* if read only, just return current value */ if (divider->flags &CLK_DIVIDER_READ_ONLY ) { - bestdiv =readl (divider->reg) >> divider->shift; + bestdiv =clk_readl (divider->reg) >> divider->shift; bestdiv &=div_mask (divider->width); bestdiv =_get_div (divider->table, bestdiv, divider->flags, divider->width);
Greg Kroah-Hartman
maintainerPATCH 46/51 perf hists browser: Fix event group display
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
commit d9ea48bc4e7cc297ca1073fa3f90ed80d964b7b4 upstream.
Milian reported that the event group on TUI shows duplicated overhead. This was due to a bug on calculating hpp->buf position. The hpp_advance() was called from __hpp__slsmg_color_printf() on TUI but it's already called from the hpp__call_print_fn macro in __hpp__fmt(). The end result is that the print function returns number of bytes it printed but the buffer advanced twice of the length.
This is generally not a problem since it doesn't need to access the buffer again. But with event group, overhead needs to be printed multiple times and hist_entry__snprintf_alignment() tries to fill the space with buffer after it printed. So it (brokenly) showed the last overhead again.
The bug was there from the beginning, but I think it's only revealed when the alignment function was added.
--- tools/perf/ui/browsers/hists.c | 1 - 1 file changed, 1 deletion(-)
tools/perf/ui/browsers/hists.c +0 -1
@@ -684,7 +684,6 @@ static int __hpp__slsmg_color_printf(str ret =scnprintf (hpp->buf, hpp->size, fmt, len, percent);ui_browser__printf (arg->b,"%s" , hpp->buf); -advance_hpp (hpp, ret);return ret; }
Greg Kroah-Hartman
maintainerPATCH 47/51 perf symbols: Check symbol_conf.allow_aliases for kallsyms loading too
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit c97b40e4d15f13a36cd037d598e45cbe9e1e5757 upstream.
We can allow aliases to be kept, but we were checking this just when loading vmlinux files, be consistent, do it for any symbol table loading code that calls symbol__fixup_duplicate() by making this function check .allow_aliases instead.
--- tools/perf/util/symbol-elf.c | 3 +-- tools/perf/util/symbol.c | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-)
tools/perf/util/symbol-elf.c +1 -2
@@ -1091,8 +1091,7 @@ new_symbol:* For misannotated, zeroed, ASM function sizes. */ if (nr >0 ) { -if (!symbol_conf.allow_aliases) -symbols__fixup_duplicate (&dso->symbols[map->type]); +symbols__fixup_duplicate (&dso->symbols[map->type]);symbols__fixup_end (&dso->symbols[map->type]);if (kmap) {/*
tools/perf/util/symbol.c +3 -0
@@ -151,6 +151,9 @@ void symbols__fixup_duplicate(struct rb_struct rb_node *nd;struct symbol *curr, *next; +if (symbol_conf.allow_aliases) +return ; + nd =rb_first (symbols);while (nd) {
Greg Kroah-Hartman
maintainerPATCH 48/51 perf symbols: Fixup symbol sizes before picking best ones
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
commit 432746f8e0b6a82ba832b771afe31abd51af6752 upstream.
When we call symbol__fixup_duplicate() we use algorithms to pick the "best" symbols for cases where there are various functions/aliases to an address, and those check zero size symbols, which, before calling symbol__fixup_end() are _all_ symbols in a just parsed kallsyms file.
So first fixup the end, then fixup the duplicates.
Found while trying to figure out why 'perf test vmlinux' failed, see the output of 'perf test -v vmlinux' to see cases where the symbols picked as best for vmlinux don't match the ones picked for kallsyms.
--- tools/perf/util/symbol-elf.c | 2 +- tools/perf/util/symbol.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/symbol-elf.c +1 -1
@@ -1091,8 +1091,8 @@ new_symbol:* For misannotated, zeroed, ASM function sizes. */ if (nr >0 ) { -symbols__fixup_duplicate (&dso->symbols[map->type]);symbols__fixup_end (&dso->symbols[map->type]); +symbols__fixup_duplicate (&dso->symbols[map->type]);if (kmap) {/* * We need to fixup this here too because we create new
tools/perf/util/symbol.c +1 -1
@@ -1278,8 +1278,8 @@ int dso__load_kallsyms(struct dso *dso,if (kallsyms__delta (map, filename, &delta))return -1 ; -symbols__fixup_duplicate (&dso->symbols[map->type]);symbols__fixup_end (&dso->symbols[map->type]); +symbols__fixup_duplicate (&dso->symbols[map->type]);if (dso->kernel ==DSO_TYPE_GUEST_KERNEL ) dso->symtab_type =DSO_BINARY_TYPE__GUEST_KALLSYMS ;
Greg Kroah-Hartman
maintainerPATCH 49/51 mpt3sas: Dont spam logs if logging level is 0
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Thumshirn <[email protected]>
commit 0d667f72b2a20bbac72bec0ab11467fc70bb0f1f upstream.
In _scsih_io_done() we test if the ioc->logging_level does _not_ have the MPT_DEBUG_REPLY bit set and if it hasn't we print the debug messages. This unfortunately is the wrong way around.
Note, the actual bug is older than af0094115 but this commit removed the CONFIG_SCSI_MPT3SAS_LOGGING Kconfig option which hid the bug.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +1 -1
@@ -4510,7 +4510,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *i le16_to_cpu(mpi_reply->DevHandle));mpt3sas_trigger_scsi (ioc, data.skey, data.asc, data.ascq); -if (!(ioc->logging_level &MPT_DEBUG_REPLY ) && +if ((ioc->logging_level &MPT_DEBUG_REPLY ) && ((scmd->sense_buffer[2 ] ==UNIT_ATTENTION ) || (scmd->sense_buffer[2 ] ==MEDIUM_ERROR ) || (scmd->sense_buffer[2 ] ==HARDWARE_ERROR )))
Greg Kroah-Hartman
maintainerPATCH 50/51 powerpc/nvram: Fix an incorrect partition merge
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pan Xinhui <[email protected]>
commit 11b7e154b132232535befe51c55db048069c8461 upstream.
When we merge two contiguous partitions whose signatures are marked NVRAM_SIG_FREE, We need update prev's length and checksum, then write it to nvram, not cur's. So lets fix this mistake now.
Also use memset instead of strncpy to set the partition's name. It's more readable if we want to fill up with duplicate chars .
--- arch/powerpc/kernel/nvram_64.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/kernel/nvram_64.c +3 -3
@@ -969,7 +969,7 @@ int __init nvram_remove_partition(const/* Make partition a free partition */ part->header.signature =NVRAM_SIG_FREE ; -strncpy (part->header.name,"wwwwwwwwwwww" ,12 ); +memset (part->header.name,'w' ,12 ); part->header.checksum =nvram_checksum (&part->header); rc =nvram_write_header (part);if (rc <=0 ) {
@@ -987,8 +987,8 @@ int __init nvram_remove_partition(const }if (prev) { prev->header.length += part->header.length; - prev->header.checksum =nvram_checksum (&part->header); - rc =nvram_write_header (part); + prev->header.checksum =nvram_checksum (&prev->header); + rc =nvram_write_header (prev);if (rc <=0 ) {printk (KERN_ERR "nvram_remove_partition: nvram_write failed (%d)\n" , rc);return rc;
Greg Kroah-Hartman
maintainerPATCH 51/51 ARM: pxa: pxa_cplds: fix interrupt handling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Jarzmik <[email protected]>
commit 9ba63e3cc849cdaf3b675c47cc51fe35419e5117 upstream.
Since its initial commit, the driver is buggy for multiple interrupts handling. The translation from the former lubbock.c file was not complete, and might stall all interrupt handling when multiple interrupts occur.
This is especially true when inside the interrupt handler and if a new interrupt comes and is not handled, leaving the output line still held, and not creating a transition as the GPIO block behind would expect to trigger another cplds_irq_handler() call.
For the record, the hardware is working as follows.
The interrupt mechanism relies on :
- one status register
- one mask register
Let's suppose the input irq lines are called :
- i_sa1111
- i_lan91x
- i_mmc_cd
Let's suppose the status register for each irq line is called :
- status_sa1111
- status_lan91x
- status_mmc_cd
Let's suppose the interrupt mask for each irq line is called :
- irqen_sa1111
- irqen_lan91x
- irqen_mmc_cd
Let's suppose the output irq line, connected to GPIO0 is called :
- o_gpio0
The behavior is as follows :
- o_gpio0 = not((status_sa1111 & irqen_sa1111) |
(status_lan91x & irqen_lan91x) | (status_mmc_cd & irqen_mmc_cd))
=> this is a N-to-1 NOR gate and multiple AND gates
- irqen_* is exactly as programmed by a write to the FPGA
- status_* behavior is governed by a bi-stable D flip-flop => on next FPGA clock :
- if i_xxx is high, status_xxx becomes 1
- if i_xxx is low, status_xxx remains as it is
- if software sets status_xxx to 0, the D flip-flop is reset => status_xxx becomes 0
=> on next FPGA clock cycle, if i_xxx is high, status_xxx becomes
1 again
--- arch/arm/mach-pxa/pxa_cplds_irqs.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-)
arch/arm/mach-pxa/pxa_cplds_irqs.c +15 -9
@@ -41,30 +41,35 @@ static irqreturn_t cplds_irq_handler(intunsigned long pending;unsigned int bit; - pending =readl (fpga->base +FPGA_IRQ_SET_CLR ) & fpga->irq_mask; -for_each_set_bit (bit, &pending,CPLDS_NB_IRQ ) -generic_handle_irq (irq_find_mapping (fpga->irqdomain, bit)); +do { + pending =readl (fpga->base +FPGA_IRQ_SET_CLR ) & fpga->irq_mask; +for_each_set_bit (bit, &pending,CPLDS_NB_IRQ ) { +generic_handle_irq (irq_find_mapping (fpga->irqdomain, + bit)); + } + }while (pending);return IRQ_HANDLED ; } -static void cplds_irq_mask_ack (struct irq_data *d) +static void cplds_irq_mask (struct irq_data *d) {struct cplds *fpga =irq_data_get_irq_chip_data (d);unsigned int cplds_irq =irqd_to_hwirq (d); -unsigned int set, bit =BIT (cplds_irq); +unsigned int bit =BIT (cplds_irq); fpga->irq_mask &= ~bit;writel (fpga->irq_mask, fpga->base +FPGA_IRQ_MASK_EN ); - set =readl (fpga->base +FPGA_IRQ_SET_CLR ); -writel (set & ~bit, fpga->base +FPGA_IRQ_SET_CLR ); }static void cplds_irq_unmask (struct irq_data *d) {struct cplds *fpga =irq_data_get_irq_chip_data (d);unsigned int cplds_irq =irqd_to_hwirq (d); -unsigned int bit =BIT (cplds_irq); +unsigned int set, bit =BIT (cplds_irq); + + set =readl (fpga->base +FPGA_IRQ_SET_CLR ); +writel (set & ~bit, fpga->base +FPGA_IRQ_SET_CLR ); fpga->irq_mask |= bit;writel (fpga->irq_mask, fpga->base +FPGA_IRQ_MASK_EN );
@@ -72,7 +77,8 @@ static void cplds_irq_unmask(struct irq_static struct irq_chip cplds_irq_chip = { .name ="pxa_cplds" , - .irq_mask_ack = cplds_irq_mask_ack, + .irq_ack = cplds_irq_mask, + .irq_mask = cplds_irq_mask, .irq_unmask = cplds_irq_unmask, .flags =IRQCHIP_MASK_ON_SUSPEND |IRQCHIP_SKIP_SET_WAKE , };
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.29 release. There are 51 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 Mon Oct 31 13:49:01 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.29-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America(Silicon Valley) [email protected]
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.29 release. There are 51 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 Mon Oct 31 13:49:01 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 106 pass: 106 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter