commit:     a777b6ab86cba24038c0012c0f5d4f92947814b1
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Wed Feb  1 13:06:11 2017 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Wed Feb  1 13:06:11 2017 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=a777b6ab

Linux kernel 4.9.7
Removed 
2700_schedule-the-output_poll_work-with-1s-delay-if-we-have-delayed-event.patch
as added upstream

 0000_README                                        |    8 +-
 1006_linux-4.9.7.patch                             | 2183 ++++++++++++++++++++
 ...rk-with-1s-delay-if-we-have-delayed-event.patch |   22 -
 3 files changed, 2187 insertions(+), 26 deletions(-)

diff --git a/0000_README b/0000_README
index ee1a951..edead0d 100644
--- a/0000_README
+++ b/0000_README
@@ -67,6 +67,10 @@ Patch:  1005_linux-4.9.6.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.9.6
 
+Patch:  1006_linux-4.9.7.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.9.7
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.
@@ -75,10 +79,6 @@ Patch:  
1510_fs-enable-link-security-restrictions-by-default.patch
 From:   
http://sources.debian.net/src/linux/3.16.7-ckt4-3/debian/patches/debian/fs-enable-link-security-restrictions-by-default.patch/
 Desc:   Enable link security restrictions by default.
 
-Patch:  
2700_schedule-the-output_poll_work-with-1s-delay-if-we-have-delayed-event.patch 
-From:   
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/patch/?id=68f458eec7069d618a6c884ca007426e0cea411b
-Desc:   Schedule the output_poll_work with 1s delay if we have delayed event. 
(Bug #607636)
-
 Patch:  2900_dev-root-proc-mount-fix.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=438380
 Desc:   Ensure that /dev/root doesn't appear in /proc/mounts when bootint 
without an initramfs.

diff --git a/1006_linux-4.9.7.patch b/1006_linux-4.9.7.patch
new file mode 100644
index 0000000..619ee34
--- /dev/null
+++ b/1006_linux-4.9.7.patch
@@ -0,0 +1,2183 @@
+diff --git a/Makefile b/Makefile
+index ef95231d1625..da704d903321 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 6
++SUBLEVEL = 7
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+diff --git a/arch/arc/include/asm/delay.h b/arch/arc/include/asm/delay.h
+index a36e8601114d..d5da2115d78a 100644
+--- a/arch/arc/include/asm/delay.h
++++ b/arch/arc/include/asm/delay.h
+@@ -26,7 +26,9 @@ static inline void __delay(unsigned long loops)
+       "       lp  1f                  \n"
+       "       nop                     \n"
+       "1:                             \n"
+-      : : "r"(loops));
++      :
++        : "r"(loops)
++        : "lp_count");
+ }
+ 
+ extern void __bad_udelay(void);
+diff --git a/arch/arc/kernel/unaligned.c b/arch/arc/kernel/unaligned.c
+index abd961f3e763..91ebe382147f 100644
+--- a/arch/arc/kernel/unaligned.c
++++ b/arch/arc/kernel/unaligned.c
+@@ -241,8 +241,9 @@ int misaligned_fixup(unsigned long address, struct pt_regs 
*regs,
+       if (state.fault)
+               goto fault;
+ 
++      /* clear any remanants of delay slot */
+       if (delay_mode(regs)) {
+-              regs->ret = regs->bta;
++              regs->ret = regs->bta ~1U;
+               regs->status32 &= ~STATUS_DE_MASK;
+       } else {
+               regs->ret += state.instr_len;
+diff --git a/arch/parisc/include/asm/bitops.h 
b/arch/parisc/include/asm/bitops.h
+index 3f9406d9b9d6..da87943328a5 100644
+--- a/arch/parisc/include/asm/bitops.h
++++ b/arch/parisc/include/asm/bitops.h
+@@ -6,7 +6,7 @@
+ #endif
+ 
+ #include <linux/compiler.h>
+-#include <asm/types.h>                /* for BITS_PER_LONG/SHIFT_PER_LONG */
++#include <asm/types.h>
+ #include <asm/byteorder.h>
+ #include <asm/barrier.h>
+ #include <linux/atomic.h>
+@@ -17,6 +17,12 @@
+  * to include/asm-i386/bitops.h or kerneldoc
+  */
+ 
++#if __BITS_PER_LONG == 64
++#define SHIFT_PER_LONG 6
++#else
++#define SHIFT_PER_LONG 5
++#endif
++
+ #define CHOP_SHIFTCOUNT(x) (((unsigned long) (x)) & (BITS_PER_LONG - 1))
+ 
+ 
+diff --git a/arch/parisc/include/uapi/asm/bitsperlong.h 
b/arch/parisc/include/uapi/asm/bitsperlong.h
+index e0a23c7bdd43..07fa7e50bdc0 100644
+--- a/arch/parisc/include/uapi/asm/bitsperlong.h
++++ b/arch/parisc/include/uapi/asm/bitsperlong.h
+@@ -3,10 +3,8 @@
+ 
+ #if defined(__LP64__)
+ #define __BITS_PER_LONG 64
+-#define SHIFT_PER_LONG 6
+ #else
+ #define __BITS_PER_LONG 32
+-#define SHIFT_PER_LONG 5
+ #endif
+ 
+ #include <asm-generic/bitsperlong.h>
+diff --git a/arch/parisc/include/uapi/asm/swab.h 
b/arch/parisc/include/uapi/asm/swab.h
+index e78403b129ef..928e1bbac98f 100644
+--- a/arch/parisc/include/uapi/asm/swab.h
++++ b/arch/parisc/include/uapi/asm/swab.h
+@@ -1,6 +1,7 @@
+ #ifndef _PARISC_SWAB_H
+ #define _PARISC_SWAB_H
+ 
++#include <asm/bitsperlong.h>
+ #include <linux/types.h>
+ #include <linux/compiler.h>
+ 
+@@ -38,7 +39,7 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 
x)
+ }
+ #define __arch_swab32 __arch_swab32
+ 
+-#if BITS_PER_LONG > 32
++#if __BITS_PER_LONG > 32
+ /*
+ ** From "PA-RISC 2.0 Architecture", HP Professional Books.
+ ** See Appendix I page 8 , "Endian Byte Swapping".
+@@ -61,6 +62,6 @@ static inline __attribute_const__ __u64 __arch_swab64(__u64 
x)
+       return x;
+ }
+ #define __arch_swab64 __arch_swab64
+-#endif /* BITS_PER_LONG > 32 */
++#endif /* __BITS_PER_LONG > 32 */
+ 
+ #endif /* _PARISC_SWAB_H */
+diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
+index 9336e824e2db..fc2974b929c3 100644
+--- a/arch/s390/kernel/ptrace.c
++++ b/arch/s390/kernel/ptrace.c
+@@ -963,6 +963,11 @@ static int s390_fpregs_set(struct task_struct *target,
+       if (target == current)
+               save_fpu_regs();
+ 
++      if (MACHINE_HAS_VX)
++              convert_vx_to_fp(fprs, target->thread.fpu.vxrs);
++      else
++              memcpy(&fprs, target->thread.fpu.fprs, sizeof(fprs));
++
+       /* If setting FPC, must validate it first. */
+       if (count > 0 && pos < offsetof(s390_fp_regs, fprs)) {
+               u32 ufpc[2] = { target->thread.fpu.fpc, 0 };
+@@ -1067,6 +1072,9 @@ static int s390_vxrs_low_set(struct task_struct *target,
+       if (target == current)
+               save_fpu_regs();
+ 
++      for (i = 0; i < __NUM_VXRS_LOW; i++)
++              vxrs[i] = *((__u64 *)(target->thread.fpu.vxrs + i) + 1);
++
+       rc = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vxrs, 0, -1);
+       if (rc == 0)
+               for (i = 0; i < __NUM_VXRS_LOW; i++)
+diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
+index 7a1897c51c54..d56ef26d4681 100644
+--- a/arch/s390/mm/pgtable.c
++++ b/arch/s390/mm/pgtable.c
+@@ -202,7 +202,7 @@ static inline pgste_t ptep_xchg_start(struct mm_struct *mm,
+       return pgste;
+ }
+ 
+-static inline void ptep_xchg_commit(struct mm_struct *mm,
++static inline pte_t ptep_xchg_commit(struct mm_struct *mm,
+                                   unsigned long addr, pte_t *ptep,
+                                   pgste_t pgste, pte_t old, pte_t new)
+ {
+@@ -220,6 +220,7 @@ static inline void ptep_xchg_commit(struct mm_struct *mm,
+       } else {
+               *ptep = new;
+       }
++      return old;
+ }
+ 
+ pte_t ptep_xchg_direct(struct mm_struct *mm, unsigned long addr,
+@@ -231,7 +232,7 @@ pte_t ptep_xchg_direct(struct mm_struct *mm, unsigned long 
addr,
+       preempt_disable();
+       pgste = ptep_xchg_start(mm, addr, ptep);
+       old = ptep_flush_direct(mm, addr, ptep);
+-      ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
++      old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
+       preempt_enable();
+       return old;
+ }
+@@ -246,7 +247,7 @@ pte_t ptep_xchg_lazy(struct mm_struct *mm, unsigned long 
addr,
+       preempt_disable();
+       pgste = ptep_xchg_start(mm, addr, ptep);
+       old = ptep_flush_lazy(mm, addr, ptep);
+-      ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
++      old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
+       preempt_enable();
+       return old;
+ }
+diff --git a/arch/tile/kernel/ptrace.c b/arch/tile/kernel/ptrace.c
+index d89b7011667c..e279572824b1 100644
+--- a/arch/tile/kernel/ptrace.c
++++ b/arch/tile/kernel/ptrace.c
+@@ -111,7 +111,7 @@ static int tile_gpr_set(struct task_struct *target,
+                         const void *kbuf, const void __user *ubuf)
+ {
+       int ret;
+-      struct pt_regs regs;
++      struct pt_regs regs = *task_pt_regs(target);
+ 
+       ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &regs, 0,
+                                sizeof(regs));
+diff --git a/arch/x86/platform/mellanox/mlx-platform.c 
b/arch/x86/platform/mellanox/mlx-platform.c
+index 7dcfcca97399..c0355d789fce 100644
+--- a/arch/x86/platform/mellanox/mlx-platform.c
++++ b/arch/x86/platform/mellanox/mlx-platform.c
+@@ -233,7 +233,7 @@ static int __init mlxplat_init(void)
+       return 0;
+ 
+ fail_platform_mux_register:
+-      for (i--; i > 0 ; i--)
++      while (--i >= 0)
+               platform_device_unregister(priv->pdev_mux[i]);
+       platform_device_unregister(priv->pdev_i2c);
+ fail_alloc:
+diff --git a/drivers/base/memory.c b/drivers/base/memory.c
+index 62c63c0c5c22..e7f86a8887d2 100644
+--- a/drivers/base/memory.c
++++ b/drivers/base/memory.c
+@@ -410,14 +410,14 @@ static ssize_t show_valid_zones(struct device *dev,
+       sprintf(buf, "%s", zone->name);
+ 
+       /* MMOP_ONLINE_KERNEL */
+-      zone_shift = zone_can_shift(start_pfn, nr_pages, ZONE_NORMAL);
++      zone_can_shift(start_pfn, nr_pages, ZONE_NORMAL, &zone_shift);
+       if (zone_shift) {
+               strcat(buf, " ");
+               strcat(buf, (zone + zone_shift)->name);
+       }
+ 
+       /* MMOP_ONLINE_MOVABLE */
+-      zone_shift = zone_can_shift(start_pfn, nr_pages, ZONE_MOVABLE);
++      zone_can_shift(start_pfn, nr_pages, ZONE_MOVABLE, &zone_shift);
+       if (zone_shift) {
+               strcat(buf, " ");
+               strcat(buf, (zone + zone_shift)->name);
+diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
b/drivers/gpu/drm/drm_atomic_helper.c
+index 338766c64c99..a05bb3891119 100644
+--- a/drivers/gpu/drm/drm_atomic_helper.c
++++ b/drivers/gpu/drm/drm_atomic_helper.c
+@@ -3115,6 +3115,8 @@ void __drm_atomic_helper_plane_duplicate_state(struct 
drm_plane *plane,
+ 
+       if (state->fb)
+               drm_framebuffer_reference(state->fb);
++
++      state->fence = NULL;
+ }
+ EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state);
+ 
+diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
+index 53f07ac7c174..e14366de0e6e 100644
+--- a/drivers/gpu/drm/drm_modes.c
++++ b/drivers/gpu/drm/drm_modes.c
+@@ -1462,6 +1462,13 @@ drm_mode_create_from_cmdline_mode(struct drm_device 
*dev,
+               return NULL;
+ 
+       mode->type |= DRM_MODE_TYPE_USERDEF;
++      /* fix up 1368x768: GFT/CVT can't express 1366 width due to alignment */
++      if (cmd->xres == 1366 && mode->hdisplay == 1368) {
++              mode->hdisplay = 1366;
++              mode->hsync_start--;
++              mode->hsync_end--;
++              drm_mode_set_name(mode);
++      }
+       drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
+       return mode;
+ }
+diff --git a/drivers/gpu/drm/drm_probe_helper.c 
b/drivers/gpu/drm/drm_probe_helper.c
+index f6b64d7d3528..276474d13763 100644
+--- a/drivers/gpu/drm/drm_probe_helper.c
++++ b/drivers/gpu/drm/drm_probe_helper.c
+@@ -143,8 +143,18 @@ void drm_kms_helper_poll_enable_locked(struct drm_device 
*dev)
+       }
+ 
+       if (dev->mode_config.delayed_event) {
++              /*
++               * FIXME:
++               *
++               * Use short (1s) delay to handle the initial delayed event.
++               * This delay should not be needed, but Optimus/nouveau will
++               * fail in a mysterious way if the delayed event is handled as
++               * soon as possible like it is done in
++               * drm_helper_probe_single_connector_modes() in case the poll
++               * was enabled before.
++               */
+               poll = true;
+-              delay = 0;
++              delay = HZ;
+       }
+ 
+       if (poll)
+diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
+index 18dfdd5c1b3b..670beebc32f6 100644
+--- a/drivers/gpu/drm/i915/i915_drv.c
++++ b/drivers/gpu/drm/i915/i915_drv.c
+@@ -2372,7 +2372,7 @@ static int intel_runtime_suspend(struct device *kdev)
+ 
+       assert_forcewakes_inactive(dev_priv);
+ 
+-      if (!IS_VALLEYVIEW(dev_priv) || !IS_CHERRYVIEW(dev_priv))
++      if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
+               intel_hpd_poll_init(dev_priv);
+ 
+       DRM_DEBUG_KMS("Device suspended\n");
+diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c 
b/drivers/gpu/drm/i915/i915_gem_evict.c
+index 5b6f81c1dbca..7467355e4a18 100644
+--- a/drivers/gpu/drm/i915/i915_gem_evict.c
++++ b/drivers/gpu/drm/i915/i915_gem_evict.c
+@@ -194,6 +194,7 @@ i915_gem_evict_something(struct i915_address_space *vm,
+       }
+ 
+       /* Unbinding will emit any required flushes */
++      ret = 0;
+       while (!list_empty(&eviction_list)) {
+               vma = list_first_entry(&eviction_list,
+                                      struct i915_vma,
+diff --git a/drivers/gpu/drm/i915/intel_crt.c 
b/drivers/gpu/drm/i915/intel_crt.c
+index dfbcf16b41df..4149a0fbe8bd 100644
+--- a/drivers/gpu/drm/i915/intel_crt.c
++++ b/drivers/gpu/drm/i915/intel_crt.c
+@@ -499,6 +499,7 @@ static bool intel_crt_detect_ddc(struct drm_connector 
*connector)
+       struct drm_i915_private *dev_priv = to_i915(crt->base.base.dev);
+       struct edid *edid;
+       struct i2c_adapter *i2c;
++      bool ret = false;
+ 
+       BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG);
+ 
+@@ -515,17 +516,17 @@ static bool intel_crt_detect_ddc(struct drm_connector 
*connector)
+                */
+               if (!is_digital) {
+                       DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n");
+-                      return true;
++                      ret = true;
++              } else {
++                      DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID 
reports a digital panel]\n");
+               }
+-
+-              DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a 
digital panel]\n");
+       } else {
+               DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [no valid EDID 
found]\n");
+       }
+ 
+       kfree(edid);
+ 
+-      return false;
++      return ret;
+ }
+ 
+ static enum drm_connector_status
+diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
+index 869b29fe9ec4..8079e5b380cb 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -2587,8 +2587,9 @@ intel_fill_fb_info(struct drm_i915_private *dev_priv,
+                        * We only keep the x/y offsets, so push all of the
+                        * gtt offset into the x/y offsets.
+                        */
+-                      _intel_adjust_tile_offset(&x, &y, tile_size,
+-                                                tile_width, tile_height, 
pitch_tiles,
++                      _intel_adjust_tile_offset(&x, &y,
++                                                tile_width, tile_height,
++                                                tile_size, pitch_tiles,
+                                                 gtt_offset_rotated * 
tile_size, 0);
+ 
+                       gtt_offset_rotated += rot_info->plane[i].width * 
rot_info->plane[i].height;
+@@ -2975,6 +2976,9 @@ int skl_check_plane_surface(struct intel_plane_state 
*plane_state)
+       unsigned int rotation = plane_state->base.rotation;
+       int ret;
+ 
++      if (!plane_state->base.visible)
++              return 0;
++
+       /* Rotate src coordinates to match rotated GTT view */
+       if (intel_rotation_90_or_270(rotation))
+               drm_rect_rotate(&plane_state->base.src,
+@@ -6865,6 +6869,12 @@ static void intel_crtc_disable_noatomic(struct drm_crtc 
*crtc)
+       }
+ 
+       state = drm_atomic_state_alloc(crtc->dev);
++      if (!state) {
++              DRM_DEBUG_KMS("failed to disable [CRTC:%d:%s], out of memory",
++                            crtc->base.id, crtc->name);
++              return;
++      }
++
+       state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
+ 
+       /* Everything's already locked, -EDEADLK can't happen. */
+diff --git a/drivers/gpu/drm/i915/intel_fbdev.c 
b/drivers/gpu/drm/i915/intel_fbdev.c
+index b7098f98bb67..9127e57f383c 100644
+--- a/drivers/gpu/drm/i915/intel_fbdev.c
++++ b/drivers/gpu/drm/i915/intel_fbdev.c
+@@ -745,6 +745,9 @@ void intel_fbdev_initial_config_async(struct drm_device 
*dev)
+ {
+       struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;
+ 
++      if (!ifbdev)
++              return;
++
+       ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev);
+ }
+ 
+diff --git a/drivers/gpu/drm/i915/intel_lrc.c 
b/drivers/gpu/drm/i915/intel_lrc.c
+index 0adb879833ff..67db1577ee49 100644
+--- a/drivers/gpu/drm/i915/intel_lrc.c
++++ b/drivers/gpu/drm/i915/intel_lrc.c
+@@ -858,8 +858,7 @@ static inline int gen8_emit_flush_coherentl3_wa(struct 
intel_engine_cs *engine,
+        * this batch updates GEN8_L3SQCREG4 with default value we need to
+        * set this bit here to retain the WA during flush.
+        */
+-      if (IS_SKL_REVID(dev_priv, 0, SKL_REVID_E0) ||
+-          IS_KBL_REVID(dev_priv, 0, KBL_REVID_E0))
++      if (IS_SKL_REVID(dev_priv, 0, SKL_REVID_E0))
+               l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS;
+ 
+       wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 |
+diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
b/drivers/gpu/drm/i915/intel_ringbuffer.c
+index ed9955dce156..8babfe0ce4e3 100644
+--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
++++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
+@@ -1153,14 +1153,6 @@ static int kbl_init_workarounds(struct intel_engine_cs 
*engine)
+               WA_SET_BIT_MASKED(HDC_CHICKEN0,
+                                 HDC_FENCE_DEST_SLM_DISABLE);
+ 
+-      /* GEN8_L3SQCREG4 has a dependency with WA batch so any new changes
+-       * involving this register should also be added to WA batch as required.
+-       */
+-      if (IS_KBL_REVID(dev_priv, 0, KBL_REVID_E0))
+-              /* WaDisableLSQCROPERFforOCL:kbl */
+-              I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) |
+-                         GEN8_LQSC_RO_PERF_DIS);
+-
+       /* WaToEnableHwFixForPushConstHWBug:kbl */
+       if (IS_KBL_REVID(dev_priv, KBL_REVID_C0, REVID_FOREVER))
+               WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2,
+diff --git a/drivers/gpu/drm/radeon/radeon_drv.c 
b/drivers/gpu/drm/radeon/radeon_drv.c
+index 00ea0002b539..e0c143b865f3 100644
+--- a/drivers/gpu/drm/radeon/radeon_drv.c
++++ b/drivers/gpu/drm/radeon/radeon_drv.c
+@@ -366,11 +366,10 @@ static void
+ radeon_pci_shutdown(struct pci_dev *pdev)
+ {
+       /* if we are running in a VM, make sure the device
+-       * torn down properly on reboot/shutdown.
+-       * unfortunately we can't detect certain
+-       * hypervisors so just do this all the time.
++       * torn down properly on reboot/shutdown
+        */
+-      radeon_pci_remove(pdev);
++      if (radeon_device_is_virtual())
++              radeon_pci_remove(pdev);
+ }
+ 
+ static int radeon_pmops_suspend(struct device *dev)
+diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
+index 7f08d681a74b..d544ff9b0d46 100644
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -832,7 +832,7 @@ static void vc4_crtc_destroy_state(struct drm_crtc *crtc,
+ 
+       }
+ 
+-      __drm_atomic_helper_crtc_destroy_state(state);
++      drm_atomic_helper_crtc_destroy_state(crtc, state);
+ }
+ 
+ static const struct drm_crtc_funcs vc4_crtc_funcs = {
+diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
+index 303f23c96220..18e37171e9c8 100644
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -594,12 +594,14 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info 
*exec)
+                                         args->shader_rec_count);
+       struct vc4_bo *bo;
+ 
+-      if (uniforms_offset < shader_rec_offset ||
++      if (shader_rec_offset < args->bin_cl_size ||
++          uniforms_offset < shader_rec_offset ||
+           exec_size < uniforms_offset ||
+           args->shader_rec_count >= (UINT_MAX /
+                                         sizeof(struct vc4_shader_state)) ||
+           temp_size < exec_size) {
+               DRM_ERROR("overflow in exec arguments\n");
++              ret = -EINVAL;
+               goto fail;
+       }
+ 
+diff --git a/drivers/gpu/drm/vc4/vc4_render_cl.c 
b/drivers/gpu/drm/vc4/vc4_render_cl.c
+index 08886a309757..5cdd003605f5 100644
+--- a/drivers/gpu/drm/vc4/vc4_render_cl.c
++++ b/drivers/gpu/drm/vc4/vc4_render_cl.c
+@@ -461,7 +461,7 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info 
*exec,
+               }
+ 
+               ret = vc4_full_res_bounds_check(exec, *obj, surf);
+-              if (!ret)
++              if (ret)
+                       return ret;
+ 
+               return 0;
+diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
+index 2a6fc47a1dfb..c25768c2dd3b 100644
+--- a/drivers/infiniband/core/cma.c
++++ b/drivers/infiniband/core/cma.c
+@@ -2768,7 +2768,8 @@ static int cma_bind_addr(struct rdma_cm_id *id, struct 
sockaddr *src_addr,
+       if (!src_addr || !src_addr->sa_family) {
+               src_addr = (struct sockaddr *) &id->route.addr.src_addr;
+               src_addr->sa_family = dst_addr->sa_family;
+-              if (dst_addr->sa_family == AF_INET6) {
++              if (IS_ENABLED(CONFIG_IPV6) &&
++                  dst_addr->sa_family == AF_INET6) {
+                       struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 
*) src_addr;
+                       struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 
*) dst_addr;
+                       src_addr6->sin6_scope_id = dst_addr6->sin6_scope_id;
+diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c
+index 84b4eff90395..c22fde6207d1 100644
+--- a/drivers/infiniband/core/umem.c
++++ b/drivers/infiniband/core/umem.c
+@@ -134,6 +134,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, 
unsigned long addr,
+                IB_ACCESS_REMOTE_ATOMIC | IB_ACCESS_MW_BIND));
+ 
+       if (access & IB_ACCESS_ON_DEMAND) {
++              put_pid(umem->pid);
+               ret = ib_umem_odp_get(context, umem);
+               if (ret) {
+                       kfree(umem);
+@@ -149,6 +150,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, 
unsigned long addr,
+ 
+       page_list = (struct page **) __get_free_page(GFP_KERNEL);
+       if (!page_list) {
++              put_pid(umem->pid);
+               kfree(umem);
+               return ERR_PTR(-ENOMEM);
+       }
+diff --git a/drivers/infiniband/hw/cxgb4/device.c 
b/drivers/infiniband/hw/cxgb4/device.c
+index b99dc9e0ffb2..b85a1a983e07 100644
+--- a/drivers/infiniband/hw/cxgb4/device.c
++++ b/drivers/infiniband/hw/cxgb4/device.c
+@@ -848,9 +848,17 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev)
+               }
+       }
+ 
++      rdev->free_workq = create_singlethread_workqueue("iw_cxgb4_free");
++      if (!rdev->free_workq) {
++              err = -ENOMEM;
++              goto err_free_status_page;
++      }
++
+       rdev->status_page->db_off = 0;
+ 
+       return 0;
++err_free_status_page:
++      free_page((unsigned long)rdev->status_page);
+ destroy_ocqp_pool:
+       c4iw_ocqp_pool_destroy(rdev);
+ destroy_rqtpool:
+@@ -864,6 +872,7 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev)
+ 
+ static void c4iw_rdev_close(struct c4iw_rdev *rdev)
+ {
++      destroy_workqueue(rdev->free_workq);
+       kfree(rdev->wr_log);
+       free_page((unsigned long)rdev->status_page);
+       c4iw_pblpool_destroy(rdev);
+diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h 
b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+index 4788e1a46fde..7d540667dad2 100644
+--- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
++++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+@@ -45,6 +45,7 @@
+ #include <linux/kref.h>
+ #include <linux/timer.h>
+ #include <linux/io.h>
++#include <linux/workqueue.h>
+ 
+ #include <asm/byteorder.h>
+ 
+@@ -107,6 +108,7 @@ struct c4iw_dev_ucontext {
+       struct list_head qpids;
+       struct list_head cqids;
+       struct mutex lock;
++      struct kref kref;
+ };
+ 
+ enum c4iw_rdev_flags {
+@@ -183,6 +185,7 @@ struct c4iw_rdev {
+       atomic_t wr_log_idx;
+       struct wr_log_entry *wr_log;
+       int wr_log_size;
++      struct workqueue_struct *free_workq;
+ };
+ 
+ static inline int c4iw_fatal_error(struct c4iw_rdev *rdev)
+@@ -482,6 +485,8 @@ struct c4iw_qp {
+       int sq_sig_all;
+       struct completion rq_drained;
+       struct completion sq_drained;
++      struct work_struct free_work;
++      struct c4iw_ucontext *ucontext;
+ };
+ 
+ static inline struct c4iw_qp *to_c4iw_qp(struct ib_qp *ibqp)
+@@ -495,6 +500,7 @@ struct c4iw_ucontext {
+       u32 key;
+       spinlock_t mmap_lock;
+       struct list_head mmaps;
++      struct kref kref;
+ };
+ 
+ static inline struct c4iw_ucontext *to_c4iw_ucontext(struct ib_ucontext *c)
+@@ -502,6 +508,18 @@ static inline struct c4iw_ucontext 
*to_c4iw_ucontext(struct ib_ucontext *c)
+       return container_of(c, struct c4iw_ucontext, ibucontext);
+ }
+ 
++void _c4iw_free_ucontext(struct kref *kref);
++
++static inline void c4iw_put_ucontext(struct c4iw_ucontext *ucontext)
++{
++      kref_put(&ucontext->kref, _c4iw_free_ucontext);
++}
++
++static inline void c4iw_get_ucontext(struct c4iw_ucontext *ucontext)
++{
++      kref_get(&ucontext->kref);
++}
++
+ struct c4iw_mm_entry {
+       struct list_head entry;
+       u64 addr;
+diff --git a/drivers/infiniband/hw/cxgb4/provider.c 
b/drivers/infiniband/hw/cxgb4/provider.c
+index 645e606a17c5..8278ba06f995 100644
+--- a/drivers/infiniband/hw/cxgb4/provider.c
++++ b/drivers/infiniband/hw/cxgb4/provider.c
+@@ -91,17 +91,28 @@ static int c4iw_process_mad(struct ib_device *ibdev, int 
mad_flags,
+       return -ENOSYS;
+ }
+ 
+-static int c4iw_dealloc_ucontext(struct ib_ucontext *context)
++void _c4iw_free_ucontext(struct kref *kref)
+ {
+-      struct c4iw_dev *rhp = to_c4iw_dev(context->device);
+-      struct c4iw_ucontext *ucontext = to_c4iw_ucontext(context);
++      struct c4iw_ucontext *ucontext;
++      struct c4iw_dev *rhp;
+       struct c4iw_mm_entry *mm, *tmp;
+ 
+-      PDBG("%s context %p\n", __func__, context);
++      ucontext = container_of(kref, struct c4iw_ucontext, kref);
++      rhp = to_c4iw_dev(ucontext->ibucontext.device);
++
++      PDBG("%s ucontext %p\n", __func__, ucontext);
+       list_for_each_entry_safe(mm, tmp, &ucontext->mmaps, entry)
+               kfree(mm);
+       c4iw_release_dev_ucontext(&rhp->rdev, &ucontext->uctx);
+       kfree(ucontext);
++}
++
++static int c4iw_dealloc_ucontext(struct ib_ucontext *context)
++{
++      struct c4iw_ucontext *ucontext = to_c4iw_ucontext(context);
++
++      PDBG("%s context %p\n", __func__, context);
++      c4iw_put_ucontext(ucontext);
+       return 0;
+ }
+ 
+@@ -125,6 +136,7 @@ static struct ib_ucontext *c4iw_alloc_ucontext(struct 
ib_device *ibdev,
+       c4iw_init_dev_ucontext(&rhp->rdev, &context->uctx);
+       INIT_LIST_HEAD(&context->mmaps);
+       spin_lock_init(&context->mmap_lock);
++      kref_init(&context->kref);
+ 
+       if (udata->outlen < sizeof(uresp) - sizeof(uresp.reserved)) {
+               if (!warned++)
+diff --git a/drivers/infiniband/hw/cxgb4/qp.c 
b/drivers/infiniband/hw/cxgb4/qp.c
+index b7ac97b27c88..bb0fde6e2047 100644
+--- a/drivers/infiniband/hw/cxgb4/qp.c
++++ b/drivers/infiniband/hw/cxgb4/qp.c
+@@ -714,13 +714,32 @@ static int build_inv_stag(union t4_wr *wqe, struct 
ib_send_wr *wr, u8 *len16)
+       return 0;
+ }
+ 
+-static void _free_qp(struct kref *kref)
++static void free_qp_work(struct work_struct *work)
++{
++      struct c4iw_ucontext *ucontext;
++      struct c4iw_qp *qhp;
++      struct c4iw_dev *rhp;
++
++      qhp = container_of(work, struct c4iw_qp, free_work);
++      ucontext = qhp->ucontext;
++      rhp = qhp->rhp;
++
++      PDBG("%s qhp %p ucontext %p\n", __func__, qhp, ucontext);
++      destroy_qp(&rhp->rdev, &qhp->wq,
++                 ucontext ? &ucontext->uctx : &rhp->rdev.uctx);
++
++      if (ucontext)
++              c4iw_put_ucontext(ucontext);
++      kfree(qhp);
++}
++
++static void queue_qp_free(struct kref *kref)
+ {
+       struct c4iw_qp *qhp;
+ 
+       qhp = container_of(kref, struct c4iw_qp, kref);
+       PDBG("%s qhp %p\n", __func__, qhp);
+-      kfree(qhp);
++      queue_work(qhp->rhp->rdev.free_workq, &qhp->free_work);
+ }
+ 
+ void c4iw_qp_add_ref(struct ib_qp *qp)
+@@ -732,7 +751,7 @@ void c4iw_qp_add_ref(struct ib_qp *qp)
+ void c4iw_qp_rem_ref(struct ib_qp *qp)
+ {
+       PDBG("%s ib_qp %p\n", __func__, qp);
+-      kref_put(&to_c4iw_qp(qp)->kref, _free_qp);
++      kref_put(&to_c4iw_qp(qp)->kref, queue_qp_free);
+ }
+ 
+ static void add_to_fc_list(struct list_head *head, struct list_head *entry)
+@@ -1642,7 +1661,6 @@ int c4iw_destroy_qp(struct ib_qp *ib_qp)
+       struct c4iw_dev *rhp;
+       struct c4iw_qp *qhp;
+       struct c4iw_qp_attributes attrs;
+-      struct c4iw_ucontext *ucontext;
+ 
+       qhp = to_c4iw_qp(ib_qp);
+       rhp = qhp->rhp;
+@@ -1662,11 +1680,6 @@ int c4iw_destroy_qp(struct ib_qp *ib_qp)
+       spin_unlock_irq(&rhp->lock);
+       free_ird(rhp, qhp->attr.max_ird);
+ 
+-      ucontext = ib_qp->uobject ?
+-                 to_c4iw_ucontext(ib_qp->uobject->context) : NULL;
+-      destroy_qp(&rhp->rdev, &qhp->wq,
+-                 ucontext ? &ucontext->uctx : &rhp->rdev.uctx);
+-
+       c4iw_qp_rem_ref(ib_qp);
+ 
+       PDBG("%s ib_qp %p qpid 0x%0x\n", __func__, ib_qp, qhp->wq.sq.qid);
+@@ -1767,6 +1780,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct 
ib_qp_init_attr *attrs,
+       mutex_init(&qhp->mutex);
+       init_waitqueue_head(&qhp->wait);
+       kref_init(&qhp->kref);
++      INIT_WORK(&qhp->free_work, free_qp_work);
+ 
+       ret = insert_handle(rhp, &rhp->qpidr, qhp, qhp->wq.sq.qid);
+       if (ret)
+@@ -1853,6 +1867,9 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct 
ib_qp_init_attr *attrs,
+                       ma_sync_key_mm->len = PAGE_SIZE;
+                       insert_mmap(ucontext, ma_sync_key_mm);
+               }
++
++              c4iw_get_ucontext(ucontext);
++              qhp->ucontext = ucontext;
+       }
+       qhp->ibqp.qp_num = qhp->wq.sq.qid;
+       init_timer(&(qhp->timer));
+diff --git a/drivers/infiniband/sw/rxe/rxe_net.c 
b/drivers/infiniband/sw/rxe/rxe_net.c
+index ffff5a54cb34..f4f3942ebbd1 100644
+--- a/drivers/infiniband/sw/rxe/rxe_net.c
++++ b/drivers/infiniband/sw/rxe/rxe_net.c
+@@ -554,7 +554,7 @@ struct rxe_dev *rxe_net_add(struct net_device *ndev)
+       }
+ 
+       spin_lock_bh(&dev_list_lock);
+-      list_add_tail(&rxe_dev_list, &rxe->list);
++      list_add_tail(&rxe->list, &rxe_dev_list);
+       spin_unlock_bh(&dev_list_lock);
+       return rxe;
+ }
+diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c 
b/drivers/infiniband/sw/rxe/rxe_qp.c
+index 486d576e55bc..44b2108253bd 100644
+--- a/drivers/infiniband/sw/rxe/rxe_qp.c
++++ b/drivers/infiniband/sw/rxe/rxe_qp.c
+@@ -813,8 +813,7 @@ void rxe_qp_destroy(struct rxe_qp *qp)
+       del_timer_sync(&qp->rnr_nak_timer);
+ 
+       rxe_cleanup_task(&qp->req.task);
+-      if (qp_type(qp) == IB_QPT_RC)
+-              rxe_cleanup_task(&qp->comp.task);
++      rxe_cleanup_task(&qp->comp.task);
+ 
+       /* flush out any receive wr's or pending requests */
+       __rxe_do_task(&qp->req.task);
+diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c 
b/drivers/infiniband/ulp/iser/iscsi_iser.c
+index 64b3d11dcf1e..140f3f354cf3 100644
+--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
++++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
+@@ -651,13 +651,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
+                                                  SHOST_DIX_GUARD_CRC);
+               }
+ 
+-              /*
+-               * Limit the sg_tablesize and max_sectors based on the device
+-               * max fastreg page list length.
+-               */
+-              shost->sg_tablesize = min_t(unsigned short, shost->sg_tablesize,
+-                      
ib_conn->device->ib_device->attrs.max_fast_reg_page_list_len);
+-
+               if (iscsi_host_add(shost,
+                                  ib_conn->device->ib_device->dma_device)) {
+                       mutex_unlock(&iser_conn->state_mutex);
+diff --git a/drivers/infiniband/ulp/srp/ib_srp.c 
b/drivers/infiniband/ulp/srp/ib_srp.c
+index d980fb458ad4..e7dcf14a76e2 100644
+--- a/drivers/infiniband/ulp/srp/ib_srp.c
++++ b/drivers/infiniband/ulp/srp/ib_srp.c
+@@ -366,6 +366,7 @@ static struct srp_fr_pool *srp_create_fr_pool(struct 
ib_device *device,
+       struct srp_fr_desc *d;
+       struct ib_mr *mr;
+       int i, ret = -EINVAL;
++      enum ib_mr_type mr_type;
+ 
+       if (pool_size <= 0)
+               goto err;
+@@ -379,9 +380,13 @@ static struct srp_fr_pool *srp_create_fr_pool(struct 
ib_device *device,
+       spin_lock_init(&pool->lock);
+       INIT_LIST_HEAD(&pool->free_list);
+ 
++      if (device->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG)
++              mr_type = IB_MR_TYPE_SG_GAPS;
++      else
++              mr_type = IB_MR_TYPE_MEM_REG;
++
+       for (i = 0, d = &pool->desc[0]; i < pool->size; i++, d++) {
+-              mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG,
+-                               max_page_list_len);
++              mr = ib_alloc_mr(pd, mr_type, max_page_list_len);
+               if (IS_ERR(mr)) {
+                       ret = PTR_ERR(mr);
+                       goto destroy_pool;
+@@ -3678,6 +3683,12 @@ static int __init srp_init_module(void)
+               indirect_sg_entries = cmd_sg_entries;
+       }
+ 
++      if (indirect_sg_entries > SG_MAX_SEGMENTS) {
++              pr_warn("Clamping indirect_sg_entries to %u\n",
++                      SG_MAX_SEGMENTS);
++              indirect_sg_entries = SG_MAX_SEGMENTS;
++      }
++
+       srp_remove_wq = create_workqueue("srp_remove");
+       if (!srp_remove_wq) {
+               ret = -ENOMEM;
+diff --git a/drivers/isdn/hardware/eicon/message.c 
b/drivers/isdn/hardware/eicon/message.c
+index 1a1d99704fe6..296f1411fe84 100644
+--- a/drivers/isdn/hardware/eicon/message.c
++++ b/drivers/isdn/hardware/eicon/message.c
+@@ -11297,7 +11297,8 @@ static void mixer_notify_update(PLCI *plci, byte 
others)
+                               ((CAPI_MSG *) msg)->header.ncci = 0;
+                               ((CAPI_MSG *) msg)->info.facility_req.Selector 
= SELECTOR_LINE_INTERCONNECT;
+                               ((CAPI_MSG *) 
msg)->info.facility_req.structs[0] = 3;
+-                              PUT_WORD(&(((CAPI_MSG *) 
msg)->info.facility_req.structs[1]), LI_REQ_SILENT_UPDATE);
++                              ((CAPI_MSG *) 
msg)->info.facility_req.structs[1] = LI_REQ_SILENT_UPDATE & 0xff;
++                              ((CAPI_MSG *) 
msg)->info.facility_req.structs[2] = LI_REQ_SILENT_UPDATE >> 8;
+                               ((CAPI_MSG *) 
msg)->info.facility_req.structs[3] = 0;
+                               w = api_put(notify_plci->appl, (CAPI_MSG *) 
msg);
+                               if (w != _QUEUE_FULL)
+diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
+index 2669b4bad910..5a27bffa02fb 100644
+--- a/drivers/media/i2c/Kconfig
++++ b/drivers/media/i2c/Kconfig
+@@ -655,6 +655,7 @@ config VIDEO_S5K6A3
+ config VIDEO_S5K4ECGX
+         tristate "Samsung S5K4ECGX sensor support"
+         depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
++      select CRC32
+         ---help---
+           This is a V4L2 sensor-level driver for Samsung S5K4ECGX 5M
+           camera sensor with an embedded SoC image signal processor.
+diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
+index 7268e706e216..59aa4dafb60b 100644
+--- a/drivers/media/i2c/tvp5150.c
++++ b/drivers/media/i2c/tvp5150.c
+@@ -288,8 +288,12 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
+       tvp5150_write(sd, TVP5150_OP_MODE_CTL, opmode);
+       tvp5150_write(sd, TVP5150_VD_IN_SRC_SEL_1, input);
+ 
+-      /* Svideo should enable YCrCb output and disable GPCL output
+-       * For Composite and TV, it should be the reverse
++      /*
++       * Setup the FID/GLCO/VLK/HVLK and INTREQ/GPCL/VBLK output signals. For
++       * S-Video we output the vertical lock (VLK) signal on FID/GLCO/VLK/HVLK
++       * and set INTREQ/GPCL/VBLK to logic 0. For composite we output the
++       * field indicator (FID) signal on FID/GLCO/VLK/HVLK and set
++       * INTREQ/GPCL/VBLK to logic 1.
+        */
+       val = tvp5150_read(sd, TVP5150_MISC_CTL);
+       if (val < 0) {
+@@ -298,9 +302,9 @@ static inline void tvp5150_selmux(struct v4l2_subdev *sd)
+       }
+ 
+       if (decoder->input == TVP5150_SVIDEO)
+-              val = (val & ~0x40) | 0x10;
++              val = (val & ~TVP5150_MISC_CTL_GPCL) | TVP5150_MISC_CTL_HVLK;
+       else
+-              val = (val & ~0x10) | 0x40;
++              val = (val & ~TVP5150_MISC_CTL_HVLK) | TVP5150_MISC_CTL_GPCL;
+       tvp5150_write(sd, TVP5150_MISC_CTL, val);
+ };
+ 
+@@ -452,7 +456,12 @@ static const struct i2c_reg_value tvp5150_init_enable[] = 
{
+       },{     /* Automatic offset and AGC enabled */
+               TVP5150_ANAL_CHL_CTL, 0x15
+       },{     /* Activate YCrCb output 0x9 or 0xd ? */
+-              TVP5150_MISC_CTL, 0x6f
++              TVP5150_MISC_CTL, TVP5150_MISC_CTL_GPCL |
++                                TVP5150_MISC_CTL_INTREQ_OE |
++                                TVP5150_MISC_CTL_YCBCR_OE |
++                                TVP5150_MISC_CTL_SYNC_OE |
++                                TVP5150_MISC_CTL_VBLANK |
++                                TVP5150_MISC_CTL_CLOCK_OE,
+       },{     /* Activates video std autodetection for all standards */
+               TVP5150_AUTOSW_MSK, 0x0
+       },{     /* Default format: 0x47. For 4:2:2: 0x40 */
+@@ -858,8 +867,6 @@ static int tvp5150_fill_fmt(struct v4l2_subdev *sd,
+ 
+       f = &format->format;
+ 
+-      tvp5150_reset(sd, 0);
+-
+       f->width = decoder->rect.width;
+       f->height = decoder->rect.height / 2;
+ 
+@@ -1048,21 +1055,27 @@ static const struct media_entity_operations 
tvp5150_sd_media_ops = {
+ static int tvp5150_s_stream(struct v4l2_subdev *sd, int enable)
+ {
+       struct tvp5150 *decoder = to_tvp5150(sd);
+-      /* Output format: 8-bit ITU-R BT.656 with embedded syncs */
+-      int val = 0x09;
+-
+-      /* Output format: 8-bit 4:2:2 YUV with discrete sync */
+-      if (decoder->mbus_type == V4L2_MBUS_PARALLEL)
+-              val = 0x0d;
++      int val;
+ 
+-      /* Initializes TVP5150 to its default values */
+-      /* # set PCLK (27MHz) */
+-      tvp5150_write(sd, TVP5150_CONF_SHARED_PIN, 0x00);
++      /* Enable or disable the video output signals. */
++      val = tvp5150_read(sd, TVP5150_MISC_CTL);
++      if (val < 0)
++              return val;
++
++      val &= ~(TVP5150_MISC_CTL_YCBCR_OE | TVP5150_MISC_CTL_SYNC_OE |
++               TVP5150_MISC_CTL_CLOCK_OE);
++
++      if (enable) {
++              /*
++               * Enable the YCbCr and clock outputs. In discrete sync mode
++               * (non-BT.656) additionally enable the the sync outputs.
++               */
++              val |= TVP5150_MISC_CTL_YCBCR_OE | TVP5150_MISC_CTL_CLOCK_OE;
++              if (decoder->mbus_type == V4L2_MBUS_PARALLEL)
++                      val |= TVP5150_MISC_CTL_SYNC_OE;
++      }
+ 
+-      if (enable)
+-              tvp5150_write(sd, TVP5150_MISC_CTL, val);
+-      else
+-              tvp5150_write(sd, TVP5150_MISC_CTL, 0x00);
++      tvp5150_write(sd, TVP5150_MISC_CTL, val);
+ 
+       return 0;
+ }
+@@ -1521,7 +1534,6 @@ static int tvp5150_probe(struct i2c_client *c,
+               res = core->hdl.error;
+               goto err;
+       }
+-      v4l2_ctrl_handler_setup(&core->hdl);
+ 
+       /* Default is no cropping */
+       core->rect.top = 0;
+@@ -1532,6 +1544,8 @@ static int tvp5150_probe(struct i2c_client *c,
+       core->rect.left = 0;
+       core->rect.width = TVP5150_H_MAX;
+ 
++      tvp5150_reset(sd, 0);   /* Calls v4l2_ctrl_handler_setup() */
++
+       res = v4l2_async_register_subdev(sd);
+       if (res < 0)
+               goto err;
+diff --git a/drivers/media/i2c/tvp5150_reg.h b/drivers/media/i2c/tvp5150_reg.h
+index 25a994944918..30a48c28d05a 100644
+--- a/drivers/media/i2c/tvp5150_reg.h
++++ b/drivers/media/i2c/tvp5150_reg.h
+@@ -9,6 +9,15 @@
+ #define TVP5150_ANAL_CHL_CTL         0x01 /* Analog channel controls */
+ #define TVP5150_OP_MODE_CTL          0x02 /* Operation mode controls */
+ #define TVP5150_MISC_CTL             0x03 /* Miscellaneous controls */
++#define TVP5150_MISC_CTL_VBLK_GPCL    BIT(7)
++#define TVP5150_MISC_CTL_GPCL         BIT(6)
++#define TVP5150_MISC_CTL_INTREQ_OE    BIT(5)
++#define TVP5150_MISC_CTL_HVLK         BIT(4)
++#define TVP5150_MISC_CTL_YCBCR_OE     BIT(3)
++#define TVP5150_MISC_CTL_SYNC_OE      BIT(2)
++#define TVP5150_MISC_CTL_VBLANK               BIT(1)
++#define TVP5150_MISC_CTL_CLOCK_OE     BIT(0)
++
+ #define TVP5150_AUTOSW_MSK           0x04 /* Autoswitch mask: TVP5150A / 
TVP5150AM */
+ 
+ /* Reserved 05h */
+diff --git a/drivers/media/usb/dvb-usb/pctv452e.c 
b/drivers/media/usb/dvb-usb/pctv452e.c
+index 07fa08be9e99..d54ebe7e0215 100644
+--- a/drivers/media/usb/dvb-usb/pctv452e.c
++++ b/drivers/media/usb/dvb-usb/pctv452e.c
+@@ -97,14 +97,13 @@ struct pctv452e_state {
+       u8 c;      /* transaction counter, wraps around...  */
+       u8 initialized; /* set to 1 if 0x15 has been sent */
+       u16 last_rc_key;
+-
+-      unsigned char data[80];
+ };
+ 
+ static int tt3650_ci_msg(struct dvb_usb_device *d, u8 cmd, u8 *data,
+                        unsigned int write_len, unsigned int read_len)
+ {
+       struct pctv452e_state *state = (struct pctv452e_state *)d->priv;
++      u8 *buf;
+       u8 id;
+       unsigned int rlen;
+       int ret;
+@@ -114,36 +113,39 @@ static int tt3650_ci_msg(struct dvb_usb_device *d, u8 
cmd, u8 *data,
+               return -EIO;
+       }
+ 
+-      mutex_lock(&state->ca_mutex);
++      buf = kmalloc(64, GFP_KERNEL);
++      if (!buf)
++              return -ENOMEM;
++
+       id = state->c++;
+ 
+-      state->data[0] = SYNC_BYTE_OUT;
+-      state->data[1] = id;
+-      state->data[2] = cmd;
+-      state->data[3] = write_len;
++      buf[0] = SYNC_BYTE_OUT;
++      buf[1] = id;
++      buf[2] = cmd;
++      buf[3] = write_len;
+ 
+-      memcpy(state->data + 4, data, write_len);
++      memcpy(buf + 4, data, write_len);
+ 
+       rlen = (read_len > 0) ? 64 : 0;
+-      ret = dvb_usb_generic_rw(d, state->data, 4 + write_len,
+-                                state->data, rlen, /* delay_ms */ 0);
++      ret = dvb_usb_generic_rw(d, buf, 4 + write_len,
++                                buf, rlen, /* delay_ms */ 0);
+       if (0 != ret)
+               goto failed;
+ 
+       ret = -EIO;
+-      if (SYNC_BYTE_IN != state->data[0] || id != state->data[1])
++      if (SYNC_BYTE_IN != buf[0] || id != buf[1])
+               goto failed;
+ 
+-      memcpy(data, state->data + 4, read_len);
++      memcpy(data, buf + 4, read_len);
+ 
+-      mutex_unlock(&state->ca_mutex);
++      kfree(buf);
+       return 0;
+ 
+ failed:
+       err("CI error %d; %02X %02X %02X -> %*ph.",
+-           ret, SYNC_BYTE_OUT, id, cmd, 3, state->data);
++           ret, SYNC_BYTE_OUT, id, cmd, 3, buf);
+ 
+-      mutex_unlock(&state->ca_mutex);
++      kfree(buf);
+       return ret;
+ }
+ 
+@@ -410,53 +412,57 @@ static int pctv452e_i2c_msg(struct dvb_usb_device *d, u8 
addr,
+                               u8 *rcv_buf, u8 rcv_len)
+ {
+       struct pctv452e_state *state = (struct pctv452e_state *)d->priv;
++      u8 *buf;
+       u8 id;
+       int ret;
+ 
+-      mutex_lock(&state->ca_mutex);
++      buf = kmalloc(64, GFP_KERNEL);
++      if (!buf)
++              return -ENOMEM;
++
+       id = state->c++;
+ 
+       ret = -EINVAL;
+       if (snd_len > 64 - 7 || rcv_len > 64 - 7)
+               goto failed;
+ 
+-      state->data[0] = SYNC_BYTE_OUT;
+-      state->data[1] = id;
+-      state->data[2] = PCTV_CMD_I2C;
+-      state->data[3] = snd_len + 3;
+-      state->data[4] = addr << 1;
+-      state->data[5] = snd_len;
+-      state->data[6] = rcv_len;
++      buf[0] = SYNC_BYTE_OUT;
++      buf[1] = id;
++      buf[2] = PCTV_CMD_I2C;
++      buf[3] = snd_len + 3;
++      buf[4] = addr << 1;
++      buf[5] = snd_len;
++      buf[6] = rcv_len;
+ 
+-      memcpy(state->data + 7, snd_buf, snd_len);
++      memcpy(buf + 7, snd_buf, snd_len);
+ 
+-      ret = dvb_usb_generic_rw(d, state->data, 7 + snd_len,
+-                                state->data, /* rcv_len */ 64,
++      ret = dvb_usb_generic_rw(d, buf, 7 + snd_len,
++                                buf, /* rcv_len */ 64,
+                                 /* delay_ms */ 0);
+       if (ret < 0)
+               goto failed;
+ 
+       /* TT USB protocol error. */
+       ret = -EIO;
+-      if (SYNC_BYTE_IN != state->data[0] || id != state->data[1])
++      if (SYNC_BYTE_IN != buf[0] || id != buf[1])
+               goto failed;
+ 
+       /* I2C device didn't respond as expected. */
+       ret = -EREMOTEIO;
+-      if (state->data[5] < snd_len || state->data[6] < rcv_len)
++      if (buf[5] < snd_len || buf[6] < rcv_len)
+               goto failed;
+ 
+-      memcpy(rcv_buf, state->data + 7, rcv_len);
+-      mutex_unlock(&state->ca_mutex);
++      memcpy(rcv_buf, buf + 7, rcv_len);
+ 
++      kfree(buf);
+       return rcv_len;
+ 
+ failed:
+       err("I2C error %d; %02X %02X  %02X %02X %02X -> %*ph",
+            ret, SYNC_BYTE_OUT, id, addr << 1, snd_len, rcv_len,
+-           7, state->data);
++           7, buf);
+ 
+-      mutex_unlock(&state->ca_mutex);
++      kfree(buf);
+       return ret;
+ }
+ 
+@@ -505,7 +511,7 @@ static u32 pctv452e_i2c_func(struct i2c_adapter *adapter)
+ static int pctv452e_power_ctrl(struct dvb_usb_device *d, int i)
+ {
+       struct pctv452e_state *state = (struct pctv452e_state *)d->priv;
+-      u8 *rx;
++      u8 *b0, *rx;
+       int ret;
+ 
+       info("%s: %d\n", __func__, i);
+@@ -516,11 +522,12 @@ static int pctv452e_power_ctrl(struct dvb_usb_device *d, 
int i)
+       if (state->initialized)
+               return 0;
+ 
+-      rx = kmalloc(PCTV_ANSWER_LEN, GFP_KERNEL);
+-      if (!rx)
++      b0 = kmalloc(5 + PCTV_ANSWER_LEN, GFP_KERNEL);
++      if (!b0)
+               return -ENOMEM;
+ 
+-      mutex_lock(&state->ca_mutex);
++      rx = b0 + 5;
++
+       /* hmm where shoud this should go? */
+       ret = usb_set_interface(d->udev, 0, ISOC_INTERFACE_ALTERNATIVE);
+       if (ret != 0)
+@@ -528,66 +535,70 @@ static int pctv452e_power_ctrl(struct dvb_usb_device *d, 
int i)
+                       __func__, ret);
+ 
+       /* this is a one-time initialization, dont know where to put */
+-      state->data[0] = 0xaa;
+-      state->data[1] = state->c++;
+-      state->data[2] = PCTV_CMD_RESET;
+-      state->data[3] = 1;
+-      state->data[4] = 0;
++      b0[0] = 0xaa;
++      b0[1] = state->c++;
++      b0[2] = PCTV_CMD_RESET;
++      b0[3] = 1;
++      b0[4] = 0;
+       /* reset board */
+-      ret = dvb_usb_generic_rw(d, state->data, 5, rx, PCTV_ANSWER_LEN, 0);
++      ret = dvb_usb_generic_rw(d, b0, 5, rx, PCTV_ANSWER_LEN, 0);
+       if (ret)
+               goto ret;
+ 
+-      state->data[1] = state->c++;
+-      state->data[4] = 1;
++      b0[1] = state->c++;
++      b0[4] = 1;
+       /* reset board (again?) */
+-      ret = dvb_usb_generic_rw(d, state->data, 5, rx, PCTV_ANSWER_LEN, 0);
++      ret = dvb_usb_generic_rw(d, b0, 5, rx, PCTV_ANSWER_LEN, 0);
+       if (ret)
+               goto ret;
+ 
+       state->initialized = 1;
+ 
+ ret:
+-      mutex_unlock(&state->ca_mutex);
+-      kfree(rx);
++      kfree(b0);
+       return ret;
+ }
+ 
+ static int pctv452e_rc_query(struct dvb_usb_device *d)
+ {
+       struct pctv452e_state *state = (struct pctv452e_state *)d->priv;
++      u8 *b, *rx;
+       int ret, i;
+       u8 id;
+ 
+-      mutex_lock(&state->ca_mutex);
++      b = kmalloc(CMD_BUFFER_SIZE + PCTV_ANSWER_LEN, GFP_KERNEL);
++      if (!b)
++              return -ENOMEM;
++
++      rx = b + CMD_BUFFER_SIZE;
++
+       id = state->c++;
+ 
+       /* prepare command header  */
+-      state->data[0] = SYNC_BYTE_OUT;
+-      state->data[1] = id;
+-      state->data[2] = PCTV_CMD_IR;
+-      state->data[3] = 0;
++      b[0] = SYNC_BYTE_OUT;
++      b[1] = id;
++      b[2] = PCTV_CMD_IR;
++      b[3] = 0;
+ 
+       /* send ir request */
+-      ret = dvb_usb_generic_rw(d, state->data, 4,
+-                               state->data, PCTV_ANSWER_LEN, 0);
++      ret = dvb_usb_generic_rw(d, b, 4, rx, PCTV_ANSWER_LEN, 0);
+       if (ret != 0)
+               goto ret;
+ 
+       if (debug > 3) {
+-              info("%s: read: %2d: %*ph: ", __func__, ret, 3, state->data);
+-              for (i = 0; (i < state->data[3]) && ((i + 3) < 
PCTV_ANSWER_LEN); i++)
+-                      info(" %02x", state->data[i + 3]);
++              info("%s: read: %2d: %*ph: ", __func__, ret, 3, rx);
++              for (i = 0; (i < rx[3]) && ((i+3) < PCTV_ANSWER_LEN); i++)
++                      info(" %02x", rx[i+3]);
+ 
+               info("\n");
+       }
+ 
+-      if ((state->data[3] == 9) &&  (state->data[12] & 0x01)) {
++      if ((rx[3] == 9) &&  (rx[12] & 0x01)) {
+               /* got a "press" event */
+-              state->last_rc_key = RC_SCANCODE_RC5(state->data[7], 
state->data[6]);
++              state->last_rc_key = RC_SCANCODE_RC5(rx[7], rx[6]);
+               if (debug > 2)
+                       info("%s: cmd=0x%02x sys=0x%02x\n",
+-                              __func__, state->data[6], state->data[7]);
++                              __func__, rx[6], rx[7]);
+ 
+               rc_keydown(d->rc_dev, RC_TYPE_RC5, state->last_rc_key, 0);
+       } else if (state->last_rc_key) {
+@@ -595,7 +606,7 @@ static int pctv452e_rc_query(struct dvb_usb_device *d)
+               state->last_rc_key = 0;
+       }
+ ret:
+-      mutex_unlock(&state->ca_mutex);
++      kfree(b);
+       return ret;
+ }
+ 
+diff --git a/drivers/net/can/c_can/c_can_pci.c 
b/drivers/net/can/c_can/c_can_pci.c
+index 7be393c96b1a..cf7c18947189 100644
+--- a/drivers/net/can/c_can/c_can_pci.c
++++ b/drivers/net/can/c_can/c_can_pci.c
+@@ -161,6 +161,7 @@ static int c_can_pci_probe(struct pci_dev *pdev,
+ 
+       dev->irq = pdev->irq;
+       priv->base = addr;
++      priv->device = &pdev->dev;
+ 
+       if (!c_can_pci_data->freq) {
+               dev_err(&pdev->dev, "no clock frequency defined\n");
+diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c
+index 680d1ff07a55..6749b1829469 100644
+--- a/drivers/net/can/ti_hecc.c
++++ b/drivers/net/can/ti_hecc.c
+@@ -948,7 +948,12 @@ static int ti_hecc_probe(struct platform_device *pdev)
+       netif_napi_add(ndev, &priv->napi, ti_hecc_rx_poll,
+               HECC_DEF_NAPI_WEIGHT);
+ 
+-      clk_enable(priv->clk);
++      err = clk_prepare_enable(priv->clk);
++      if (err) {
++              dev_err(&pdev->dev, "clk_prepare_enable() failed\n");
++              goto probe_exit_clk;
++      }
++
+       err = register_candev(ndev);
+       if (err) {
+               dev_err(&pdev->dev, "register_candev() failed\n");
+@@ -981,7 +986,7 @@ static int ti_hecc_remove(struct platform_device *pdev)
+       struct ti_hecc_priv *priv = netdev_priv(ndev);
+ 
+       unregister_candev(ndev);
+-      clk_disable(priv->clk);
++      clk_disable_unprepare(priv->clk);
+       clk_put(priv->clk);
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       iounmap(priv->base);
+@@ -1006,7 +1011,7 @@ static int ti_hecc_suspend(struct platform_device *pdev, 
pm_message_t state)
+       hecc_set_bit(priv, HECC_CANMC, HECC_CANMC_PDR);
+       priv->can.state = CAN_STATE_SLEEPING;
+ 
+-      clk_disable(priv->clk);
++      clk_disable_unprepare(priv->clk);
+ 
+       return 0;
+ }
+@@ -1015,8 +1020,11 @@ static int ti_hecc_resume(struct platform_device *pdev)
+ {
+       struct net_device *dev = platform_get_drvdata(pdev);
+       struct ti_hecc_priv *priv = netdev_priv(dev);
++      int err;
+ 
+-      clk_enable(priv->clk);
++      err = clk_prepare_enable(priv->clk);
++      if (err)
++              return err;
+ 
+       hecc_clear_bit(priv, HECC_CANMC, HECC_CANMC_PDR);
+       priv->can.state = CAN_STATE_ERROR_ACTIVE;
+diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c 
b/drivers/pinctrl/intel/pinctrl-baytrail.c
+index 71bbeb9321ba..079015385fd8 100644
+--- a/drivers/pinctrl/intel/pinctrl-baytrail.c
++++ b/drivers/pinctrl/intel/pinctrl-baytrail.c
+@@ -1092,6 +1092,7 @@ static int byt_pin_config_get(struct pinctrl_dev 
*pctl_dev, unsigned int offset,
+       enum pin_config_param param = pinconf_to_config_param(*config);
+       void __iomem *conf_reg = byt_gpio_reg(vg, offset, BYT_CONF0_REG);
+       void __iomem *val_reg = byt_gpio_reg(vg, offset, BYT_VAL_REG);
++      void __iomem *db_reg = byt_gpio_reg(vg, offset, BYT_DEBOUNCE_REG);
+       unsigned long flags;
+       u32 conf, pull, val, debounce;
+       u16 arg = 0;
+@@ -1128,7 +1129,7 @@ static int byt_pin_config_get(struct pinctrl_dev 
*pctl_dev, unsigned int offset,
+                       return -EINVAL;
+ 
+               raw_spin_lock_irqsave(&vg->lock, flags);
+-              debounce = readl(byt_gpio_reg(vg, offset, BYT_DEBOUNCE_REG));
++              debounce = readl(db_reg);
+               raw_spin_unlock_irqrestore(&vg->lock, flags);
+ 
+               switch (debounce & BYT_DEBOUNCE_PULSE_MASK) {
+@@ -1176,6 +1177,7 @@ static int byt_pin_config_set(struct pinctrl_dev 
*pctl_dev,
+       unsigned int param, arg;
+       void __iomem *conf_reg = byt_gpio_reg(vg, offset, BYT_CONF0_REG);
+       void __iomem *val_reg = byt_gpio_reg(vg, offset, BYT_VAL_REG);
++      void __iomem *db_reg = byt_gpio_reg(vg, offset, BYT_DEBOUNCE_REG);
+       unsigned long flags;
+       u32 conf, val, debounce;
+       int i, ret = 0;
+@@ -1238,36 +1240,40 @@ static int byt_pin_config_set(struct pinctrl_dev 
*pctl_dev,
+ 
+                       break;
+               case PIN_CONFIG_INPUT_DEBOUNCE:
+-                      debounce = readl(byt_gpio_reg(vg, offset,
+-                                                    BYT_DEBOUNCE_REG));
+-                      conf &= ~BYT_DEBOUNCE_PULSE_MASK;
++                      debounce = readl(db_reg);
++                      debounce &= ~BYT_DEBOUNCE_PULSE_MASK;
+ 
+                       switch (arg) {
++                      case 0:
++                              conf &= BYT_DEBOUNCE_EN;
++                              break;
+                       case 375:
+-                              conf |= BYT_DEBOUNCE_PULSE_375US;
++                              debounce |= BYT_DEBOUNCE_PULSE_375US;
+                               break;
+                       case 750:
+-                              conf |= BYT_DEBOUNCE_PULSE_750US;
++                              debounce |= BYT_DEBOUNCE_PULSE_750US;
+                               break;
+                       case 1500:
+-                              conf |= BYT_DEBOUNCE_PULSE_1500US;
++                              debounce |= BYT_DEBOUNCE_PULSE_1500US;
+                               break;
+                       case 3000:
+-                              conf |= BYT_DEBOUNCE_PULSE_3MS;
++                              debounce |= BYT_DEBOUNCE_PULSE_3MS;
+                               break;
+                       case 6000:
+-                              conf |= BYT_DEBOUNCE_PULSE_6MS;
++                              debounce |= BYT_DEBOUNCE_PULSE_6MS;
+                               break;
+                       case 12000:
+-                              conf |= BYT_DEBOUNCE_PULSE_12MS;
++                              debounce |= BYT_DEBOUNCE_PULSE_12MS;
+                               break;
+                       case 24000:
+-                              conf |= BYT_DEBOUNCE_PULSE_24MS;
++                              debounce |= BYT_DEBOUNCE_PULSE_24MS;
+                               break;
+                       default:
+                               ret = -EINVAL;
+                       }
+ 
++                      if (!ret)
++                              writel(debounce, db_reg);
+                       break;
+               default:
+                       ret = -ENOTSUPP;
+diff --git a/drivers/pinctrl/intel/pinctrl-broxton.c 
b/drivers/pinctrl/intel/pinctrl-broxton.c
+index 59cb7a6fc5be..901b356b09d7 100644
+--- a/drivers/pinctrl/intel/pinctrl-broxton.c
++++ b/drivers/pinctrl/intel/pinctrl-broxton.c
+@@ -19,7 +19,7 @@
+ 
+ #define BXT_PAD_OWN   0x020
+ #define BXT_HOSTSW_OWN        0x080
+-#define BXT_PADCFGLOCK        0x090
++#define BXT_PADCFGLOCK        0x060
+ #define BXT_GPI_IE    0x110
+ 
+ #define BXT_COMMUNITY(s, e)                           \
+diff --git a/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c 
b/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c
+index aa8bd9794683..96686336e3a3 100644
+--- a/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c
++++ b/drivers/pinctrl/uniphier/pinctrl-uniphier-ld20.c
+@@ -561,7 +561,7 @@ static const int ether_rgmii_muxvals[] = {0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0,
+                                         0, 0, 0, 0};
+ static const unsigned ether_rmii_pins[] = {30, 31, 32, 33, 34, 35, 36, 37, 39,
+                                          41, 42, 45};
+-static const int ether_rmii_muxvals[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
++static const int ether_rmii_muxvals[] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
+ static const unsigned i2c0_pins[] = {63, 64};
+ static const int i2c0_muxvals[] = {0, 0};
+ static const unsigned i2c1_pins[] = {65, 66};
+diff --git a/drivers/platform/x86/intel_mid_powerbtn.c 
b/drivers/platform/x86/intel_mid_powerbtn.c
+index 1fc0de870ff8..361770568ad0 100644
+--- a/drivers/platform/x86/intel_mid_powerbtn.c
++++ b/drivers/platform/x86/intel_mid_powerbtn.c
+@@ -77,7 +77,7 @@ static int mfld_pb_probe(struct platform_device *pdev)
+ 
+       input_set_capability(input, EV_KEY, KEY_POWER);
+ 
+-      error = request_threaded_irq(irq, NULL, mfld_pb_isr, 0,
++      error = request_threaded_irq(irq, NULL, mfld_pb_isr, IRQF_ONESHOT,
+                                    DRIVER_NAME, input);
+       if (error) {
+               dev_err(&pdev->dev, "Unable to request irq %d for mfld power"
+diff --git a/drivers/video/fbdev/core/fbcmap.c 
b/drivers/video/fbdev/core/fbcmap.c
+index f89245b8ba8e..68a113594808 100644
+--- a/drivers/video/fbdev/core/fbcmap.c
++++ b/drivers/video/fbdev/core/fbcmap.c
+@@ -163,17 +163,18 @@ void fb_dealloc_cmap(struct fb_cmap *cmap)
+ 
+ int fb_copy_cmap(const struct fb_cmap *from, struct fb_cmap *to)
+ {
+-      int tooff = 0, fromoff = 0;
+-      int size;
++      unsigned int tooff = 0, fromoff = 0;
++      size_t size;
+ 
+       if (to->start > from->start)
+               fromoff = to->start - from->start;
+       else
+               tooff = from->start - to->start;
+-      size = to->len - tooff;
+-      if (size > (int) (from->len - fromoff))
+-              size = from->len - fromoff;
+-      if (size <= 0)
++      if (fromoff >= from->len || tooff >= to->len)
++              return -EINVAL;
++
++      size = min_t(size_t, to->len - tooff, from->len - fromoff);
++      if (size == 0)
+               return -EINVAL;
+       size *= sizeof(u16);
+ 
+@@ -187,17 +188,18 @@ int fb_copy_cmap(const struct fb_cmap *from, struct 
fb_cmap *to)
+ 
+ int fb_cmap_to_user(const struct fb_cmap *from, struct fb_cmap_user *to)
+ {
+-      int tooff = 0, fromoff = 0;
+-      int size;
++      unsigned int tooff = 0, fromoff = 0;
++      size_t size;
+ 
+       if (to->start > from->start)
+               fromoff = to->start - from->start;
+       else
+               tooff = from->start - to->start;
+-      size = to->len - tooff;
+-      if (size > (int) (from->len - fromoff))
+-              size = from->len - fromoff;
+-      if (size <= 0)
++      if (fromoff >= from->len || tooff >= to->len)
++              return -EINVAL;
++
++      size = min_t(size_t, to->len - tooff, from->len - fromoff);
++      if (size == 0)
+               return -EINVAL;
+       size *= sizeof(u16);
+ 
+diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
+index 48bfea91dbca..50840984fbfa 100644
+--- a/drivers/virtio/virtio_mmio.c
++++ b/drivers/virtio/virtio_mmio.c
+@@ -59,6 +59,7 @@
+ #define pr_fmt(fmt) "virtio-mmio: " fmt
+ 
+ #include <linux/acpi.h>
++#include <linux/dma-mapping.h>
+ #include <linux/highmem.h>
+ #include <linux/interrupt.h>
+ #include <linux/io.h>
+@@ -497,6 +498,7 @@ static int virtio_mmio_probe(struct platform_device *pdev)
+       struct virtio_mmio_device *vm_dev;
+       struct resource *mem;
+       unsigned long magic;
++      int rc;
+ 
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!mem)
+@@ -545,9 +547,25 @@ static int virtio_mmio_probe(struct platform_device *pdev)
+       }
+       vm_dev->vdev.id.vendor = readl(vm_dev->base + VIRTIO_MMIO_VENDOR_ID);
+ 
+-      if (vm_dev->version == 1)
++      if (vm_dev->version == 1) {
+               writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_GUEST_PAGE_SIZE);
+ 
++              rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64));
++              /*
++               * In the legacy case, ensure our coherently-allocated virtio
++               * ring will be at an address expressable as a 32-bit PFN.
++               */
++              if (!rc)
++                      dma_set_coherent_mask(&pdev->dev,
++                                            DMA_BIT_MASK(32 + PAGE_SHIFT));
++      } else {
++              rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
++      }
++      if (rc)
++              rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
++      if (rc)
++              dev_warn(&pdev->dev, "Failed to enable 64-bit or 32-bit DMA.  
Trying to continue, but this might not work.\n");
++
+       platform_set_drvdata(pdev, vm_dev);
+ 
+       return register_virtio_device(&vm_dev->vdev);
+diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
+index 489bfc61cf30..f1360487a594 100644
+--- a/drivers/virtio/virtio_ring.c
++++ b/drivers/virtio/virtio_ring.c
+@@ -159,6 +159,13 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
+       if (xen_domain())
+               return true;
+ 
++      /*
++       * On ARM-based machines, the DMA ops will do the right thing,
++       * so always use them with legacy devices.
++       */
++      if (IS_ENABLED(CONFIG_ARM) || IS_ENABLED(CONFIG_ARM64))
++              return !virtio_has_feature(vdev, VIRTIO_F_VERSION_1);
++
+       return false;
+ }
+ 
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index 8e3a5a266917..be4da91d880f 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -3819,10 +3819,7 @@ static int btrfs_read_locked_inode(struct inode *inode)
+               break;
+       case S_IFDIR:
+               inode->i_fop = &btrfs_dir_file_operations;
+-              if (root == root->fs_info->tree_root)
+-                      inode->i_op = &btrfs_dir_ro_inode_operations;
+-              else
+-                      inode->i_op = &btrfs_dir_inode_operations;
++              inode->i_op = &btrfs_dir_inode_operations;
+               break;
+       case S_IFLNK:
+               inode->i_op = &btrfs_symlink_inode_operations;
+@@ -5682,6 +5679,7 @@ static struct inode *new_simple_dir(struct super_block 
*s,
+ 
+       inode->i_ino = BTRFS_EMPTY_SUBVOL_DIR_OBJECTID;
+       inode->i_op = &btrfs_dir_ro_inode_operations;
++      inode->i_opflags &= ~IOP_XATTR;
+       inode->i_fop = &simple_dir_operations;
+       inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO;
+       inode->i_mtime = current_time(inode);
+@@ -10587,8 +10585,6 @@ static const struct inode_operations 
btrfs_dir_inode_operations = {
+ static const struct inode_operations btrfs_dir_ro_inode_operations = {
+       .lookup         = btrfs_lookup,
+       .permission     = btrfs_permission,
+-      .get_acl        = btrfs_get_acl,
+-      .set_acl        = btrfs_set_acl,
+       .update_time    = btrfs_update_time,
+ };
+ 
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 241da19b7da4..78ff8b63d5f7 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -2678,7 +2678,8 @@ static inline void nfs4_exclusive_attrset(struct 
nfs4_opendata *opendata,
+               sattr->ia_valid |= ATTR_MTIME;
+ 
+       /* Except MODE, it seems harmless of setting twice. */
+-      if ((attrset[1] & FATTR4_WORD1_MODE))
++      if (opendata->o_arg.createmode != NFS4_CREATE_EXCLUSIVE &&
++              attrset[1] & FATTR4_WORD1_MODE)
+               sattr->ia_valid &= ~ATTR_MODE;
+ 
+       if (attrset[2] & FATTR4_WORD2_SECURITY_LABEL)
+@@ -8371,6 +8372,7 @@ nfs4_layoutget_handle_exception(struct rpc_task *task,
+               goto out;
+       }
+ 
++      nfs4_sequence_free_slot(&lgp->res.seq_res);
+       err = nfs4_handle_exception(server, nfs4err, exception);
+       if (!status) {
+               if (exception->retry)
+diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c
+index 45e50ea90769..b669b123287b 100644
+--- a/fs/xfs/xfs_qm.c
++++ b/fs/xfs/xfs_qm.c
+@@ -1177,7 +1177,8 @@ xfs_qm_dqusage_adjust(
+        * the case in all other instances. It's OK that we do this because
+        * quotacheck is done only at mount time.
+        */
+-      error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip);
++      error = xfs_iget(mp, NULL, ino, XFS_IGET_DONTCACHE, XFS_ILOCK_EXCL,
++                       &ip);
+       if (error) {
+               *res = BULKSTAT_RV_NOTHING;
+               return error;
+diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h
+index 01033fadea47..c1784c0b4f35 100644
+--- a/include/linux/memory_hotplug.h
++++ b/include/linux/memory_hotplug.h
+@@ -284,7 +284,7 @@ extern void sparse_remove_one_section(struct zone *zone, 
struct mem_section *ms,
+               unsigned long map_offset);
+ extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map,
+                                         unsigned long pnum);
+-extern int zone_can_shift(unsigned long pfn, unsigned long nr_pages,
+-                        enum zone_type target);
++extern bool zone_can_shift(unsigned long pfn, unsigned long nr_pages,
++                        enum zone_type target, int *zone_shift);
+ 
+ #endif /* __LINUX_MEMORY_HOTPLUG_H */
+diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
+index 0f088f3a2fed..f99c993dd500 100644
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -972,12 +972,16 @@ static __always_inline struct zoneref 
*next_zones_zonelist(struct zoneref *z,
+  * @zonelist - The zonelist to search for a suitable zone
+  * @highest_zoneidx - The zone index of the highest zone to return
+  * @nodes - An optional nodemask to filter the zonelist with
+- * @zone - The first suitable zone found is returned via this parameter
++ * @return - Zoneref pointer for the first suitable zone found (see below)
+  *
+  * This function returns the first zone at or below a given zone index that is
+  * within the allowed nodemask. The zoneref returned is a cursor that can be
+  * used to iterate the zonelist with next_zones_zonelist by advancing it by
+  * one before calling.
++ *
++ * When no eligible zone is found, zoneref->zone is NULL (zoneref itself is
++ * never NULL). This may happen either genuinely, or due to concurrent 
nodemask
++ * update due to cpuset modification.
+  */
+ static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist,
+                                       enum zone_type highest_zoneidx,
+diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h
+index 9094faf0699d..039e76e91896 100644
+--- a/include/linux/nfs4.h
++++ b/include/linux/nfs4.h
+@@ -282,7 +282,7 @@ enum nfsstat4 {
+ 
+ static inline bool seqid_mutating_err(u32 err)
+ {
+-      /* rfc 3530 section 8.1.5: */
++      /* See RFC 7530, section 9.1.7 */
+       switch (err) {
+       case NFS4ERR_STALE_CLIENTID:
+       case NFS4ERR_STALE_STATEID:
+@@ -291,6 +291,7 @@ static inline bool seqid_mutating_err(u32 err)
+       case NFS4ERR_BADXDR:
+       case NFS4ERR_RESOURCE:
+       case NFS4ERR_NOFILEHANDLE:
++      case NFS4ERR_MOVED:
+               return false;
+       };
+       return true;
+diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h
+index 85cc819676e8..333ad11b3dd9 100644
+--- a/include/linux/sunrpc/clnt.h
++++ b/include/linux/sunrpc/clnt.h
+@@ -216,5 +216,6 @@ void rpc_clnt_xprt_switch_put(struct rpc_clnt *);
+ void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *);
+ bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
+                       const struct sockaddr *sap);
++void rpc_cleanup_clids(void);
+ #endif /* __KERNEL__ */
+ #endif /* _LINUX_SUNRPC_CLNT_H */
+diff --git a/include/uapi/rdma/cxgb3-abi.h b/include/uapi/rdma/cxgb3-abi.h
+index 48a19bda071b..d24eee12128f 100644
+--- a/include/uapi/rdma/cxgb3-abi.h
++++ b/include/uapi/rdma/cxgb3-abi.h
+@@ -30,7 +30,7 @@
+  * SOFTWARE.
+  */
+ #ifndef CXGB3_ABI_USER_H
+-#define CXBG3_ABI_USER_H
++#define CXGB3_ABI_USER_H
+ 
+ #include <linux/types.h>
+ 
+diff --git a/kernel/events/core.c b/kernel/events/core.c
+index 02c8421f8c01..e5a8839e7076 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -9503,6 +9503,37 @@ static int perf_event_set_clock(struct perf_event 
*event, clockid_t clk_id)
+       return 0;
+ }
+ 
++/*
++ * Variation on perf_event_ctx_lock_nested(), except we take two context
++ * mutexes.
++ */
++static struct perf_event_context *
++__perf_event_ctx_lock_double(struct perf_event *group_leader,
++                           struct perf_event_context *ctx)
++{
++      struct perf_event_context *gctx;
++
++again:
++      rcu_read_lock();
++      gctx = READ_ONCE(group_leader->ctx);
++      if (!atomic_inc_not_zero(&gctx->refcount)) {
++              rcu_read_unlock();
++              goto again;
++      }
++      rcu_read_unlock();
++
++      mutex_lock_double(&gctx->mutex, &ctx->mutex);
++
++      if (group_leader->ctx != gctx) {
++              mutex_unlock(&ctx->mutex);
++              mutex_unlock(&gctx->mutex);
++              put_ctx(gctx);
++              goto again;
++      }
++
++      return gctx;
++}
++
+ /**
+  * sys_perf_event_open - open a performance event, associate it to a task/cpu
+  *
+@@ -9746,12 +9777,31 @@ SYSCALL_DEFINE5(perf_event_open,
+       }
+ 
+       if (move_group) {
+-              gctx = group_leader->ctx;
+-              mutex_lock_double(&gctx->mutex, &ctx->mutex);
++              gctx = __perf_event_ctx_lock_double(group_leader, ctx);
++
+               if (gctx->task == TASK_TOMBSTONE) {
+                       err = -ESRCH;
+                       goto err_locked;
+               }
++
++              /*
++               * Check if we raced against another sys_perf_event_open() call
++               * moving the software group underneath us.
++               */
++              if (!(group_leader->group_caps & PERF_EV_CAP_SOFTWARE)) {
++                      /*
++                       * If someone moved the group out from under us, check
++                       * if this new event wound up on the same ctx, if so
++                       * its the regular !move_group case, otherwise fail.
++                       */
++                      if (gctx != ctx) {
++                              err = -EINVAL;
++                              goto err_locked;
++                      } else {
++                              perf_event_ctx_unlock(group_leader, gctx);
++                              move_group = 0;
++                      }
++              }
+       } else {
+               mutex_lock(&ctx->mutex);
+       }
+@@ -9853,7 +9903,7 @@ SYSCALL_DEFINE5(perf_event_open,
+       perf_unpin_context(ctx);
+ 
+       if (move_group)
+-              mutex_unlock(&gctx->mutex);
++              perf_event_ctx_unlock(group_leader, gctx);
+       mutex_unlock(&ctx->mutex);
+ 
+       if (task) {
+@@ -9879,7 +9929,7 @@ SYSCALL_DEFINE5(perf_event_open,
+ 
+ err_locked:
+       if (move_group)
+-              mutex_unlock(&gctx->mutex);
++              perf_event_ctx_unlock(group_leader, gctx);
+       mutex_unlock(&ctx->mutex);
+ /* err_file: */
+       fput(event_file);
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 706309f9ed84..c1095cdc0fe2 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -2487,6 +2487,7 @@ static int __do_proc_doulongvec_minmax(void *data, 
struct ctl_table *table, int
+                               break;
+                       if (neg)
+                               continue;
++                      val = convmul * val / convdiv;
+                       if ((min && val < *min) || (max && val > *max))
+                               continue;
+                       *i = val;
+diff --git a/kernel/ucount.c b/kernel/ucount.c
+index 9d20d5dd298a..4bbd38ec3788 100644
+--- a/kernel/ucount.c
++++ b/kernel/ucount.c
+@@ -128,10 +128,10 @@ static struct ucounts *get_ucounts(struct user_namespace 
*ns, kuid_t uid)
+       struct hlist_head *hashent = ucounts_hashentry(ns, uid);
+       struct ucounts *ucounts, *new;
+ 
+-      spin_lock(&ucounts_lock);
++      spin_lock_irq(&ucounts_lock);
+       ucounts = find_ucounts(ns, uid, hashent);
+       if (!ucounts) {
+-              spin_unlock(&ucounts_lock);
++              spin_unlock_irq(&ucounts_lock);
+ 
+               new = kzalloc(sizeof(*new), GFP_KERNEL);
+               if (!new)
+@@ -141,7 +141,7 @@ static struct ucounts *get_ucounts(struct user_namespace 
*ns, kuid_t uid)
+               new->uid = uid;
+               atomic_set(&new->count, 0);
+ 
+-              spin_lock(&ucounts_lock);
++              spin_lock_irq(&ucounts_lock);
+               ucounts = find_ucounts(ns, uid, hashent);
+               if (ucounts) {
+                       kfree(new);
+@@ -152,16 +152,18 @@ static struct ucounts *get_ucounts(struct user_namespace 
*ns, kuid_t uid)
+       }
+       if (!atomic_add_unless(&ucounts->count, 1, INT_MAX))
+               ucounts = NULL;
+-      spin_unlock(&ucounts_lock);
++      spin_unlock_irq(&ucounts_lock);
+       return ucounts;
+ }
+ 
+ static void put_ucounts(struct ucounts *ucounts)
+ {
++      unsigned long flags;
++
+       if (atomic_dec_and_test(&ucounts->count)) {
+-              spin_lock(&ucounts_lock);
++              spin_lock_irqsave(&ucounts_lock, flags);
+               hlist_del_init(&ucounts->node);
+-              spin_unlock(&ucounts_lock);
++              spin_unlock_irqrestore(&ucounts_lock, flags);
+ 
+               kfree(ucounts);
+       }
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c
+index 8ca40b70beae..917555cf6be0 100644
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -772,6 +772,12 @@ struct page *follow_devmap_pmd(struct vm_area_struct 
*vma, unsigned long addr,
+ 
+       assert_spin_locked(pmd_lockptr(mm, pmd));
+ 
++      /*
++       * When we COW a devmap PMD entry, we split it into PTEs, so we should
++       * not be in this function with `flags & FOLL_COW` set.
++       */
++      WARN_ONCE(flags & FOLL_COW, "mm: In follow_devmap_pmd with FOLL_COW 
set");
++
+       if (flags & FOLL_WRITE && !pmd_write(*pmd))
+               return NULL;
+ 
+@@ -1118,6 +1124,16 @@ int do_huge_pmd_wp_page(struct fault_env *fe, pmd_t 
orig_pmd)
+       return ret;
+ }
+ 
++/*
++ * FOLL_FORCE can write to even unwritable pmd's, but only
++ * after we've gone through a COW cycle and they are dirty.
++ */
++static inline bool can_follow_write_pmd(pmd_t pmd, unsigned int flags)
++{
++      return pmd_write(pmd) ||
++             ((flags & FOLL_FORCE) && (flags & FOLL_COW) && pmd_dirty(pmd));
++}
++
+ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma,
+                                  unsigned long addr,
+                                  pmd_t *pmd,
+@@ -1128,7 +1144,7 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct 
*vma,
+ 
+       assert_spin_locked(pmd_lockptr(mm, pmd));
+ 
+-      if (flags & FOLL_WRITE && !pmd_write(*pmd))
++      if (flags & FOLL_WRITE && !can_follow_write_pmd(*pmd, flags))
+               goto out;
+ 
+       /* Avoid dumping huge zero page */
+diff --git a/mm/memcontrol.c b/mm/memcontrol.c
+index d536a9daa511..4c6ade54d833 100644
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -4360,9 +4360,9 @@ static int mem_cgroup_do_precharge(unsigned long count)
+               return ret;
+       }
+ 
+-      /* Try charges one by one with reclaim */
++      /* Try charges one by one with reclaim, but do not retry */
+       while (count--) {
+-              ret = try_charge(mc.to, GFP_KERNEL & ~__GFP_NORETRY, 1);
++              ret = try_charge(mc.to, GFP_KERNEL | __GFP_NORETRY, 1);
+               if (ret)
+                       return ret;
+               mc.precharge++;
+diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
+index cad4b9125695..c3a8141ac788 100644
+--- a/mm/memory_hotplug.c
++++ b/mm/memory_hotplug.c
+@@ -1033,36 +1033,39 @@ static void node_states_set_node(int node, struct 
memory_notify *arg)
+       node_set_state(node, N_MEMORY);
+ }
+ 
+-int zone_can_shift(unsigned long pfn, unsigned long nr_pages,
+-                 enum zone_type target)
++bool zone_can_shift(unsigned long pfn, unsigned long nr_pages,
++                 enum zone_type target, int *zone_shift)
+ {
+       struct zone *zone = page_zone(pfn_to_page(pfn));
+       enum zone_type idx = zone_idx(zone);
+       int i;
+ 
++      *zone_shift = 0;
++
+       if (idx < target) {
+               /* pages must be at end of current zone */
+               if (pfn + nr_pages != zone_end_pfn(zone))
+-                      return 0;
++                      return false;
+ 
+               /* no zones in use between current zone and target */
+               for (i = idx + 1; i < target; i++)
+                       if (zone_is_initialized(zone - idx + i))
+-                              return 0;
++                              return false;
+       }
+ 
+       if (target < idx) {
+               /* pages must be at beginning of current zone */
+               if (pfn != zone->zone_start_pfn)
+-                      return 0;
++                      return false;
+ 
+               /* no zones in use between current zone and target */
+               for (i = target + 1; i < idx; i++)
+                       if (zone_is_initialized(zone - idx + i))
+-                              return 0;
++                              return false;
+       }
+ 
+-      return target - idx;
++      *zone_shift = target - idx;
++      return true;
+ }
+ 
+ /* Must be protected by mem_hotplug_begin() */
+@@ -1089,10 +1092,13 @@ int __ref online_pages(unsigned long pfn, unsigned 
long nr_pages, int online_typ
+           !can_online_high_movable(zone))
+               return -EINVAL;
+ 
+-      if (online_type == MMOP_ONLINE_KERNEL)
+-              zone_shift = zone_can_shift(pfn, nr_pages, ZONE_NORMAL);
+-      else if (online_type == MMOP_ONLINE_MOVABLE)
+-              zone_shift = zone_can_shift(pfn, nr_pages, ZONE_MOVABLE);
++      if (online_type == MMOP_ONLINE_KERNEL) {
++              if (!zone_can_shift(pfn, nr_pages, ZONE_NORMAL, &zone_shift))
++                      return -EINVAL;
++      } else if (online_type == MMOP_ONLINE_MOVABLE) {
++              if (!zone_can_shift(pfn, nr_pages, ZONE_MOVABLE, &zone_shift))
++                      return -EINVAL;
++      }
+ 
+       zone = move_pfn_range(zone_shift, pfn, pfn + nr_pages);
+       if (!zone)
+diff --git a/mm/mempolicy.c b/mm/mempolicy.c
+index 0b859af06b87..f75704717e47 100644
+--- a/mm/mempolicy.c
++++ b/mm/mempolicy.c
+@@ -2023,8 +2023,8 @@ alloc_pages_vma(gfp_t gfp, int order, struct 
vm_area_struct *vma,
+ 
+       nmask = policy_nodemask(gfp, pol);
+       zl = policy_zonelist(gfp, pol, node);
+-      mpol_cond_put(pol);
+       page = __alloc_pages_nodemask(gfp, order, zl, nmask);
++      mpol_cond_put(pol);
+ out:
+       if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie)))
+               goto retry_cpuset;
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 34ada718ef47..f4a02e240fb6 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -3502,12 +3502,13 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int 
order,
+       struct page *page = NULL;
+       unsigned int alloc_flags;
+       unsigned long did_some_progress;
+-      enum compact_priority compact_priority = DEF_COMPACT_PRIORITY;
++      enum compact_priority compact_priority;
+       enum compact_result compact_result;
+-      int compaction_retries = 0;
+-      int no_progress_loops = 0;
++      int compaction_retries;
++      int no_progress_loops;
+       unsigned long alloc_start = jiffies;
+       unsigned int stall_timeout = 10 * HZ;
++      unsigned int cpuset_mems_cookie;
+ 
+       /*
+        * In the slowpath, we sanity check order to avoid ever trying to
+@@ -3528,6 +3529,23 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int 
order,
+                               (__GFP_ATOMIC|__GFP_DIRECT_RECLAIM)))
+               gfp_mask &= ~__GFP_ATOMIC;
+ 
++retry_cpuset:
++      compaction_retries = 0;
++      no_progress_loops = 0;
++      compact_priority = DEF_COMPACT_PRIORITY;
++      cpuset_mems_cookie = read_mems_allowed_begin();
++      /*
++       * We need to recalculate the starting point for the zonelist iterator
++       * because we might have used different nodemask in the fast path, or
++       * there was a cpuset modification and we are retrying - otherwise we
++       * could end up iterating over non-eligible zones endlessly.
++       */
++      ac->preferred_zoneref = first_zones_zonelist(ac->zonelist,
++                                      ac->high_zoneidx, ac->nodemask);
++      if (!ac->preferred_zoneref->zone)
++              goto nopage;
++
++
+       /*
+        * The fast path uses conservative alloc_flags to succeed only until
+        * kswapd needs to be woken up, and to avoid the cost of setting up
+@@ -3687,6 +3705,13 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int 
order,
+                               &compaction_retries))
+               goto retry;
+ 
++      /*
++       * It's possible we raced with cpuset update so the OOM would be
++       * premature (see below the nopage: label for full explanation).
++       */
++      if (read_mems_allowed_retry(cpuset_mems_cookie))
++              goto retry_cpuset;
++
+       /* Reclaim has failed us, start killing things */
+       page = __alloc_pages_may_oom(gfp_mask, order, ac, &did_some_progress);
+       if (page)
+@@ -3699,6 +3724,16 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int 
order,
+       }
+ 
+ nopage:
++      /*
++       * When updating a task's mems_allowed or mempolicy nodemask, it is
++       * possible to race with parallel threads in such a way that our
++       * allocation can fail while the mask is being updated. If we are about
++       * to fail, check if the cpuset changed during allocation and if so,
++       * retry.
++       */
++      if (read_mems_allowed_retry(cpuset_mems_cookie))
++              goto retry_cpuset;
++
+       warn_alloc(gfp_mask,
+                       "page allocation failure: order:%u", order);
+ got_pg:
+@@ -3713,7 +3748,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int 
order,
+                       struct zonelist *zonelist, nodemask_t *nodemask)
+ {
+       struct page *page;
+-      unsigned int cpuset_mems_cookie;
+       unsigned int alloc_flags = ALLOC_WMARK_LOW;
+       gfp_t alloc_mask = gfp_mask; /* The gfp_t that was actually used for 
allocation */
+       struct alloc_context ac = {
+@@ -3750,9 +3784,6 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int 
order,
+       if (IS_ENABLED(CONFIG_CMA) && ac.migratetype == MIGRATE_MOVABLE)
+               alloc_flags |= ALLOC_CMA;
+ 
+-retry_cpuset:
+-      cpuset_mems_cookie = read_mems_allowed_begin();
+-
+       /* Dirty zone balancing only done in the fast path */
+       ac.spread_dirty_pages = (gfp_mask & __GFP_WRITE);
+ 
+@@ -3763,8 +3794,13 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int 
order,
+        */
+       ac.preferred_zoneref = first_zones_zonelist(ac.zonelist,
+                                       ac.high_zoneidx, ac.nodemask);
+-      if (!ac.preferred_zoneref) {
++      if (!ac.preferred_zoneref->zone) {
+               page = NULL;
++              /*
++               * This might be due to race with cpuset_current_mems_allowed
++               * update, so make sure we retry with original nodemask in the
++               * slow path.
++               */
+               goto no_zone;
+       }
+ 
+@@ -3773,6 +3809,7 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int 
order,
+       if (likely(page))
+               goto out;
+ 
++no_zone:
+       /*
+        * Runtime PM, block IO and its error handling path can deadlock
+        * because I/O on the device might not complete.
+@@ -3784,21 +3821,10 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int 
order,
+        * Restore the original nodemask if it was potentially replaced with
+        * &cpuset_current_mems_allowed to optimize the fast-path attempt.
+        */
+-      if (cpusets_enabled())
++      if (unlikely(ac.nodemask != nodemask))
+               ac.nodemask = nodemask;
+-      page = __alloc_pages_slowpath(alloc_mask, order, &ac);
+ 
+-no_zone:
+-      /*
+-       * When updating a task's mems_allowed, it is possible to race with
+-       * parallel threads in such a way that an allocation can fail while
+-       * the mask is being updated. If a page allocation is about to fail,
+-       * check if the cpuset changed during allocation and if so, retry.
+-       */
+-      if (unlikely(!page && read_mems_allowed_retry(cpuset_mems_cookie))) {
+-              alloc_mask = gfp_mask;
+-              goto retry_cpuset;
+-      }
++      page = __alloc_pages_slowpath(alloc_mask, order, &ac);
+ 
+ out:
+       if (memcg_kmem_enabled() && (gfp_mask & __GFP_ACCOUNT) && page &&
+diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
+index 62a482790937..b2ae4f150ec6 100644
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -336,6 +336,11 @@ static int rpc_client_register(struct rpc_clnt *clnt,
+ 
+ static DEFINE_IDA(rpc_clids);
+ 
++void rpc_cleanup_clids(void)
++{
++      ida_destroy(&rpc_clids);
++}
++
+ static int rpc_alloc_clid(struct rpc_clnt *clnt)
+ {
+       int clid;
+diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c
+index ee5d3d253102..3142f38d1104 100644
+--- a/net/sunrpc/sunrpc_syms.c
++++ b/net/sunrpc/sunrpc_syms.c
+@@ -119,6 +119,7 @@ init_sunrpc(void)
+ static void __exit
+ cleanup_sunrpc(void)
+ {
++      rpc_cleanup_clids();
+       rpcauth_remove_module();
+       cleanup_socket_xprt();
+       svc_cleanup_xprt_sock();

diff --git 
a/2700_schedule-the-output_poll_work-with-1s-delay-if-we-have-delayed-event.patch
 
b/2700_schedule-the-output_poll_work-with-1s-delay-if-we-have-delayed-event.patch
deleted file mode 100644
index 198840a..0000000
--- 
a/2700_schedule-the-output_poll_work-with-1s-delay-if-we-have-delayed-event.patch
+++ /dev/null
@@ -1,22 +0,0 @@
---- a/drivers/gpu/drm/drm_probe_helper.c
-+++ b/drivers/gpu/drm/drm_probe_helper.c
-@@ -143,8 +143,18 @@ void drm_kms_helper_poll_enable_locked(struct drm_device 
*dev)
-       }
- 
-       if (dev->mode_config.delayed_event) {
-+              /*
-+               * FIXME:
-+               *
-+               * Use short (1s) delay to handle the initial delayed event.
-+               * This delay should not be needed, but Optimus/nouveau will
-+               * fail in a mysterious way if the delayed event is handled as
-+               * soon as possible like it is done in
-+               * drm_helper_probe_single_connector_modes() in case the poll
-+               * was enabled before.
-+               */
-               poll = true;
--              delay = 0;
-+              delay = HZ;
-       }
- 
-       if (poll)

Reply via email to