commit:     5da38e54b97178f44ef7337f5a1021113c85a9ca
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Fri May  8 12:02:58 2015 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Fri May  8 12:02:58 2015 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=5da38e54

Linux patch 3.14.41

 0000_README              |    4 +
 1040_linux-3.14.41.patch | 3586 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3590 insertions(+)

diff --git a/0000_README b/0000_README
index f33de99..131b883 100644
--- a/0000_README
+++ b/0000_README
@@ -202,6 +202,10 @@ Patch:  1039_linux-3.14.40.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.14.40
 
+Patch:  1040_linux-3.14.41.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.14.41
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1040_linux-3.14.41.patch b/1040_linux-3.14.41.patch
new file mode 100644
index 0000000..5638eff
--- /dev/null
+++ b/1040_linux-3.14.41.patch
@@ -0,0 +1,3586 @@
+diff --git a/Makefile b/Makefile
+index 070e0ebb9231..7a60d4a1301c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 14
+-SUBLEVEL = 40
++SUBLEVEL = 41
+ EXTRAVERSION =
+ NAME = Remembering Coco
+ 
+diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi
+index 187fd46b7b5e..355117cbbf4a 100644
+--- a/arch/arm/boot/dts/dove.dtsi
++++ b/arch/arm/boot/dts/dove.dtsi
+@@ -154,7 +154,7 @@
+ 
+                       uart2: serial@12200 {
+                               compatible = "ns16550a";
+-                              reg = <0x12000 0x100>;
++                              reg = <0x12200 0x100>;
+                               reg-shift = <2>;
+                               interrupts = <9>;
+                               clocks = <&core_clk 0>;
+@@ -163,7 +163,7 @@
+ 
+                       uart3: serial@12300 {
+                               compatible = "ns16550a";
+-                              reg = <0x12100 0x100>;
++                              reg = <0x12300 0x100>;
+                               reg-shift = <2>;
+                               interrupts = <10>;
+                               clocks = <&core_clk 0>;
+diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h
+index f4b46d39b9cf..051b7269e639 100644
+--- a/arch/arm/include/asm/elf.h
++++ b/arch/arm/include/asm/elf.h
+@@ -114,7 +114,7 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t 
*elfregs);
+    the loader.  We need to make sure that it is out of the way of the program
+    that it will "exec", and that there is sufficient room for the brk.  */
+ 
+-#define ELF_ET_DYN_BASE       (2 * TASK_SIZE / 3)
++#define ELF_ET_DYN_BASE       (TASK_SIZE / 3 * 2)
+ 
+ /* When the program starts, a1 contains a pointer to a function to be 
+    registered with atexit, as per the SVR4 ABI.  A value of 0 means we 
+diff --git a/arch/arm/mach-s3c64xx/crag6410.h 
b/arch/arm/mach-s3c64xx/crag6410.h
+index 7bc66682687e..dcbe17f5e5f8 100644
+--- a/arch/arm/mach-s3c64xx/crag6410.h
++++ b/arch/arm/mach-s3c64xx/crag6410.h
+@@ -14,6 +14,7 @@
+ #include <mach/gpio-samsung.h>
+ 
+ #define GLENFARCLAS_PMIC_IRQ_BASE     IRQ_BOARD_START
++#define BANFF_PMIC_IRQ_BASE           (IRQ_BOARD_START + 64)
+ 
+ #define PCA935X_GPIO_BASE             GPIO_BOARD_START
+ #define CODEC_GPIO_BASE                       (GPIO_BOARD_START + 8)
+diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c 
b/arch/arm/mach-s3c64xx/mach-crag6410.c
+index 3df3c372ee1f..66b95c466497 100644
+--- a/arch/arm/mach-s3c64xx/mach-crag6410.c
++++ b/arch/arm/mach-s3c64xx/mach-crag6410.c
+@@ -555,6 +555,7 @@ static struct wm831x_touch_pdata touch_pdata = {
+ 
+ static struct wm831x_pdata crag_pmic_pdata = {
+       .wm831x_num = 1,
++      .irq_base = BANFF_PMIC_IRQ_BASE,
+       .gpio_base = BANFF_PMIC_GPIO_BASE,
+       .soft_shutdown = true,
+ 
+diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile
+index 6d20b7d162d8..a268a9af0c2d 100644
+--- a/arch/arm64/kernel/vdso/Makefile
++++ b/arch/arm64/kernel/vdso/Makefile
+@@ -43,7 +43,7 @@ $(obj)/vdso-offsets.h: $(obj)/vdso.so.dbg FORCE
+       $(call if_changed,vdsosym)
+ 
+ # Assembly rules for the .S files
+-$(obj-vdso): %.o: %.S
++$(obj-vdso): %.o: %.S FORCE
+       $(call if_changed_dep,vdsoas)
+ 
+ # Actual build commands
+diff --git a/arch/c6x/kernel/time.c b/arch/c6x/kernel/time.c
+index 356ee84cad95..04845aaf5985 100644
+--- a/arch/c6x/kernel/time.c
++++ b/arch/c6x/kernel/time.c
+@@ -49,7 +49,7 @@ u64 sched_clock(void)
+       return (tsc * sched_clock_multiplier) >> SCHED_CLOCK_SHIFT;
+ }
+ 
+-void time_init(void)
++void __init time_init(void)
+ {
+       u64 tmp = (u64)NSEC_PER_SEC << SCHED_CLOCK_SHIFT;
+ 
+diff --git a/arch/mips/include/asm/suspend.h b/arch/mips/include/asm/suspend.h
+deleted file mode 100644
+index 3adac3b53d19..000000000000
+--- a/arch/mips/include/asm/suspend.h
++++ /dev/null
+@@ -1,7 +0,0 @@
+-#ifndef __ASM_SUSPEND_H
+-#define __ASM_SUSPEND_H
+-
+-/* References to section boundaries */
+-extern const void __nosave_begin, __nosave_end;
+-
+-#endif /* __ASM_SUSPEND_H */
+diff --git a/arch/mips/power/cpu.c b/arch/mips/power/cpu.c
+index 521e5963df05..2129e67723ff 100644
+--- a/arch/mips/power/cpu.c
++++ b/arch/mips/power/cpu.c
+@@ -7,7 +7,7 @@
+  * Author: Hu Hongbing <[email protected]>
+  *       Wu Zhangjin <[email protected]>
+  */
+-#include <asm/suspend.h>
++#include <asm/sections.h>
+ #include <asm/fpu.h>
+ #include <asm/dsp.h>
+ 
+diff --git a/arch/mips/power/hibernate.S b/arch/mips/power/hibernate.S
+index 32a7c828f073..e7567c8a9e79 100644
+--- a/arch/mips/power/hibernate.S
++++ b/arch/mips/power/hibernate.S
+@@ -30,6 +30,8 @@ LEAF(swsusp_arch_suspend)
+ END(swsusp_arch_suspend)
+ 
+ LEAF(swsusp_arch_resume)
++      /* Avoid TLB mismatch during and after kernel resume */
++      jal local_flush_tlb_all
+       PTR_L t0, restore_pblist
+ 0:
+       PTR_L t1, PBE_ADDRESS(t0)   /* source */
+@@ -43,7 +45,6 @@ LEAF(swsusp_arch_resume)
+       bne t1, t3, 1b
+       PTR_L t0, PBE_NEXT(t0)
+       bnez t0, 0b
+-      jal local_flush_tlb_all /* Avoid TLB mismatch after kernel resume */
+       PTR_LA t0, saved_regs
+       PTR_L ra, PT_R31(t0)
+       PTR_L sp, PT_R29(t0)
+diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c
+index 2912b8787aa4..3eb36cea324c 100644
+--- a/arch/powerpc/kernel/cacheinfo.c
++++ b/arch/powerpc/kernel/cacheinfo.c
+@@ -61,12 +61,22 @@ struct cache_type_info {
+ };
+ 
+ /* These are used to index the cache_type_info array. */
+-#define CACHE_TYPE_UNIFIED     0
+-#define CACHE_TYPE_INSTRUCTION 1
+-#define CACHE_TYPE_DATA        2
++#define CACHE_TYPE_UNIFIED     0 /* cache-size, cache-block-size, etc. */
++#define CACHE_TYPE_UNIFIED_D   1 /* d-cache-size, d-cache-block-size, etc */
++#define CACHE_TYPE_INSTRUCTION 2
++#define CACHE_TYPE_DATA        3
+ 
+ static const struct cache_type_info cache_type_info[] = {
+       {
++              /* Embedded systems that use cache-size, cache-block-size,
++               * etc. for the Unified (typically L2) cache. */
++              .name            = "Unified",
++              .size_prop       = "cache-size",
++              .line_size_props = { "cache-line-size",
++                                   "cache-block-size", },
++              .nr_sets_prop    = "cache-sets",
++      },
++      {
+               /* PowerPC Processor binding says the [di]-cache-*
+                * must be equal on unified caches, so just use
+                * d-cache properties. */
+@@ -293,7 +303,8 @@ static struct cache *cache_find_first_sibling(struct cache 
*cache)
+ {
+       struct cache *iter;
+ 
+-      if (cache->type == CACHE_TYPE_UNIFIED)
++      if (cache->type == CACHE_TYPE_UNIFIED ||
++          cache->type == CACHE_TYPE_UNIFIED_D)
+               return cache;
+ 
+       list_for_each_entry(iter, &cache_list, list)
+@@ -324,16 +335,29 @@ static bool cache_node_is_unified(const struct 
device_node *np)
+       return of_get_property(np, "cache-unified", NULL);
+ }
+ 
+-static struct cache *cache_do_one_devnode_unified(struct device_node *node,
+-                                                int level)
++/*
++ * Unified caches can have two different sets of tags.  Most embedded
++ * use cache-size, etc. for the unified cache size, but open firmware systems
++ * use d-cache-size, etc.   Check on initialization for which type we have, 
and
++ * return the appropriate structure type.  Assume it's embedded if it isn't
++ * open firmware.  If it's yet a 3rd type, then there will be missing entries
++ * in /sys/devices/system/cpu/cpu0/cache/index2/, and this code will need
++ * to be extended further.
++ */
++static int cache_is_unified_d(const struct device_node *np)
+ {
+-      struct cache *cache;
++      return of_get_property(np,
++              cache_type_info[CACHE_TYPE_UNIFIED_D].size_prop, NULL) ?
++              CACHE_TYPE_UNIFIED_D : CACHE_TYPE_UNIFIED;
++}
+ 
++/*
++ */
++static struct cache *cache_do_one_devnode_unified(struct device_node *node, 
int level)
++{
+       pr_debug("creating L%d ucache for %s\n", level, node->full_name);
+ 
+-      cache = new_cache(CACHE_TYPE_UNIFIED, level, node);
+-
+-      return cache;
++      return new_cache(cache_is_unified_d(node), level, node);
+ }
+ 
+ static struct cache *cache_do_one_devnode_split(struct device_node *node,
+diff --git a/arch/powerpc/kernel/suspend.c b/arch/powerpc/kernel/suspend.c
+index 0167d53da30c..a531154cc0f3 100644
+--- a/arch/powerpc/kernel/suspend.c
++++ b/arch/powerpc/kernel/suspend.c
+@@ -9,9 +9,7 @@
+ 
+ #include <linux/mm.h>
+ #include <asm/page.h>
+-
+-/* References to section boundaries */
+-extern const void __nosave_begin, __nosave_end;
++#include <asm/sections.h>
+ 
+ /*
+  *    pfn_is_nosave - check if given pfn is in the 'nosave' section
+diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c
+index 2396dda282cd..ead55351b254 100644
+--- a/arch/powerpc/perf/callchain.c
++++ b/arch/powerpc/perf/callchain.c
+@@ -243,7 +243,7 @@ static void perf_callchain_user_64(struct 
perf_callchain_entry *entry,
+       sp = regs->gpr[1];
+       perf_callchain_store(entry, next_ip);
+ 
+-      for (;;) {
++      while (entry->nr < PERF_MAX_STACK_DEPTH) {
+               fp = (unsigned long __user *) sp;
+               if (!valid_user_sp(sp, 1) || read_user_stack_64(fp, &next_sp))
+                       return;
+diff --git a/arch/powerpc/platforms/cell/iommu.c 
b/arch/powerpc/platforms/cell/iommu.c
+index 2b90ff8a93be..59ef76c5f4f4 100644
+--- a/arch/powerpc/platforms/cell/iommu.c
++++ b/arch/powerpc/platforms/cell/iommu.c
+@@ -197,7 +197,7 @@ static int tce_build_cell(struct iommu_table *tbl, long 
index, long npages,
+ 
+       io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset);
+ 
+-      for (i = 0; i < npages; i++, uaddr += tbl->it_page_shift)
++      for (i = 0; i < npages; i++, uaddr += (1 << tbl->it_page_shift))
+               io_pte[i] = base_pte | (__pa(uaddr) & CBE_IOPTE_RPN_Mask);
+ 
+       mb();
+diff --git a/arch/s390/kernel/suspend.c b/arch/s390/kernel/suspend.c
+index a7a7537ce1e7..d3236c9e226b 100644
+--- a/arch/s390/kernel/suspend.c
++++ b/arch/s390/kernel/suspend.c
+@@ -13,14 +13,10 @@
+ #include <asm/ipl.h>
+ #include <asm/cio.h>
+ #include <asm/pci.h>
++#include <asm/sections.h>
+ #include "entry.h"
+ 
+ /*
+- * References to section boundaries
+- */
+-extern const void __nosave_begin, __nosave_end;
+-
+-/*
+  * The restore of the saved pages in an hibernation image will set
+  * the change and referenced bits in the storage key for each page.
+  * Overindication of the referenced bits after an hibernation cycle
+@@ -142,6 +138,8 @@ int pfn_is_nosave(unsigned long pfn)
+ {
+       unsigned long nosave_begin_pfn = PFN_DOWN(__pa(&__nosave_begin));
+       unsigned long nosave_end_pfn = PFN_DOWN(__pa(&__nosave_end));
++      unsigned long eshared_pfn = PFN_DOWN(__pa(&_eshared)) - 1;
++      unsigned long stext_pfn = PFN_DOWN(__pa(&_stext));
+ 
+       /* Always save lowcore pages (LC protection might be enabled). */
+       if (pfn <= LC_PAGES)
+@@ -149,6 +147,8 @@ int pfn_is_nosave(unsigned long pfn)
+       if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn)
+               return 1;
+       /* Skip memory holes and read-only pages (NSS, DCSS, ...). */
++      if (pfn >= stext_pfn && pfn <= eshared_pfn)
++              return ipl_info.type == IPL_TYPE_NSS ? 1 : 0;
+       if (tprot(PFN_PHYS(pfn)))
+               return 1;
+       return 0;
+diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
+index 75beea632a10..3588f2f37986 100644
+--- a/arch/s390/kvm/priv.c
++++ b/arch/s390/kvm/priv.c
+@@ -414,6 +414,7 @@ static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, 
struct sysinfo_3_2_2 *mem)
+       for (n = mem->count - 1; n > 0 ; n--)
+               memcpy(&mem->vm[n], &mem->vm[n - 1], sizeof(mem->vm[0]));
+ 
++      memset(&mem->vm[0], 0, sizeof(mem->vm[0]));
+       mem->vm[0].cpus_total = cpus;
+       mem->vm[0].cpus_configured = cpus;
+       mem->vm[0].cpus_standby = 0;
+diff --git a/arch/sh/include/asm/sections.h b/arch/sh/include/asm/sections.h
+index 1b6199740e98..7a99e6af6372 100644
+--- a/arch/sh/include/asm/sections.h
++++ b/arch/sh/include/asm/sections.h
+@@ -3,7 +3,6 @@
+ 
+ #include <asm-generic/sections.h>
+ 
+-extern long __nosave_begin, __nosave_end;
+ extern long __machvec_start, __machvec_end;
+ extern char __uncached_start, __uncached_end;
+ extern char __start_eh_frame[], __stop_eh_frame[];
+diff --git a/arch/sparc/power/hibernate.c b/arch/sparc/power/hibernate.c
+index 42b0b8ce699a..17bd2e167e07 100644
+--- a/arch/sparc/power/hibernate.c
++++ b/arch/sparc/power/hibernate.c
+@@ -9,11 +9,9 @@
+ #include <asm/hibernate.h>
+ #include <asm/visasm.h>
+ #include <asm/page.h>
++#include <asm/sections.h>
+ #include <asm/tlb.h>
+ 
+-/* References to section boundaries */
+-extern const void __nosave_begin, __nosave_end;
+-
+ struct saved_context saved_context;
+ 
+ /*
+diff --git a/arch/unicore32/include/mach/pm.h 
b/arch/unicore32/include/mach/pm.h
+index 4dcd34ae194c..77b522694e74 100644
+--- a/arch/unicore32/include/mach/pm.h
++++ b/arch/unicore32/include/mach/pm.h
+@@ -36,8 +36,5 @@ extern int puv3_pm_enter(suspend_state_t state);
+ /* Defined in hibernate_asm.S */
+ extern int restore_image(pgd_t *resume_pg_dir, struct pbe *restore_pblist);
+ 
+-/* References to section boundaries */
+-extern const void __nosave_begin, __nosave_end;
+-
+ extern struct pbe *restore_pblist;
+ #endif
+diff --git a/arch/unicore32/kernel/hibernate.c 
b/arch/unicore32/kernel/hibernate.c
+index d75ef8b6cb56..9969ec374abb 100644
+--- a/arch/unicore32/kernel/hibernate.c
++++ b/arch/unicore32/kernel/hibernate.c
+@@ -18,6 +18,7 @@
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+ #include <asm/pgalloc.h>
++#include <asm/sections.h>
+ #include <asm/suspend.h>
+ 
+ #include "mach/pm.h"
+diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h
+index 1da25a5f96f9..3ba047cbcf5b 100644
+--- a/arch/x86/include/asm/mwait.h
++++ b/arch/x86/include/asm/mwait.h
+@@ -30,6 +30,14 @@ static inline void __mwait(unsigned long eax, unsigned long 
ecx)
+                    :: "a" (eax), "c" (ecx));
+ }
+ 
++static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
++{
++      trace_hardirqs_on();
++      /* "mwait %eax, %ecx;" */
++      asm volatile("sti; .byte 0x0f, 0x01, 0xc9;"
++                   :: "a" (eax), "c" (ecx));
++}
++
+ /*
+  * This uses new MONITOR/MWAIT instructions on P4 processors with PNI,
+  * which can obviate IPI to trigger checking of need_resched.
+diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
+index 3fb8d95ab8b5..1a1ff42094a7 100644
+--- a/arch/x86/kernel/process.c
++++ b/arch/x86/kernel/process.c
+@@ -28,6 +28,7 @@
+ #include <asm/fpu-internal.h>
+ #include <asm/debugreg.h>
+ #include <asm/nmi.h>
++#include <asm/mwait.h>
+ 
+ /*
+  * per-CPU TSS segments. Threads are completely 'soft' on Linux,
+@@ -398,6 +399,52 @@ static void amd_e400_idle(void)
+               default_idle();
+ }
+ 
++/*
++ * Intel Core2 and older machines prefer MWAIT over HALT for C1.
++ * We can't rely on cpuidle installing MWAIT, because it will not load
++ * on systems that support only C1 -- so the boot default must be MWAIT.
++ *
++ * Some AMD machines are the opposite, they depend on using HALT.
++ *
++ * So for default C1, which is used during boot until cpuidle loads,
++ * use MWAIT-C1 on Intel HW that has it, else use HALT.
++ */
++static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c)
++{
++      if (c->x86_vendor != X86_VENDOR_INTEL)
++              return 0;
++
++      if (!cpu_has(c, X86_FEATURE_MWAIT))
++              return 0;
++
++      return 1;
++}
++
++/*
++ * MONITOR/MWAIT with no hints, used for default default C1 state.
++ * This invokes MWAIT with interrutps enabled and no flags,
++ * which is backwards compatible with the original MWAIT implementation.
++ */
++
++static void mwait_idle(void)
++{
++      if (!current_set_polling_and_test()) {
++              if (static_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) {
++                      mb();
++                      clflush((void *)&current_thread_info()->flags);
++                      mb();
++              }
++
++              __monitor((void *)&current_thread_info()->flags, 0, 0);
++              if (!need_resched())
++                      __sti_mwait(0, 0);
++              else
++                      local_irq_enable();
++      } else
++              local_irq_enable();
++      current_clr_polling();
++}
++
+ void select_idle_routine(const struct cpuinfo_x86 *c)
+ {
+ #ifdef CONFIG_SMP
+@@ -411,6 +458,9 @@ void select_idle_routine(const struct cpuinfo_x86 *c)
+               /* E400: APIC timer interrupt does not wake up CPU from C1e */
+               pr_info("using AMD E400 aware idle routine\n");
+               x86_idle = amd_e400_idle;
++      } else if (prefer_mwait_c1_over_halt(c)) {
++              pr_info("using mwait in idle threads\n");
++              x86_idle = mwait_idle;
+       } else
+               x86_idle = default_idle;
+ }
+diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c
+index 7d28c885d238..291226b952a9 100644
+--- a/arch/x86/power/hibernate_32.c
++++ b/arch/x86/power/hibernate_32.c
+@@ -13,13 +13,11 @@
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+ #include <asm/mmzone.h>
++#include <asm/sections.h>
+ 
+ /* Defined in hibernate_asm_32.S */
+ extern int restore_image(void);
+ 
+-/* References to section boundaries */
+-extern const void __nosave_begin, __nosave_end;
+-
+ /* Pointer to the temporary resume page tables */
+ pgd_t *resume_pg_dir;
+ 
+diff --git a/arch/x86/power/hibernate_64.c b/arch/x86/power/hibernate_64.c
+index 304fca20d96e..2276238fde6f 100644
+--- a/arch/x86/power/hibernate_64.c
++++ b/arch/x86/power/hibernate_64.c
+@@ -17,11 +17,9 @@
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+ #include <asm/mtrr.h>
++#include <asm/sections.h>
+ #include <asm/suspend.h>
+ 
+-/* References to section boundaries */
+-extern __visible const void __nosave_begin, __nosave_end;
+-
+ /* Defined in hibernate_asm_64.S */
+ extern asmlinkage int restore_image(void);
+ 
+diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
+index c87ae7c6e5f9..8879361e477e 100644
+--- a/arch/xtensa/Kconfig
++++ b/arch/xtensa/Kconfig
+@@ -336,6 +336,36 @@ menu "Executable file formats"
+ 
+ source "fs/Kconfig.binfmt"
+ 
++config XTFPGA_LCD
++      bool "Enable XTFPGA LCD driver"
++      depends on XTENSA_PLATFORM_XTFPGA
++      default n
++      help
++        There's a 2x16 LCD on most of XTFPGA boards, kernel may output
++        progress messages there during bootup/shutdown. It may be useful
++        during board bringup.
++
++        If unsure, say N.
++
++config XTFPGA_LCD_BASE_ADDR
++      hex "XTFPGA LCD base address"
++      depends on XTFPGA_LCD
++      default "0x0d0c0000"
++      help
++        Base address of the LCD controller inside KIO region.
++        Different boards from XTFPGA family have LCD controller at different
++        addresses. Please consult prototyping user guide for your board for
++        the correct address. Wrong address here may lead to hardware lockup.
++
++config XTFPGA_LCD_8BIT_ACCESS
++      bool "Use 8-bit access to XTFPGA LCD"
++      depends on XTFPGA_LCD
++      default n
++      help
++        LCD may be connected with 4- or 8-bit interface, 8-bit access may
++        only be used with 8-bit interface. Please consult prototyping user
++        guide for your board for the correct interface width.
++
+ endmenu
+ 
+ source "net/Kconfig"
+diff --git a/arch/xtensa/include/uapi/asm/unistd.h 
b/arch/xtensa/include/uapi/asm/unistd.h
+index 50084f7c01c8..b54fa1bd7f7e 100644
+--- a/arch/xtensa/include/uapi/asm/unistd.h
++++ b/arch/xtensa/include/uapi/asm/unistd.h
+@@ -715,7 +715,7 @@ __SYSCALL(323, sys_process_vm_writev, 6)
+ __SYSCALL(324, sys_name_to_handle_at, 5)
+ #define __NR_open_by_handle_at                        325
+ __SYSCALL(325, sys_open_by_handle_at, 3)
+-#define __NR_sync_file_range                  326
++#define __NR_sync_file_range2                 326
+ __SYSCALL(326, sys_sync_file_range2, 6)
+ #define __NR_perf_event_open                  327
+ __SYSCALL(327, sys_perf_event_open, 5)
+diff --git a/arch/xtensa/platforms/iss/network.c 
b/arch/xtensa/platforms/iss/network.c
+index d05f8feeb8d7..17b1ef3232e4 100644
+--- a/arch/xtensa/platforms/iss/network.c
++++ b/arch/xtensa/platforms/iss/network.c
+@@ -349,8 +349,8 @@ static void iss_net_timer(unsigned long priv)
+ {
+       struct iss_net_private *lp = (struct iss_net_private *)priv;
+ 
+-      spin_lock(&lp->lock);
+       iss_net_poll();
++      spin_lock(&lp->lock);
+       mod_timer(&lp->timer, jiffies + lp->timer_val);
+       spin_unlock(&lp->lock);
+ }
+@@ -361,7 +361,7 @@ static int iss_net_open(struct net_device *dev)
+       struct iss_net_private *lp = netdev_priv(dev);
+       int err;
+ 
+-      spin_lock(&lp->lock);
++      spin_lock_bh(&lp->lock);
+ 
+       err = lp->tp.open(lp);
+       if (err < 0)
+@@ -376,9 +376,11 @@ static int iss_net_open(struct net_device *dev)
+       while ((err = iss_net_rx(dev)) > 0)
+               ;
+ 
+-      spin_lock(&opened_lock);
++      spin_unlock_bh(&lp->lock);
++      spin_lock_bh(&opened_lock);
+       list_add(&lp->opened_list, &opened);
+-      spin_unlock(&opened_lock);
++      spin_unlock_bh(&opened_lock);
++      spin_lock_bh(&lp->lock);
+ 
+       init_timer(&lp->timer);
+       lp->timer_val = ISS_NET_TIMER_VALUE;
+@@ -387,7 +389,7 @@ static int iss_net_open(struct net_device *dev)
+       mod_timer(&lp->timer, jiffies + lp->timer_val);
+ 
+ out:
+-      spin_unlock(&lp->lock);
++      spin_unlock_bh(&lp->lock);
+       return err;
+ }
+ 
+@@ -395,7 +397,7 @@ static int iss_net_close(struct net_device *dev)
+ {
+       struct iss_net_private *lp = netdev_priv(dev);
+       netif_stop_queue(dev);
+-      spin_lock(&lp->lock);
++      spin_lock_bh(&lp->lock);
+ 
+       spin_lock(&opened_lock);
+       list_del(&opened);
+@@ -405,18 +407,17 @@ static int iss_net_close(struct net_device *dev)
+ 
+       lp->tp.close(lp);
+ 
+-      spin_unlock(&lp->lock);
++      spin_unlock_bh(&lp->lock);
+       return 0;
+ }
+ 
+ static int iss_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
+       struct iss_net_private *lp = netdev_priv(dev);
+-      unsigned long flags;
+       int len;
+ 
+       netif_stop_queue(dev);
+-      spin_lock_irqsave(&lp->lock, flags);
++      spin_lock_bh(&lp->lock);
+ 
+       len = lp->tp.write(lp, &skb);
+ 
+@@ -438,7 +439,7 @@ static int iss_net_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
+               pr_err("%s: %s failed(%d)\n", dev->name, __func__, len);
+       }
+ 
+-      spin_unlock_irqrestore(&lp->lock, flags);
++      spin_unlock_bh(&lp->lock);
+ 
+       dev_kfree_skb(skb);
+       return NETDEV_TX_OK;
+@@ -466,9 +467,9 @@ static int iss_net_set_mac(struct net_device *dev, void 
*addr)
+ 
+       if (!is_valid_ether_addr(hwaddr->sa_data))
+               return -EADDRNOTAVAIL;
+-      spin_lock(&lp->lock);
++      spin_lock_bh(&lp->lock);
+       memcpy(dev->dev_addr, hwaddr->sa_data, ETH_ALEN);
+-      spin_unlock(&lp->lock);
++      spin_unlock_bh(&lp->lock);
+       return 0;
+ }
+ 
+@@ -520,11 +521,11 @@ static int iss_net_configure(int index, char *init)
+       *lp = (struct iss_net_private) {
+               .device_list            = LIST_HEAD_INIT(lp->device_list),
+               .opened_list            = LIST_HEAD_INIT(lp->opened_list),
+-              .lock                   = __SPIN_LOCK_UNLOCKED(lp.lock),
+               .dev                    = dev,
+               .index                  = index,
+-              };
++      };
+ 
++      spin_lock_init(&lp->lock);
+       /*
+        * If this name ends up conflicting with an existing registered
+        * netdevice, that is OK, register_netdev{,ice}() will notice this
+diff --git a/arch/xtensa/platforms/xtfpga/Makefile 
b/arch/xtensa/platforms/xtfpga/Makefile
+index b9ae206340cd..7839d38b2337 100644
+--- a/arch/xtensa/platforms/xtfpga/Makefile
++++ b/arch/xtensa/platforms/xtfpga/Makefile
+@@ -6,4 +6,5 @@
+ #
+ # Note 2! The CFLAGS definitions are in the main makefile...
+ 
+-obj-y                 = setup.o lcd.o
++obj-y                 += setup.o
++obj-$(CONFIG_XTFPGA_LCD) += lcd.o
+diff --git a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h 
b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
+index aeb316b7ff88..e8cc86fbba09 100644
+--- a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
++++ b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
+@@ -40,9 +40,6 @@
+ 
+ /* UART */
+ #define DUART16552_PADDR      (XCHAL_KIO_PADDR + 0x0D050020)
+-/* LCD instruction and data addresses. */
+-#define LCD_INSTR_ADDR                ((char *)IOADDR(0x0D040000))
+-#define LCD_DATA_ADDR         ((char *)IOADDR(0x0D040004))
+ 
+ /* Misc. */
+ #define XTFPGA_FPGAREGS_VADDR IOADDR(0x0D020000)
+diff --git a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h 
b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h
+index 0e435645af5a..4c8541ed1139 100644
+--- a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h
++++ b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h
+@@ -11,10 +11,25 @@
+ #ifndef __XTENSA_XTAVNET_LCD_H
+ #define __XTENSA_XTAVNET_LCD_H
+ 
++#ifdef CONFIG_XTFPGA_LCD
+ /* Display string STR at position POS on the LCD. */
+ void lcd_disp_at_pos(char *str, unsigned char pos);
+ 
+ /* Shift the contents of the LCD display left or right. */
+ void lcd_shiftleft(void);
+ void lcd_shiftright(void);
++#else
++static inline void lcd_disp_at_pos(char *str, unsigned char pos)
++{
++}
++
++static inline void lcd_shiftleft(void)
++{
++}
++
++static inline void lcd_shiftright(void)
++{
++}
++#endif
++
+ #endif
+diff --git a/arch/xtensa/platforms/xtfpga/lcd.c 
b/arch/xtensa/platforms/xtfpga/lcd.c
+index 2872301598df..4dc0c1b43f4b 100644
+--- a/arch/xtensa/platforms/xtfpga/lcd.c
++++ b/arch/xtensa/platforms/xtfpga/lcd.c
+@@ -1,50 +1,63 @@
+ /*
+- * Driver for the LCD display on the Tensilica LX60 Board.
++ * Driver for the LCD display on the Tensilica XTFPGA board family.
++ * http://www.mytechcorp.com/cfdata/productFile/File1/MOC-16216B-B-A0A04.pdf
+  *
+  * This file is subject to the terms and conditions of the GNU General Public
+  * License.  See the file "COPYING" in the main directory of this archive
+  * for more details.
+  *
+  * Copyright (C) 2001, 2006 Tensilica Inc.
++ * Copyright (C) 2015 Cadence Design Systems Inc.
+  */
+ 
+-/*
+- *
+- * FIXME: this code is from the examples from the LX60 user guide.
+- *
+- * The lcd_pause function does busy waiting, which is probably not
+- * great. Maybe the code could be changed to use kernel timers, or
+- * change the hardware to not need to wait.
+- */
+-
++#include <linux/delay.h>
+ #include <linux/init.h>
+ #include <linux/io.h>
+ 
+ #include <platform/hardware.h>
+ #include <platform/lcd.h>
+-#include <linux/delay.h>
+ 
+-#define LCD_PAUSE_ITERATIONS  4000
++/* LCD instruction and data addresses. */
++#define LCD_INSTR_ADDR                ((char 
*)IOADDR(CONFIG_XTFPGA_LCD_BASE_ADDR))
++#define LCD_DATA_ADDR         (LCD_INSTR_ADDR + 4)
++
+ #define LCD_CLEAR             0x1
+ #define LCD_DISPLAY_ON                0xc
+ 
+ /* 8bit and 2 lines display */
+ #define LCD_DISPLAY_MODE8BIT  0x38
++#define LCD_DISPLAY_MODE4BIT  0x28
+ #define LCD_DISPLAY_POS               0x80
+ #define LCD_SHIFT_LEFT                0x18
+ #define LCD_SHIFT_RIGHT               0x1c
+ 
++static void lcd_put_byte(u8 *addr, u8 data)
++{
++#ifdef CONFIG_XTFPGA_LCD_8BIT_ACCESS
++      ACCESS_ONCE(*addr) = data;
++#else
++      ACCESS_ONCE(*addr) = data & 0xf0;
++      ACCESS_ONCE(*addr) = (data << 4) & 0xf0;
++#endif
++}
++
+ static int __init lcd_init(void)
+ {
+-      *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
++      ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
+       mdelay(5);
+-      *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
++      ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
+       udelay(200);
+-      *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
++      ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
++      udelay(50);
++#ifndef CONFIG_XTFPGA_LCD_8BIT_ACCESS
++      ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE4BIT;
++      udelay(50);
++      lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT);
+       udelay(50);
+-      *LCD_INSTR_ADDR = LCD_DISPLAY_ON;
++#endif
++      lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_ON);
+       udelay(50);
+-      *LCD_INSTR_ADDR = LCD_CLEAR;
++      lcd_put_byte(LCD_INSTR_ADDR, LCD_CLEAR);
+       mdelay(10);
+       lcd_disp_at_pos("XTENSA LINUX", 0);
+       return 0;
+@@ -52,10 +65,10 @@ static int __init lcd_init(void)
+ 
+ void lcd_disp_at_pos(char *str, unsigned char pos)
+ {
+-      *LCD_INSTR_ADDR = LCD_DISPLAY_POS | pos;
++      lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_POS | pos);
+       udelay(100);
+       while (*str != 0) {
+-              *LCD_DATA_ADDR = *str;
++              lcd_put_byte(LCD_DATA_ADDR, *str);
+               udelay(200);
+               str++;
+       }
+@@ -63,13 +76,13 @@ void lcd_disp_at_pos(char *str, unsigned char pos)
+ 
+ void lcd_shiftleft(void)
+ {
+-      *LCD_INSTR_ADDR = LCD_SHIFT_LEFT;
++      lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_LEFT);
+       udelay(50);
+ }
+ 
+ void lcd_shiftright(void)
+ {
+-      *LCD_INSTR_ADDR = LCD_SHIFT_RIGHT;
++      lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_RIGHT);
+       udelay(50);
+ }
+ 
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index 666beea3bf1c..9498c3d575d4 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -192,7 +192,11 @@ bool acpi_scan_is_offline(struct acpi_device *adev, bool 
uevent)
+       struct acpi_device_physical_node *pn;
+       bool offline = true;
+ 
+-      mutex_lock(&adev->physical_node_lock);
++      /*
++       * acpi_container_offline() calls this for all of the container's
++       * children under the container's physical_node_lock lock.
++       */
++      mutex_lock_nested(&adev->physical_node_lock, SINGLE_DEPTH_NESTING);
+ 
+       list_for_each_entry(pn, &adev->physical_node_list, node)
+               if (device_supports_offline(pn->dev) && !pn->dev->offline) {
+diff --git a/drivers/base/bus.c b/drivers/base/bus.c
+index 45d0fa78981c..12b39dc2ad5c 100644
+--- a/drivers/base/bus.c
++++ b/drivers/base/bus.c
+@@ -515,11 +515,11 @@ int bus_add_device(struct device *dev)
+                       goto out_put;
+               error = device_add_groups(dev, bus->dev_groups);
+               if (error)
+-                      goto out_groups;
++                      goto out_id;
+               error = sysfs_create_link(&bus->p->devices_kset->kobj,
+                                               &dev->kobj, dev_name(dev));
+               if (error)
+-                      goto out_id;
++                      goto out_groups;
+               error = sysfs_create_link(&dev->kobj,
+                               &dev->bus->p->subsys.kobj, "subsystem");
+               if (error)
+diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
+index 5afe556a70f8..26b03e1254ef 100644
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -64,6 +64,7 @@ static const struct usb_device_id ath3k_table[] = {
+       /* Atheros AR3011 with sflash firmware*/
+       { USB_DEVICE(0x0489, 0xE027) },
+       { USB_DEVICE(0x0489, 0xE03D) },
++      { USB_DEVICE(0x04F2, 0xAFF1) },
+       { USB_DEVICE(0x0930, 0x0215) },
+       { USB_DEVICE(0x0CF3, 0x3002) },
+       { USB_DEVICE(0x0CF3, 0xE019) },
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 03b331798e16..9eb1669962ef 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -142,6 +142,7 @@ static const struct usb_device_id blacklist_table[] = {
+       /* Atheros 3011 with sflash firmware */
+       { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE },
+       { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
++      { USB_DEVICE(0x04f2, 0xaff1), .driver_info = BTUSB_IGNORE },
+       { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
+       { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
+       { USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
+diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c
+index 0996a3a39855..a9dd21aff6bb 100644
+--- a/drivers/clk/qcom/clk-rcg2.c
++++ b/drivers/clk/qcom/clk-rcg2.c
+@@ -257,7 +257,7 @@ static int __clk_rcg2_set_rate(struct clk_hw *hw, unsigned 
long rate)
+       mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK;
+       cfg = f->pre_div << CFG_SRC_DIV_SHIFT;
+       cfg |= rcg->parent_map[f->src] << CFG_SRC_SEL_SHIFT;
+-      if (rcg->mnd_width && f->n)
++      if (rcg->mnd_width && f->n && (f->m != f->n))
+               cfg |= CFG_MODE_DUAL_EDGE;
+       ret = regmap_update_bits(rcg->clkr.regmap, rcg->cmd_rcgr + CFG_REG, 
mask,
+                       cfg);
+diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c
+index c0a7d7723510..a90af1780cf2 100644
+--- a/drivers/clk/tegra/clk.c
++++ b/drivers/clk/tegra/clk.c
+@@ -266,7 +266,7 @@ void __init tegra_add_of_provider(struct device_node *np)
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+ 
+       rst_ctlr.of_node = np;
+-      rst_ctlr.nr_resets = clk_num * 32;
++      rst_ctlr.nr_resets = periph_banks * 32;
+       reset_controller_register(&rst_ctlr);
+ }
+ 
+diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c
+index dde41f1df608..d522396174c3 100644
+--- a/drivers/crypto/omap-aes.c
++++ b/drivers/crypto/omap-aes.c
+@@ -554,15 +554,23 @@ static int omap_aes_crypt_dma_stop(struct omap_aes_dev 
*dd)
+       return err;
+ }
+ 
+-static int omap_aes_check_aligned(struct scatterlist *sg)
++static int omap_aes_check_aligned(struct scatterlist *sg, int total)
+ {
++      int len = 0;
++
+       while (sg) {
+               if (!IS_ALIGNED(sg->offset, 4))
+                       return -1;
+               if (!IS_ALIGNED(sg->length, AES_BLOCK_SIZE))
+                       return -1;
++
++              len += sg->length;
+               sg = sg_next(sg);
+       }
++
++      if (len != total)
++              return -1;
++
+       return 0;
+ }
+ 
+@@ -633,8 +641,8 @@ static int omap_aes_handle_queue(struct omap_aes_dev *dd,
+       dd->in_sg = req->src;
+       dd->out_sg = req->dst;
+ 
+-      if (omap_aes_check_aligned(dd->in_sg) ||
+-          omap_aes_check_aligned(dd->out_sg)) {
++      if (omap_aes_check_aligned(dd->in_sg, dd->total) ||
++          omap_aes_check_aligned(dd->out_sg, dd->total)) {
+               if (omap_aes_copy_sgs(dd))
+                       pr_err("Failed to copy SGs for unaligned cases\n");
+               dd->sgs_copied = 1;
+diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
+index 3b1fd1ce460f..e9d8cf6c2f79 100644
+--- a/drivers/gpio/gpio-mvebu.c
++++ b/drivers/gpio/gpio-mvebu.c
+@@ -304,11 +304,13 @@ static void mvebu_gpio_edge_irq_mask(struct irq_data *d)
+ {
+       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+       struct mvebu_gpio_chip *mvchip = gc->private;
++      struct irq_chip_type *ct = irq_data_get_chip_type(d);
+       u32 mask = 1 << (d->irq - gc->irq_base);
+ 
+       irq_gc_lock(gc);
+-      gc->mask_cache &= ~mask;
+-      writel_relaxed(gc->mask_cache, mvebu_gpioreg_edge_mask(mvchip));
++      ct->mask_cache_priv &= ~mask;
++
++      writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_edge_mask(mvchip));
+       irq_gc_unlock(gc);
+ }
+ 
+@@ -316,11 +318,13 @@ static void mvebu_gpio_edge_irq_unmask(struct irq_data 
*d)
+ {
+       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+       struct mvebu_gpio_chip *mvchip = gc->private;
++      struct irq_chip_type *ct = irq_data_get_chip_type(d);
++
+       u32 mask = 1 << (d->irq - gc->irq_base);
+ 
+       irq_gc_lock(gc);
+-      gc->mask_cache |= mask;
+-      writel_relaxed(gc->mask_cache, mvebu_gpioreg_edge_mask(mvchip));
++      ct->mask_cache_priv |= mask;
++      writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_edge_mask(mvchip));
+       irq_gc_unlock(gc);
+ }
+ 
+@@ -328,11 +332,13 @@ static void mvebu_gpio_level_irq_mask(struct irq_data *d)
+ {
+       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+       struct mvebu_gpio_chip *mvchip = gc->private;
++      struct irq_chip_type *ct = irq_data_get_chip_type(d);
++
+       u32 mask = 1 << (d->irq - gc->irq_base);
+ 
+       irq_gc_lock(gc);
+-      gc->mask_cache &= ~mask;
+-      writel_relaxed(gc->mask_cache, mvebu_gpioreg_level_mask(mvchip));
++      ct->mask_cache_priv &= ~mask;
++      writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_level_mask(mvchip));
+       irq_gc_unlock(gc);
+ }
+ 
+@@ -340,11 +346,13 @@ static void mvebu_gpio_level_irq_unmask(struct irq_data 
*d)
+ {
+       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
+       struct mvebu_gpio_chip *mvchip = gc->private;
++      struct irq_chip_type *ct = irq_data_get_chip_type(d);
++
+       u32 mask = 1 << (d->irq - gc->irq_base);
+ 
+       irq_gc_lock(gc);
+-      gc->mask_cache |= mask;
+-      writel_relaxed(gc->mask_cache, mvebu_gpioreg_level_mask(mvchip));
++      ct->mask_cache_priv |= mask;
++      writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_level_mask(mvchip));
+       irq_gc_unlock(gc);
+ }
+ 
+diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
+index 8f42bd724682..f1fc14c33be5 100644
+--- a/drivers/gpio/gpiolib.c
++++ b/drivers/gpio/gpiolib.c
+@@ -1928,15 +1928,15 @@ EXPORT_SYMBOL_GPL(gpiod_is_active_low);
+  * that the GPIO was actually requested.
+  */
+ 
+-static int _gpiod_get_raw_value(const struct gpio_desc *desc)
++static bool _gpiod_get_raw_value(const struct gpio_desc *desc)
+ {
+       struct gpio_chip        *chip;
+-      int value;
++      bool value;
+       int offset;
+ 
+       chip = desc->chip;
+       offset = gpio_chip_hwgpio(desc);
+-      value = chip->get ? chip->get(chip, offset) : 0;
++      value = chip->get ? chip->get(chip, offset) : false;
+       trace_gpio_value(desc_to_gpio(desc), 1, value);
+       return value;
+ }
+@@ -1992,7 +1992,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_value);
+  * @desc: gpio descriptor whose state need to be set.
+  * @value: Non-zero for setting it HIGH otherise it will set to LOW.
+  */
+-static void _gpio_set_open_drain_value(struct gpio_desc *desc, int value)
++static void _gpio_set_open_drain_value(struct gpio_desc *desc, bool value)
+ {
+       int err = 0;
+       struct gpio_chip *chip = desc->chip;
+@@ -2019,7 +2019,7 @@ static void _gpio_set_open_drain_value(struct gpio_desc 
*desc, int value)
+  * @desc: gpio descriptor whose state need to be set.
+  * @value: Non-zero for setting it HIGH otherise it will set to LOW.
+  */
+-static void _gpio_set_open_source_value(struct gpio_desc *desc, int value)
++static void _gpio_set_open_source_value(struct gpio_desc *desc, bool value)
+ {
+       int err = 0;
+       struct gpio_chip *chip = desc->chip;
+@@ -2041,7 +2041,7 @@ static void _gpio_set_open_source_value(struct gpio_desc 
*desc, int value)
+                         __func__, err);
+ }
+ 
+-static void _gpiod_set_raw_value(struct gpio_desc *desc, int value)
++static void _gpiod_set_raw_value(struct gpio_desc *desc, bool value)
+ {
+       struct gpio_chip        *chip;
+ 
+diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
+index 0c83b3dab58c..5b38bf819b7b 100644
+--- a/drivers/gpu/drm/i915/i915_reg.h
++++ b/drivers/gpu/drm/i915/i915_reg.h
+@@ -1181,6 +1181,7 @@
+ #define   GMBUS_CYCLE_INDEX   (2<<25)
+ #define   GMBUS_CYCLE_STOP    (4<<25)
+ #define   GMBUS_BYTE_COUNT_SHIFT 16
++#define   GMBUS_BYTE_COUNT_MAX   256U
+ #define   GMBUS_SLAVE_INDEX_SHIFT 8
+ #define   GMBUS_SLAVE_ADDR_SHIFT 1
+ #define   GMBUS_SLAVE_READ    (1<<0)
+diff --git a/drivers/gpu/drm/i915/intel_i2c.c 
b/drivers/gpu/drm/i915/intel_i2c.c
+index d33b61d0dd33..1d02970ed395 100644
+--- a/drivers/gpu/drm/i915/intel_i2c.c
++++ b/drivers/gpu/drm/i915/intel_i2c.c
+@@ -324,18 +324,17 @@ gmbus_wait_idle(struct drm_i915_private *dev_priv)
+ }
+ 
+ static int
+-gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
+-              u32 gmbus1_index)
++gmbus_xfer_read_chunk(struct drm_i915_private *dev_priv,
++                    unsigned short addr, u8 *buf, unsigned int len,
++                    u32 gmbus1_index)
+ {
+       int reg_offset = dev_priv->gpio_mmio_base;
+-      u16 len = msg->len;
+-      u8 *buf = msg->buf;
+ 
+       I915_WRITE(GMBUS1 + reg_offset,
+                  gmbus1_index |
+                  GMBUS_CYCLE_WAIT |
+                  (len << GMBUS_BYTE_COUNT_SHIFT) |
+-                 (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
++                 (addr << GMBUS_SLAVE_ADDR_SHIFT) |
+                  GMBUS_SLAVE_READ | GMBUS_SW_RDY);
+       while (len) {
+               int ret;
+@@ -357,11 +356,35 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, 
struct i2c_msg *msg,
+ }
+ 
+ static int
+-gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg)
++gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
++              u32 gmbus1_index)
+ {
+-      int reg_offset = dev_priv->gpio_mmio_base;
+-      u16 len = msg->len;
+       u8 *buf = msg->buf;
++      unsigned int rx_size = msg->len;
++      unsigned int len;
++      int ret;
++
++      do {
++              len = min(rx_size, GMBUS_BYTE_COUNT_MAX);
++
++              ret = gmbus_xfer_read_chunk(dev_priv, msg->addr,
++                                          buf, len, gmbus1_index);
++              if (ret)
++                      return ret;
++
++              rx_size -= len;
++              buf += len;
++      } while (rx_size != 0);
++
++      return 0;
++}
++
++static int
++gmbus_xfer_write_chunk(struct drm_i915_private *dev_priv,
++                     unsigned short addr, u8 *buf, unsigned int len)
++{
++      int reg_offset = dev_priv->gpio_mmio_base;
++      unsigned int chunk_size = len;
+       u32 val, loop;
+ 
+       val = loop = 0;
+@@ -373,8 +396,8 @@ gmbus_xfer_write(struct drm_i915_private *dev_priv, struct 
i2c_msg *msg)
+       I915_WRITE(GMBUS3 + reg_offset, val);
+       I915_WRITE(GMBUS1 + reg_offset,
+                  GMBUS_CYCLE_WAIT |
+-                 (msg->len << GMBUS_BYTE_COUNT_SHIFT) |
+-                 (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
++                 (chunk_size << GMBUS_BYTE_COUNT_SHIFT) |
++                 (addr << GMBUS_SLAVE_ADDR_SHIFT) |
+                  GMBUS_SLAVE_WRITE | GMBUS_SW_RDY);
+       while (len) {
+               int ret;
+@@ -391,6 +414,29 @@ gmbus_xfer_write(struct drm_i915_private *dev_priv, 
struct i2c_msg *msg)
+               if (ret)
+                       return ret;
+       }
++
++      return 0;
++}
++
++static int
++gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg)
++{
++      u8 *buf = msg->buf;
++      unsigned int tx_size = msg->len;
++      unsigned int len;
++      int ret;
++
++      do {
++              len = min(tx_size, GMBUS_BYTE_COUNT_MAX);
++
++              ret = gmbus_xfer_write_chunk(dev_priv, msg->addr, buf, len);
++              if (ret)
++                      return ret;
++
++              buf += len;
++              tx_size -= len;
++      } while (tx_size != 0);
++
+       return 0;
+ }
+ 
+diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c 
b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
+index 461df93e825e..4f32b34f48d4 100644
+--- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
++++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c
+@@ -35,8 +35,6 @@
+        A3XX_INT0_CP_AHB_ERROR_HALT |     \
+        A3XX_INT0_UCHE_OOB_ACCESS)
+ 
+-static struct platform_device *a3xx_pdev;
+-
+ static void a3xx_me_init(struct msm_gpu *gpu)
+ {
+       struct msm_ringbuffer *ring = gpu->rb;
+@@ -311,7 +309,6 @@ static void a3xx_destroy(struct msm_gpu *gpu)
+               ocmem_free(OCMEM_GRAPHICS, a3xx_gpu->ocmem_hdl);
+ #endif
+ 
+-      put_device(&a3xx_gpu->pdev->dev);
+       kfree(a3xx_gpu);
+ }
+ 
+@@ -439,7 +436,8 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
+       struct a3xx_gpu *a3xx_gpu = NULL;
+       struct adreno_gpu *adreno_gpu;
+       struct msm_gpu *gpu;
+-      struct platform_device *pdev = a3xx_pdev;
++      struct msm_drm_private *priv = dev->dev_private;
++      struct platform_device *pdev = priv->gpu_pdev;
+       struct adreno_platform_config *config;
+       int ret;
+ 
+@@ -460,7 +458,6 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
+       adreno_gpu = &a3xx_gpu->base;
+       gpu = &adreno_gpu->base;
+ 
+-      get_device(&pdev->dev);
+       a3xx_gpu->pdev = pdev;
+ 
+       gpu->fast_rate = config->fast_rate;
+@@ -522,17 +519,24 @@ fail:
+ #  include <mach/kgsl.h>
+ #endif
+ 
+-static int a3xx_probe(struct platform_device *pdev)
++static void set_gpu_pdev(struct drm_device *dev,
++              struct platform_device *pdev)
++{
++      struct msm_drm_private *priv = dev->dev_private;
++      priv->gpu_pdev = pdev;
++}
++
++static int a3xx_bind(struct device *dev, struct device *master, void *data)
+ {
+       static struct adreno_platform_config config = {};
+ #ifdef CONFIG_OF
+-      struct device_node *child, *node = pdev->dev.of_node;
++      struct device_node *child, *node = dev->of_node;
+       u32 val;
+       int ret;
+ 
+       ret = of_property_read_u32(node, "qcom,chipid", &val);
+       if (ret) {
+-              dev_err(&pdev->dev, "could not find chipid: %d\n", ret);
++              dev_err(dev, "could not find chipid: %d\n", ret);
+               return ret;
+       }
+ 
+@@ -548,7 +552,7 @@ static int a3xx_probe(struct platform_device *pdev)
+                       for_each_child_of_node(child, pwrlvl) {
+                               ret = of_property_read_u32(pwrlvl, 
"qcom,gpu-freq", &val);
+                               if (ret) {
+-                                      dev_err(&pdev->dev, "could not find 
gpu-freq: %d\n", ret);
++                                      dev_err(dev, "could not find gpu-freq: 
%d\n", ret);
+                                       return ret;
+                               }
+                               config.fast_rate = max(config.fast_rate, val);
+@@ -558,12 +562,12 @@ static int a3xx_probe(struct platform_device *pdev)
+       }
+ 
+       if (!config.fast_rate) {
+-              dev_err(&pdev->dev, "could not find clk rates\n");
++              dev_err(dev, "could not find clk rates\n");
+               return -ENXIO;
+       }
+ 
+ #else
+-      struct kgsl_device_platform_data *pdata = pdev->dev.platform_data;
++      struct kgsl_device_platform_data *pdata = dev->platform_data;
+       uint32_t version = socinfo_get_version();
+       if (cpu_is_apq8064ab()) {
+               config.fast_rate = 450000000;
+@@ -609,14 +613,30 @@ static int a3xx_probe(struct platform_device *pdev)
+       config.bus_scale_table = pdata->bus_scale_table;
+ #  endif
+ #endif
+-      pdev->dev.platform_data = &config;
+-      a3xx_pdev = pdev;
++      dev->platform_data = &config;
++      set_gpu_pdev(dev_get_drvdata(master), to_platform_device(dev));
+       return 0;
+ }
+ 
++static void a3xx_unbind(struct device *dev, struct device *master,
++              void *data)
++{
++      set_gpu_pdev(dev_get_drvdata(master), NULL);
++}
++
++static const struct component_ops a3xx_ops = {
++              .bind   = a3xx_bind,
++              .unbind = a3xx_unbind,
++};
++
++static int a3xx_probe(struct platform_device *pdev)
++{
++      return component_add(&pdev->dev, &a3xx_ops);
++}
++
+ static int a3xx_remove(struct platform_device *pdev)
+ {
+-      a3xx_pdev = NULL;
++      component_del(&pdev->dev, &a3xx_ops);
+       return 0;
+ }
+ 
+@@ -624,7 +644,6 @@ static const struct of_device_id dt_match[] = {
+       { .compatible = "qcom,kgsl-3d0" },
+       {}
+ };
+-MODULE_DEVICE_TABLE(of, dt_match);
+ 
+ static struct platform_driver a3xx_driver = {
+       .probe = a3xx_probe,
+diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c
+index 6f1588aa9071..8a04a1d206cd 100644
+--- a/drivers/gpu/drm/msm/hdmi/hdmi.c
++++ b/drivers/gpu/drm/msm/hdmi/hdmi.c
+@@ -17,8 +17,6 @@
+ 
+ #include "hdmi.h"
+ 
+-static struct platform_device *hdmi_pdev;
+-
+ void hdmi_set_mode(struct hdmi *hdmi, bool power_on)
+ {
+       uint32_t ctrl = 0;
+@@ -75,7 +73,7 @@ struct hdmi *hdmi_init(struct drm_device *dev, struct 
drm_encoder *encoder)
+ {
+       struct hdmi *hdmi = NULL;
+       struct msm_drm_private *priv = dev->dev_private;
+-      struct platform_device *pdev = hdmi_pdev;
++      struct platform_device *pdev = priv->hdmi_pdev;
+       struct hdmi_platform_config *config;
+       int i, ret;
+ 
+@@ -95,8 +93,6 @@ struct hdmi *hdmi_init(struct drm_device *dev, struct 
drm_encoder *encoder)
+ 
+       kref_init(&hdmi->refcount);
+ 
+-      get_device(&pdev->dev);
+-
+       hdmi->dev = dev;
+       hdmi->pdev = pdev;
+       hdmi->config = config;
+@@ -249,17 +245,24 @@ fail:
+ 
+ #include <linux/of_gpio.h>
+ 
+-static int hdmi_dev_probe(struct platform_device *pdev)
++static void set_hdmi_pdev(struct drm_device *dev,
++              struct platform_device *pdev)
++{
++      struct msm_drm_private *priv = dev->dev_private;
++      priv->hdmi_pdev = pdev;
++}
++
++static int hdmi_bind(struct device *dev, struct device *master, void *data)
+ {
+       static struct hdmi_platform_config config = {};
+ #ifdef CONFIG_OF
+-      struct device_node *of_node = pdev->dev.of_node;
++      struct device_node *of_node = dev->of_node;
+ 
+       int get_gpio(const char *name)
+       {
+               int gpio = of_get_named_gpio(of_node, name, 0);
+               if (gpio < 0) {
+-                      dev_err(&pdev->dev, "failed to get gpio: %s (%d)\n",
++                      dev_err(dev, "failed to get gpio: %s (%d)\n",
+                                       name, gpio);
+                       gpio = -1;
+               }
+@@ -336,14 +339,30 @@ static int hdmi_dev_probe(struct platform_device *pdev)
+               config.mux_sel_gpio  = -1;
+       }
+ #endif
+-      pdev->dev.platform_data = &config;
+-      hdmi_pdev = pdev;
++      dev->platform_data = &config;
++      set_hdmi_pdev(dev_get_drvdata(master), to_platform_device(dev));
+       return 0;
+ }
+ 
++static void hdmi_unbind(struct device *dev, struct device *master,
++              void *data)
++{
++      set_hdmi_pdev(dev_get_drvdata(master), NULL);
++}
++
++static const struct component_ops hdmi_ops = {
++              .bind   = hdmi_bind,
++              .unbind = hdmi_unbind,
++};
++
++static int hdmi_dev_probe(struct platform_device *pdev)
++{
++      return component_add(&pdev->dev, &hdmi_ops);
++}
++
+ static int hdmi_dev_remove(struct platform_device *pdev)
+ {
+-      hdmi_pdev = NULL;
++      component_del(&pdev->dev, &hdmi_ops);
+       return 0;
+ }
+ 
+@@ -351,7 +370,6 @@ static const struct of_device_id dt_match[] = {
+       { .compatible = "qcom,hdmi-tx" },
+       {}
+ };
+-MODULE_DEVICE_TABLE(of, dt_match);
+ 
+ static struct platform_driver hdmi_driver = {
+       .probe = hdmi_dev_probe,
+diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
+index e6adafc7eff3..e79cfd0b2b04 100644
+--- a/drivers/gpu/drm/msm/msm_drv.c
++++ b/drivers/gpu/drm/msm/msm_drv.c
+@@ -56,6 +56,10 @@ static char *vram;
+ MODULE_PARM_DESC(vram, "Configure VRAM size (for devices without 
IOMMU/GPUMMU");
+ module_param(vram, charp, 0);
+ 
++/*
++ * Util/helpers:
++ */
++
+ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,
+               const char *dbgname)
+ {
+@@ -143,6 +147,8 @@ static int msm_unload(struct drm_device *dev)
+                               priv->vram.paddr, &attrs);
+       }
+ 
++      component_unbind_all(dev->dev, dev);
++
+       dev->dev_private = NULL;
+ 
+       kfree(priv);
+@@ -175,6 +181,7 @@ static int msm_load(struct drm_device *dev, unsigned long 
flags)
+       struct msm_kms *kms;
+       int ret;
+ 
++
+       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+       if (!priv) {
+               dev_err(dev->dev, "failed to allocate private data\n");
+@@ -226,6 +233,13 @@ static int msm_load(struct drm_device *dev, unsigned long 
flags)
+                               (uint32_t)(priv->vram.paddr + size));
+       }
+ 
++      platform_set_drvdata(pdev, dev);
++
++      /* Bind all our sub-components: */
++      ret = component_bind_all(dev->dev, dev);
++      if (ret)
++              return ret;
++
+       switch (get_mdp_ver(pdev)) {
+       case 4:
+               kms = mdp4_kms_init(dev);
+@@ -281,8 +295,6 @@ static int msm_load(struct drm_device *dev, unsigned long 
flags)
+               goto fail;
+       }
+ 
+-      platform_set_drvdata(pdev, dev);
+-
+ #ifdef CONFIG_DRM_MSM_FBDEV
+       priv->fbdev = msm_fbdev_init(dev);
+ #endif
+@@ -819,18 +831,110 @@ static const struct dev_pm_ops msm_pm_ops = {
+ };
+ 
+ /*
++ * Componentized driver support:
++ */
++
++#ifdef CONFIG_OF
++/* NOTE: the CONFIG_OF case duplicates the same code as exynos or imx
++ * (or probably any other).. so probably some room for some helpers
++ */
++static int compare_of(struct device *dev, void *data)
++{
++      return dev->of_node == data;
++}
++
++static int msm_drm_add_components(struct device *master, struct master *m)
++{
++      struct device_node *np = master->of_node;
++      unsigned i;
++      int ret;
++
++      for (i = 0; ; i++) {
++              struct device_node *node;
++
++              node = of_parse_phandle(np, "connectors", i);
++              if (!node)
++                      break;
++
++              ret = component_master_add_child(m, compare_of, node);
++              of_node_put(node);
++
++              if (ret)
++                      return ret;
++      }
++      return 0;
++}
++#else
++static int compare_dev(struct device *dev, void *data)
++{
++      return dev == data;
++}
++
++static int msm_drm_add_components(struct device *master, struct master *m)
++{
++      /* For non-DT case, it kinda sucks.  We don't actually have a way
++       * to know whether or not we are waiting for certain devices (or if
++       * they are simply not present).  But for non-DT we only need to
++       * care about apq8064/apq8060/etc (all mdp4/a3xx):
++       */
++      static const char *devnames[] = {
++                      "hdmi_msm.0", "kgsl-3d0.0",
++      };
++      int i;
++
++      DBG("Adding components..");
++
++      for (i = 0; i < ARRAY_SIZE(devnames); i++) {
++              struct device *dev;
++              int ret;
++
++              dev = bus_find_device_by_name(&platform_bus_type,
++                              NULL, devnames[i]);
++              if (!dev) {
++                      dev_info(master, "still waiting for %s\n", devnames[i]);
++                      return -EPROBE_DEFER;
++              }
++
++              ret = component_master_add_child(m, compare_dev, dev);
++              if (ret) {
++                      DBG("could not add child: %d", ret);
++                      return ret;
++              }
++      }
++
++      return 0;
++}
++#endif
++
++static int msm_drm_bind(struct device *dev)
++{
++      return drm_platform_init(&msm_driver, to_platform_device(dev));
++}
++
++static void msm_drm_unbind(struct device *dev)
++{
++      drm_put_dev(platform_get_drvdata(to_platform_device(dev)));
++}
++
++static const struct component_master_ops msm_drm_ops = {
++              .add_components = msm_drm_add_components,
++              .bind = msm_drm_bind,
++              .unbind = msm_drm_unbind,
++};
++
++/*
+  * Platform driver:
+  */
+ 
+ static int msm_pdev_probe(struct platform_device *pdev)
+ {
+       pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
+-      return drm_platform_init(&msm_driver, pdev);
++      return component_master_add(&pdev->dev, &msm_drm_ops);
+ }
+ 
+ static int msm_pdev_remove(struct platform_device *pdev)
+ {
+-      drm_put_dev(platform_get_drvdata(pdev));
++      component_master_del(&pdev->dev, &msm_drm_ops);
+ 
+       return 0;
+ }
+diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
+index 3d63269c5b29..9d10ee0b5aac 100644
+--- a/drivers/gpu/drm/msm/msm_drv.h
++++ b/drivers/gpu/drm/msm/msm_drv.h
+@@ -22,6 +22,7 @@
+ #include <linux/clk.h>
+ #include <linux/cpufreq.h>
+ #include <linux/module.h>
++#include <linux/component.h>
+ #include <linux/platform_device.h>
+ #include <linux/pm.h>
+ #include <linux/pm_runtime.h>
+@@ -69,6 +70,9 @@ struct msm_drm_private {
+ 
+       struct msm_kms *kms;
+ 
++      /* subordinate devices, if present: */
++      struct platform_device *hdmi_pdev, *gpu_pdev;
++
+       /* when we have more than one 'msm_gpu' these need to be an array: */
+       struct msm_gpu *gpu;
+       struct msm_file_private *lastctx;
+diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c 
b/drivers/gpu/drm/radeon/atombios_crtc.c
+index 663394f0c166..0db3e208f02a 100644
+--- a/drivers/gpu/drm/radeon/atombios_crtc.c
++++ b/drivers/gpu/drm/radeon/atombios_crtc.c
+@@ -330,8 +330,10 @@ atombios_set_crtc_dtd_timing(struct drm_crtc *crtc,
+               misc |= ATOM_COMPOSITESYNC;
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+               misc |= ATOM_INTERLACE;
+-      if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
++      if (mode->flags & DRM_MODE_FLAG_DBLCLK)
+               misc |= ATOM_DOUBLE_CLOCK_MODE;
++      if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
++              misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2;
+ 
+       args.susModeMiscInfo.usAccess = cpu_to_le16(misc);
+       args.ucCRTC = radeon_crtc->crtc_id;
+@@ -374,8 +376,10 @@ static void atombios_crtc_set_timing(struct drm_crtc 
*crtc,
+               misc |= ATOM_COMPOSITESYNC;
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+               misc |= ATOM_INTERLACE;
+-      if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
++      if (mode->flags & DRM_MODE_FLAG_DBLCLK)
+               misc |= ATOM_DOUBLE_CLOCK_MODE;
++      if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
++              misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2;
+ 
+       args.susModeMiscInfo.usAccess = cpu_to_le16(misc);
+       args.ucCRTC = radeon_crtc->crtc_id;
+diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
+index e99e71a6ea59..356f22f90a05 100644
+--- a/drivers/hv/channel.c
++++ b/drivers/hv/channel.c
+@@ -134,7 +134,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 
send_ringbuffer_size,
+                          GFP_KERNEL);
+       if (!open_info) {
+               err = -ENOMEM;
+-              goto error0;
++              goto error_gpadl;
+       }
+ 
+       init_completion(&open_info->waitevent);
+@@ -150,7 +150,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 
send_ringbuffer_size,
+ 
+       if (userdatalen > MAX_USER_DEFINED_BYTES) {
+               err = -EINVAL;
+-              goto error0;
++              goto error_gpadl;
+       }
+ 
+       if (userdatalen)
+@@ -194,6 +194,9 @@ error1:
+       list_del(&open_info->msglistentry);
+       spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
+ 
++error_gpadl:
++      vmbus_teardown_gpadl(newchannel, newchannel->ringbuffer_gpadlhandle);
++
+ error0:
+       free_pages((unsigned long)out,
+               get_order(send_ringbuffer_size + recv_ringbuffer_size));
+diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
+index 5fb80b8962a2..43fe15a0e5cc 100644
+--- a/drivers/i2c/i2c-core.c
++++ b/drivers/i2c/i2c-core.c
+@@ -217,6 +217,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)
+       adap->bus_recovery_info->set_scl(adap, 1);
+       return i2c_generic_recovery(adap);
+ }
++EXPORT_SYMBOL_GPL(i2c_generic_scl_recovery);
+ 
+ int i2c_generic_gpio_recovery(struct i2c_adapter *adap)
+ {
+@@ -231,6 +232,7 @@ int i2c_generic_gpio_recovery(struct i2c_adapter *adap)
+ 
+       return ret;
+ }
++EXPORT_SYMBOL_GPL(i2c_generic_gpio_recovery);
+ 
+ int i2c_recover_bus(struct i2c_adapter *adap)
+ {
+@@ -240,6 +242,7 @@ int i2c_recover_bus(struct i2c_adapter *adap)
+       dev_dbg(&adap->dev, "Trying i2c bus recovery\n");
+       return adap->bus_recovery_info->recover_bus(adap);
+ }
++EXPORT_SYMBOL_GPL(i2c_recover_bus);
+ 
+ static int i2c_device_probe(struct device *dev)
+ {
+diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c
+index 055ebebc07dd..c1fef27010d4 100644
+--- a/drivers/infiniband/core/umem.c
++++ b/drivers/infiniband/core/umem.c
+@@ -94,12 +94,15 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, 
unsigned long addr,
+       if (dmasync)
+               dma_set_attr(DMA_ATTR_WRITE_BARRIER, &attrs);
+ 
++      if (!size)
++              return ERR_PTR(-EINVAL);
++
+       /*
+        * If the combination of the addr and size requested for this memory
+        * region causes an integer overflow, return error.
+        */
+-      if ((PAGE_ALIGN(addr + size) <= size) ||
+-          (PAGE_ALIGN(addr + size) <= addr))
++      if (((addr + size) < addr) ||
++          PAGE_ALIGN(addr + size) < (addr + size))
+               return ERR_PTR(-EINVAL);
+ 
+       if (!can_do_mlock())
+diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
+index d8f4d1fe8494..8d7cd98c9671 100644
+--- a/drivers/infiniband/hw/mlx4/qp.c
++++ b/drivers/infiniband/hw/mlx4/qp.c
+@@ -2274,8 +2274,7 @@ static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, 
struct ib_send_wr *wr,
+ 
+       memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen);
+ 
+-      *lso_hdr_sz  = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 |
+-                                 wr->wr.ud.hlen);
++      *lso_hdr_sz  = cpu_to_be32(wr->wr.ud.mss << 16 | wr->wr.ud.hlen);
+       *lso_seg_len = halign;
+       return 0;
+ }
+diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
+index 0b75b5764f31..cfc5a2e6dcce 100644
+--- a/drivers/input/mouse/elantech.c
++++ b/drivers/input/mouse/elantech.c
+@@ -814,6 +814,21 @@ static psmouse_ret_t elantech_process_byte(struct psmouse 
*psmouse)
+ }
+ 
+ /*
++ * This writes the reg_07 value again to the hardware at the end of every
++ * set_rate call because the register loses its value. reg_07 allows setting
++ * absolute mode on v4 hardware
++ */
++static void elantech_set_rate_restore_reg_07(struct psmouse *psmouse,
++              unsigned int rate)
++{
++      struct elantech_data *etd = psmouse->private;
++
++      etd->original_set_rate(psmouse, rate);
++      if (elantech_write_reg(psmouse, 0x07, etd->reg_07))
++              psmouse_err(psmouse, "restoring reg_07 failed\n");
++}
++
++/*
+  * Put the touchpad into absolute mode
+  */
+ static int elantech_set_absolute_mode(struct psmouse *psmouse)
+@@ -1015,6 +1030,8 @@ static int elantech_get_resolution_v4(struct psmouse 
*psmouse,
+  * Asus K53SV              0x450f01        78, 15, 0c      2 hw buttons
+  * Asus G46VW              0x460f02        00, 18, 0c      2 hw buttons
+  * Asus G750JX             0x360f00        00, 16, 0c      2 hw buttons
++ * Asus TP500LN            0x381f17        10, 14, 0e      clickpad
++ * Asus X750JN             0x381f17        10, 14, 0e      clickpad
+  * Asus UX31               0x361f00        20, 15, 0e      clickpad
+  * Asus UX32VD             0x361f02        00, 15, 0e      clickpad
+  * Avatar AVIU-145A2       0x361f00        ?               clickpad
+@@ -1490,6 +1507,11 @@ int elantech_init(struct psmouse *psmouse)
+               goto init_fail;
+       }
+ 
++      if (etd->fw_version == 0x381f17) {
++              etd->original_set_rate = psmouse->set_rate;
++              psmouse->set_rate = elantech_set_rate_restore_reg_07;
++      }
++
+       if (elantech_set_input_params(psmouse)) {
+               psmouse_err(psmouse, "failed to query touchpad range.\n");
+               goto init_fail;
+diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h
+index 9e0e2a1f340d..59263a3a8667 100644
+--- a/drivers/input/mouse/elantech.h
++++ b/drivers/input/mouse/elantech.h
+@@ -139,6 +139,7 @@ struct elantech_data {
+       struct finger_pos mt[ETP_MAX_FINGERS];
+       unsigned char parity[256];
+       int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char 
*param);
++      void (*original_set_rate)(struct psmouse *psmouse, unsigned int rate);
+ };
+ 
+ #ifdef CONFIG_MOUSE_PS2_ELANTECH
+diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
+index 4a8d19d0a5a4..5a4cda24e302 100644
+--- a/drivers/md/dm-crypt.c
++++ b/drivers/md/dm-crypt.c
+@@ -915,11 +915,10 @@ static int crypt_convert(struct crypt_config *cc,
+ 
+               switch (r) {
+               /* async */
++              case -EINPROGRESS:
+               case -EBUSY:
+                       wait_for_completion(&ctx->restart);
+                       reinit_completion(&ctx->restart);
+-                      /* fall through*/
+-              case -EINPROGRESS:
+                       ctx->req = NULL;
+                       ctx->cc_sector++;
+                       continue;
+@@ -1314,10 +1313,8 @@ static void kcryptd_async_done(struct 
crypto_async_request *async_req,
+       struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx);
+       struct crypt_config *cc = io->cc;
+ 
+-      if (error == -EINPROGRESS) {
+-              complete(&ctx->restart);
++      if (error == -EINPROGRESS)
+               return;
+-      }
+ 
+       if (!error && cc->iv_gen_ops && cc->iv_gen_ops->post)
+               error = cc->iv_gen_ops->post(cc, iv_of_dmreq(cc, dmreq), dmreq);
+@@ -1328,12 +1325,15 @@ static void kcryptd_async_done(struct 
crypto_async_request *async_req,
+       mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool);
+ 
+       if (!atomic_dec_and_test(&ctx->cc_pending))
+-              return;
++              goto done;
+ 
+       if (bio_data_dir(io->base_bio) == READ)
+               kcryptd_crypt_read_done(io);
+       else
+               kcryptd_crypt_write_io_submit(io, 1);
++done:
++      if (!completion_done(&ctx->restart))
++              complete(&ctx->restart);
+ }
+ 
+ static void kcryptd_crypt(struct work_struct *work)
+diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
+index 407a99e46f69..683e685ed697 100644
+--- a/drivers/md/raid0.c
++++ b/drivers/md/raid0.c
+@@ -320,7 +320,7 @@ static struct strip_zone *find_zone(struct r0conf *conf,
+ 
+ /*
+  * remaps the bio to the target device. we separate two flows.
+- * power 2 flow and a general flow for the sake of perfromance
++ * power 2 flow and a general flow for the sake of performance
+ */
+ static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone 
*zone,
+                               sector_t sector, sector_t *sector_offset)
+@@ -538,6 +538,7 @@ static void raid0_make_request(struct mddev *mddev, struct 
bio *bio)
+                       split = bio;
+               }
+ 
++              sector = bio->bi_iter.bi_sector;
+               zone = find_zone(mddev->private, &sector);
+               tmp_dev = map_sector(mddev, zone, sector, &sector);
+               split->bi_bdev = tmp_dev->bdev;
+diff --git a/drivers/media/usb/stk1160/stk1160-v4l.c 
b/drivers/media/usb/stk1160/stk1160-v4l.c
+index c45c9881bb5f..4572530346fb 100644
+--- a/drivers/media/usb/stk1160/stk1160-v4l.c
++++ b/drivers/media/usb/stk1160/stk1160-v4l.c
+@@ -244,6 +244,11 @@ static int stk1160_stop_streaming(struct stk1160 *dev)
+       if (mutex_lock_interruptible(&dev->v4l_lock))
+               return -ERESTARTSYS;
+ 
++      /*
++       * Once URBs are cancelled, the URB complete handler
++       * won't be running. This is required to safely release the
++       * current buffer (dev->isoc_ctl.buf).
++       */
+       stk1160_cancel_isoc(dev);
+ 
+       /*
+@@ -624,8 +629,16 @@ void stk1160_clear_queue(struct stk1160 *dev)
+               stk1160_info("buffer [%p/%d] aborted\n",
+                               buf, buf->vb.v4l2_buf.index);
+       }
+-      /* It's important to clear current buffer */
+-      dev->isoc_ctl.buf = NULL;
++
++      /* It's important to release the current buffer */
++      if (dev->isoc_ctl.buf) {
++              buf = dev->isoc_ctl.buf;
++              dev->isoc_ctl.buf = NULL;
++
++              vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
++              stk1160_info("buffer [%p/%d] aborted\n",
++                              buf, buf->vb.v4l2_buf.index);
++      }
+       spin_unlock_irqrestore(&dev->buf_lock, flags);
+ }
+ 
+diff --git a/drivers/memstick/core/mspro_block.c 
b/drivers/memstick/core/mspro_block.c
+index fc145d202c46..922a750640e8 100644
+--- a/drivers/memstick/core/mspro_block.c
++++ b/drivers/memstick/core/mspro_block.c
+@@ -758,7 +758,7 @@ static int mspro_block_complete_req(struct memstick_dev 
*card, int error)
+ 
+               if (error || (card->current_mrq.tpc == MSPRO_CMD_STOP)) {
+                       if (msb->data_dir == READ) {
+-                              for (cnt = 0; cnt < msb->current_seg; cnt++)
++                              for (cnt = 0; cnt < msb->current_seg; cnt++) {
+                                       t_len += msb->req_sg[cnt].length
+                                                / msb->page_size;
+ 
+@@ -766,6 +766,7 @@ static int mspro_block_complete_req(struct memstick_dev 
*card, int error)
+                                               t_len += msb->current_page - 1;
+ 
+                                       t_len *= msb->page_size;
++                              }
+                       }
+               } else
+                       t_len = blk_rq_bytes(msb->block_req);
+diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c
+index 6f27d9a1be3b..21841fe25ad3 100644
+--- a/drivers/mtd/ubi/attach.c
++++ b/drivers/mtd/ubi/attach.c
+@@ -408,7 +408,7 @@ int ubi_compare_lebs(struct ubi_device *ubi, const struct 
ubi_ainf_peb *aeb,
+               second_is_newer = !second_is_newer;
+       } else {
+               dbg_bld("PEB %d CRC is OK", pnum);
+-              bitflips = !!err;
++              bitflips |= !!err;
+       }
+       mutex_unlock(&ubi->buf_mutex);
+ 
+diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
+index 8ca49f2043e4..4cbbd5531133 100644
+--- a/drivers/mtd/ubi/cdev.c
++++ b/drivers/mtd/ubi/cdev.c
+@@ -451,7 +451,7 @@ static long vol_cdev_ioctl(struct file *file, unsigned int 
cmd,
+               /* Validate the request */
+               err = -EINVAL;
+               if (req.lnum < 0 || req.lnum >= vol->reserved_pebs ||
+-                  req.bytes < 0 || req.lnum >= vol->usable_leb_size)
++                  req.bytes < 0 || req.bytes > vol->usable_leb_size)
+                       break;
+ 
+               err = get_exclusive(desc);
+diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c
+index 0e11671dadc4..930cf2c77abb 100644
+--- a/drivers/mtd/ubi/eba.c
++++ b/drivers/mtd/ubi/eba.c
+@@ -1362,7 +1362,8 @@ int ubi_eba_init(struct ubi_device *ubi, struct 
ubi_attach_info *ai)
+                                * during re-size.
+                                */
+                               ubi_move_aeb_to_list(av, aeb, &ai->erase);
+-                      vol->eba_tbl[aeb->lnum] = aeb->pnum;
++                      else
++                              vol->eba_tbl[aeb->lnum] = aeb->pnum;
+               }
+       }
+ 
+diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c
+index 68b924ec222e..c6b0b078ab99 100644
+--- a/drivers/mtd/ubi/wl.c
++++ b/drivers/mtd/ubi/wl.c
+@@ -995,7 +995,7 @@ static int wear_leveling_worker(struct ubi_device *ubi, 
struct ubi_work *wrk,
+                               int cancel)
+ {
+       int err, scrubbing = 0, torture = 0, protect = 0, erroneous = 0;
+-      int vol_id = -1, uninitialized_var(lnum);
++      int vol_id = -1, lnum = -1;
+ #ifdef CONFIG_MTD_UBI_FASTMAP
+       int anchor = wrk->anchor;
+ #endif
+diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c 
b/drivers/net/ethernet/intel/e1000/e1000_main.c
+index 46e6544ed1b7..b655fe4f4c2e 100644
+--- a/drivers/net/ethernet/intel/e1000/e1000_main.c
++++ b/drivers/net/ethernet/intel/e1000/e1000_main.c
+@@ -144,6 +144,11 @@ static bool e1000_clean_rx_irq(struct e1000_adapter 
*adapter,
+ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
+                                    struct e1000_rx_ring *rx_ring,
+                                    int *work_done, int work_to_do);
++static void e1000_alloc_dummy_rx_buffers(struct e1000_adapter *adapter,
++                                       struct e1000_rx_ring *rx_ring,
++                                       int cleaned_count)
++{
++}
+ static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
+                                  struct e1000_rx_ring *rx_ring,
+                                  int cleaned_count);
+@@ -3531,8 +3536,11 @@ static int e1000_change_mtu(struct net_device *netdev, 
int new_mtu)
+               msleep(1);
+       /* e1000_down has a dependency on max_frame_size */
+       hw->max_frame_size = max_frame;
+-      if (netif_running(netdev))
++      if (netif_running(netdev)) {
++              /* prevent buffers from being reallocated */
++              adapter->alloc_rx_buf = e1000_alloc_dummy_rx_buffers;
+               e1000_down(adapter);
++      }
+ 
+       /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
+        * means we reserve 2 more, this pushes us to allocate from the next
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c 
b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+index f58316769159..66c92a16da29 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+@@ -314,6 +314,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
+       {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/
+       {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/
+       {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/
++      {RTL_USB_DEVICE(0x0b05, 0x17ba, rtl92cu_hal_cfg)}, /*ASUS-Edimax*/
+       {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/
+       {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
+       {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
+@@ -370,6 +371,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
+       {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/
+       {RTL_USB_DEVICE(0x2001, 0x3309, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/
+       {RTL_USB_DEVICE(0x2001, 0x330a, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/
++      {RTL_USB_DEVICE(0x2001, 0x330d, rtl92cu_hal_cfg)}, /*D-Link DWA-131 */
+       {RTL_USB_DEVICE(0x2019, 0xab2b, rtl92cu_hal_cfg)}, /*Planex -Abocom*/
+       {RTL_USB_DEVICE(0x20f4, 0x624d, rtl92cu_hal_cfg)}, /*TRENDNet*/
+       {RTL_USB_DEVICE(0x2357, 0x0100, rtl92cu_hal_cfg)}, /*TP-Link WN8200ND*/
+diff --git a/drivers/net/wireless/ti/wl18xx/debugfs.c 
b/drivers/net/wireless/ti/wl18xx/debugfs.c
+index 7f1669cdea09..779dc2b2ca75 100644
+--- a/drivers/net/wireless/ti/wl18xx/debugfs.c
++++ b/drivers/net/wireless/ti/wl18xx/debugfs.c
+@@ -136,7 +136,7 @@ WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, 
"%u");
+ WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u");
+ WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u");
+ 
+-WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u");
++WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50);
+ 
+ WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_vs_rate,
+                                 AGGR_STATS_TX_AGG*AGGR_STATS_TX_RATE);
+diff --git a/drivers/net/wireless/ti/wlcore/debugfs.h 
b/drivers/net/wireless/ti/wlcore/debugfs.h
+index f7381dd69009..1bce4325e86b 100644
+--- a/drivers/net/wireless/ti/wlcore/debugfs.h
++++ b/drivers/net/wireless/ti/wlcore/debugfs.h
+@@ -26,8 +26,8 @@
+ 
+ #include "wlcore.h"
+ 
+-int wl1271_format_buffer(char __user *userbuf, size_t count,
+-                       loff_t *ppos, char *fmt, ...);
++__printf(4, 5) int wl1271_format_buffer(char __user *userbuf, size_t count,
++                                      loff_t *ppos, char *fmt, ...);
+ 
+ int wl1271_debugfs_init(struct wl1271 *wl);
+ void wl1271_debugfs_exit(struct wl1271 *wl);
+diff --git a/drivers/platform/x86/compal-laptop.c 
b/drivers/platform/x86/compal-laptop.c
+index 7297df2ebf50..2d9d1985adc1 100644
+--- a/drivers/platform/x86/compal-laptop.c
++++ b/drivers/platform/x86/compal-laptop.c
+@@ -1037,7 +1037,9 @@ static int compal_probe(struct platform_device *pdev)
+ 
+       /* Power supply */
+       initialize_power_supply_data(data);
+-      power_supply_register(&compal_device->dev, &data->psy);
++      err = power_supply_register(&compal_device->dev, &data->psy);
++      if (err < 0)
++              goto remove;
+ 
+       platform_set_drvdata(pdev, data);
+ 
+diff --git a/drivers/power/lp8788-charger.c b/drivers/power/lp8788-charger.c
+index ed49b50b220b..72da2a6c22db 100644
+--- a/drivers/power/lp8788-charger.c
++++ b/drivers/power/lp8788-charger.c
+@@ -417,8 +417,10 @@ static int lp8788_psy_register(struct platform_device 
*pdev,
+       pchg->battery.num_properties = ARRAY_SIZE(lp8788_battery_prop);
+       pchg->battery.get_property = lp8788_battery_get_property;
+ 
+-      if (power_supply_register(&pdev->dev, &pchg->battery))
++      if (power_supply_register(&pdev->dev, &pchg->battery)) {
++              power_supply_unregister(&pchg->charger);
+               return -EPERM;
++      }
+ 
+       return 0;
+ }
+diff --git a/drivers/power/twl4030_madc_battery.c 
b/drivers/power/twl4030_madc_battery.c
+index 7ef445a6cfa6..cf907609ec49 100644
+--- a/drivers/power/twl4030_madc_battery.c
++++ b/drivers/power/twl4030_madc_battery.c
+@@ -192,6 +192,7 @@ static int twl4030_madc_battery_probe(struct 
platform_device *pdev)
+ {
+       struct twl4030_madc_battery *twl4030_madc_bat;
+       struct twl4030_madc_bat_platform_data *pdata = pdev->dev.platform_data;
++      int ret = 0;
+ 
+       twl4030_madc_bat = kzalloc(sizeof(*twl4030_madc_bat), GFP_KERNEL);
+       if (!twl4030_madc_bat)
+@@ -216,9 +217,11 @@ static int twl4030_madc_battery_probe(struct 
platform_device *pdev)
+ 
+       twl4030_madc_bat->pdata = pdata;
+       platform_set_drvdata(pdev, twl4030_madc_bat);
+-      power_supply_register(&pdev->dev, &twl4030_madc_bat->psy);
++      ret = power_supply_register(&pdev->dev, &twl4030_madc_bat->psy);
++      if (ret < 0)
++              kfree(twl4030_madc_bat);
+ 
+-      return 0;
++      return ret;
+ }
+ 
+ static int twl4030_madc_battery_remove(struct platform_device *pdev)
+diff --git a/drivers/scsi/bfa/bfa_ioc.c b/drivers/scsi/bfa/bfa_ioc.c
+index 65180e15de6e..50c75e1fbf8a 100644
+--- a/drivers/scsi/bfa/bfa_ioc.c
++++ b/drivers/scsi/bfa/bfa_ioc.c
+@@ -7006,7 +7006,7 @@ bfa_flash_sem_get(void __iomem *bar)
+       while (!bfa_raw_sem_get(bar)) {
+               if (--n <= 0)
+                       return BFA_STATUS_BADFLASH;
+-              udelay(10000);
++              mdelay(10);
+       }
+       return BFA_STATUS_OK;
+ }
+diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
+index 6c1f223a8e1d..4c0b8b4e1d40 100644
+--- a/drivers/scsi/mvsas/mv_sas.c
++++ b/drivers/scsi/mvsas/mv_sas.c
+@@ -441,14 +441,11 @@ static u32 mvs_get_ncq_tag(struct sas_task *task, u32 
*tag)
+ static int mvs_task_prep_ata(struct mvs_info *mvi,
+                            struct mvs_task_exec_info *tei)
+ {
+-      struct sas_ha_struct *sha = mvi->sas;
+       struct sas_task *task = tei->task;
+       struct domain_device *dev = task->dev;
+       struct mvs_device *mvi_dev = dev->lldd_dev;
+       struct mvs_cmd_hdr *hdr = tei->hdr;
+       struct asd_sas_port *sas_port = dev->port;
+-      struct sas_phy *sphy = dev->phy;
+-      struct asd_sas_phy *sas_phy = sha->sas_phy[sphy->number];
+       struct mvs_slot_info *slot;
+       void *buf_prd;
+       u32 tag = tei->tag, hdr_tag;
+@@ -468,7 +465,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
+       slot->tx = mvi->tx_prod;
+       del_q = TXQ_MODE_I | tag |
+               (TXQ_CMD_STP << TXQ_CMD_SHIFT) |
+-              (MVS_PHY_ID << TXQ_PHY_SHIFT) |
++              ((sas_port->phy_mask & TXQ_PHY_MASK) << TXQ_PHY_SHIFT) |
+               (mvi_dev->taskfileset << TXQ_SRS_SHIFT);
+       mvi->tx[mvi->tx_prod] = cpu_to_le32(del_q);
+ 
+diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
+index 86b05151fdab..97892f258043 100644
+--- a/drivers/scsi/storvsc_drv.c
++++ b/drivers/scsi/storvsc_drv.c
+@@ -739,21 +739,22 @@ static unsigned int copy_to_bounce_buffer(struct 
scatterlist *orig_sgl,
+                       if (bounce_sgl[j].length == PAGE_SIZE) {
+                               /* full..move to next entry */
+                               sg_kunmap_atomic(bounce_addr);
++                              bounce_addr = 0;
+                               j++;
++                      }
+ 
+-                              /* if we need to use another bounce buffer */
+-                              if (srclen || i != orig_sgl_count - 1)
+-                                      bounce_addr = 
sg_kmap_atomic(bounce_sgl,j);
++                      /* if we need to use another bounce buffer */
++                      if (srclen && bounce_addr == 0)
++                              bounce_addr = sg_kmap_atomic(bounce_sgl, j);
+ 
+-                      } else if (srclen == 0 && i == orig_sgl_count - 1) {
+-                              /* unmap the last bounce that is < PAGE_SIZE */
+-                              sg_kunmap_atomic(bounce_addr);
+-                      }
+               }
+ 
+               sg_kunmap_atomic(src_addr - orig_sgl[i].offset);
+       }
+ 
++      if (bounce_addr)
++              sg_kunmap_atomic(bounce_addr);
++
+       local_irq_restore(flags);
+ 
+       return total_copied;
+diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
+index d7c6e36021e8..2fe5b61d886a 100644
+--- a/drivers/spi/spidev.c
++++ b/drivers/spi/spidev.c
+@@ -243,7 +243,10 @@ static int spidev_message(struct spidev_data *spidev,
+               k_tmp->len = u_tmp->len;
+ 
+               total += k_tmp->len;
+-              if (total > bufsiz) {
++              /* Check total length of transfers.  Also check each
++               * transfer length to avoid arithmetic overflow.
++               */
++              if (total > bufsiz || k_tmp->len > bufsiz) {
+                       status = -EMSGSIZE;
+                       goto done;
+               }
+diff --git a/drivers/target/target_core_file.c 
b/drivers/target/target_core_file.c
+index 41eff7d64cb8..b199f1e21d0e 100644
+--- a/drivers/target/target_core_file.c
++++ b/drivers/target/target_core_file.c
+@@ -263,40 +263,32 @@ static int fd_do_prot_rw(struct se_cmd *cmd, struct 
fd_prot *fd_prot,
+       struct se_device *se_dev = cmd->se_dev;
+       struct fd_dev *dev = FD_DEV(se_dev);
+       struct file *prot_fd = dev->fd_prot_file;
+-      struct scatterlist *sg;
+       loff_t pos = (cmd->t_task_lba * se_dev->prot_length);
+       unsigned char *buf;
+-      u32 prot_size, len, size;
+-      int rc, ret = 1, i;
++      u32 prot_size;
++      int rc, ret = 1;
+ 
+       prot_size = (cmd->data_length / se_dev->dev_attrib.block_size) *
+                    se_dev->prot_length;
+ 
+       if (!is_write) {
+-              fd_prot->prot_buf = vzalloc(prot_size);
++              fd_prot->prot_buf = kzalloc(prot_size, GFP_KERNEL);
+               if (!fd_prot->prot_buf) {
+                       pr_err("Unable to allocate fd_prot->prot_buf\n");
+                       return -ENOMEM;
+               }
+               buf = fd_prot->prot_buf;
+ 
+-              fd_prot->prot_sg_nents = cmd->t_prot_nents;
+-              fd_prot->prot_sg = kzalloc(sizeof(struct scatterlist) *
+-                                         fd_prot->prot_sg_nents, GFP_KERNEL);
++              fd_prot->prot_sg_nents = 1;
++              fd_prot->prot_sg = kzalloc(sizeof(struct scatterlist),
++                                         GFP_KERNEL);
+               if (!fd_prot->prot_sg) {
+                       pr_err("Unable to allocate fd_prot->prot_sg\n");
+-                      vfree(fd_prot->prot_buf);
++                      kfree(fd_prot->prot_buf);
+                       return -ENOMEM;
+               }
+-              size = prot_size;
+-
+-              for_each_sg(fd_prot->prot_sg, sg, fd_prot->prot_sg_nents, i) {
+-
+-                      len = min_t(u32, PAGE_SIZE, size);
+-                      sg_set_buf(sg, buf, len);
+-                      size -= len;
+-                      buf += len;
+-              }
++              sg_init_table(fd_prot->prot_sg, fd_prot->prot_sg_nents);
++              sg_set_buf(fd_prot->prot_sg, buf, prot_size);
+       }
+ 
+       if (is_write) {
+@@ -317,7 +309,7 @@ static int fd_do_prot_rw(struct se_cmd *cmd, struct 
fd_prot *fd_prot,
+ 
+       if (is_write || ret < 0) {
+               kfree(fd_prot->prot_sg);
+-              vfree(fd_prot->prot_buf);
++              kfree(fd_prot->prot_buf);
+       }
+ 
+       return ret;
+@@ -652,11 +644,11 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist 
*sgl, u32 sgl_nents,
+                                                0, fd_prot.prot_sg, 0);
+                       if (rc) {
+                               kfree(fd_prot.prot_sg);
+-                              vfree(fd_prot.prot_buf);
++                              kfree(fd_prot.prot_buf);
+                               return rc;
+                       }
+                       kfree(fd_prot.prot_sg);
+-                      vfree(fd_prot.prot_buf);
++                      kfree(fd_prot.prot_buf);
+               }
+       } else {
+               memset(&fd_prot, 0, sizeof(struct fd_prot));
+@@ -672,7 +664,7 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, 
u32 sgl_nents,
+                                                 0, fd_prot.prot_sg, 0);
+                       if (rc) {
+                               kfree(fd_prot.prot_sg);
+-                              vfree(fd_prot.prot_buf);
++                              kfree(fd_prot.prot_buf);
+                               return rc;
+                       }
+               }
+@@ -703,7 +695,7 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, 
u32 sgl_nents,
+ 
+       if (ret < 0) {
+               kfree(fd_prot.prot_sg);
+-              vfree(fd_prot.prot_buf);
++              kfree(fd_prot.prot_buf);
+               return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
+       }
+ 
+diff --git a/drivers/target/target_core_sbc.c 
b/drivers/target/target_core_sbc.c
+index 68511e83486b..f89b24a09b19 100644
+--- a/drivers/target/target_core_sbc.c
++++ b/drivers/target/target_core_sbc.c
+@@ -314,7 +314,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char 
*flags, struct sbc_ops *o
+       return 0;
+ }
+ 
+-static sense_reason_t xdreadwrite_callback(struct se_cmd *cmd)
++static sense_reason_t xdreadwrite_callback(struct se_cmd *cmd, bool success)
+ {
+       unsigned char *buf, *addr;
+       struct scatterlist *sg;
+@@ -378,7 +378,7 @@ sbc_execute_rw(struct se_cmd *cmd)
+                              cmd->data_direction);
+ }
+ 
+-static sense_reason_t compare_and_write_post(struct se_cmd *cmd)
++static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success)
+ {
+       struct se_device *dev = cmd->se_dev;
+ 
+@@ -401,7 +401,7 @@ static sense_reason_t compare_and_write_post(struct se_cmd 
*cmd)
+       return TCM_NO_SENSE;
+ }
+ 
+-static sense_reason_t compare_and_write_callback(struct se_cmd *cmd)
++static sense_reason_t compare_and_write_callback(struct se_cmd *cmd, bool 
success)
+ {
+       struct se_device *dev = cmd->se_dev;
+       struct scatterlist *write_sg = NULL, *sg;
+@@ -416,11 +416,16 @@ static sense_reason_t compare_and_write_callback(struct 
se_cmd *cmd)
+ 
+       /*
+        * Handle early failure in transport_generic_request_failure(),
+-       * which will not have taken ->caw_mutex yet..
++       * which will not have taken ->caw_sem yet..
+        */
+-      if (!cmd->t_data_sg || !cmd->t_bidi_data_sg)
++      if (!success && (!cmd->t_data_sg || !cmd->t_bidi_data_sg))
+               return TCM_NO_SENSE;
+       /*
++       * Handle special case for zero-length COMPARE_AND_WRITE
++       */
++      if (!cmd->data_length)
++              goto out;
++      /*
+        * Immediately exit + release dev->caw_sem if command has already
+        * been failed with a non-zero SCSI status.
+        */
+diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
+index 9e54c0fe718d..6fc38903046c 100644
+--- a/drivers/target/target_core_transport.c
++++ b/drivers/target/target_core_transport.c
+@@ -1600,11 +1600,11 @@ void transport_generic_request_failure(struct se_cmd 
*cmd,
+       transport_complete_task_attr(cmd);
+       /*
+        * Handle special case for COMPARE_AND_WRITE failure, where the
+-       * callback is expected to drop the per device ->caw_mutex.
++       * callback is expected to drop the per device ->caw_sem.
+        */
+       if ((cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) &&
+            cmd->transport_complete_callback)
+-              cmd->transport_complete_callback(cmd);
++              cmd->transport_complete_callback(cmd, false);
+ 
+       switch (sense_reason) {
+       case TCM_NON_EXISTENT_LUN:
+@@ -1941,8 +1941,12 @@ static void target_complete_ok_work(struct work_struct 
*work)
+       if (cmd->transport_complete_callback) {
+               sense_reason_t rc;
+ 
+-              rc = cmd->transport_complete_callback(cmd);
++              rc = cmd->transport_complete_callback(cmd, true);
+               if (!rc && !(cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE_POST)) {
++                      if ((cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) &&
++                          !cmd->data_length)
++                              goto queue_rsp;
++
+                       return;
+               } else if (rc) {
+                       ret = transport_send_check_condition_and_sense(cmd,
+@@ -1956,6 +1960,7 @@ static void target_complete_ok_work(struct work_struct 
*work)
+               }
+       }
+ 
++queue_rsp:
+       switch (cmd->data_direction) {
+       case DMA_FROM_DEVICE:
+               spin_lock(&cmd->se_lun->lun_sep_lock);
+@@ -2044,6 +2049,16 @@ static inline void transport_reset_sgl_orig(struct 
se_cmd *cmd)
+ static inline void transport_free_pages(struct se_cmd *cmd)
+ {
+       if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) {
++              /*
++               * Release special case READ buffer payload required for
++               * SG_TO_MEM_NOALLOC to function with COMPARE_AND_WRITE
++               */
++              if (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) {
++                      transport_free_sgl(cmd->t_bidi_data_sg,
++                                         cmd->t_bidi_data_nents);
++                      cmd->t_bidi_data_sg = NULL;
++                      cmd->t_bidi_data_nents = 0;
++              }
+               transport_reset_sgl_orig(cmd);
+               return;
+       }
+@@ -2192,6 +2207,7 @@ sense_reason_t
+ transport_generic_new_cmd(struct se_cmd *cmd)
+ {
+       int ret = 0;
++      bool zero_flag = !(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB);
+ 
+       /*
+        * Determine is the TCM fabric module has already allocated physical
+@@ -2200,7 +2216,6 @@ transport_generic_new_cmd(struct se_cmd *cmd)
+        */
+       if (!(cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) &&
+           cmd->data_length) {
+-              bool zero_flag = !(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB);
+ 
+               if ((cmd->se_cmd_flags & SCF_BIDI) ||
+                   (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE)) {
+@@ -2223,6 +2238,20 @@ transport_generic_new_cmd(struct se_cmd *cmd)
+                                      cmd->data_length, zero_flag);
+               if (ret < 0)
+                       return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
++      } else if ((cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) &&
++                  cmd->data_length) {
++              /*
++               * Special case for COMPARE_AND_WRITE with fabrics
++               * using SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC.
++               */
++              u32 caw_length = cmd->t_task_nolb *
++                               cmd->se_dev->dev_attrib.block_size;
++
++              ret = target_alloc_sgl(&cmd->t_bidi_data_sg,
++                                     &cmd->t_bidi_data_nents,
++                                     caw_length, zero_flag);
++              if (ret < 0)
++                      return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
+       }
+       /*
+        * If this command is not a write we can execute it right here,
+diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
+index a051a7a2b1bd..a81f9dd7ee97 100644
+--- a/drivers/usb/class/cdc-wdm.c
++++ b/drivers/usb/class/cdc-wdm.c
+@@ -245,7 +245,7 @@ static void wdm_int_callback(struct urb *urb)
+       case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
+               dev_dbg(&desc->intf->dev,
+                       "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d",
+-                      dr->wIndex, dr->wLength);
++                      le16_to_cpu(dr->wIndex), le16_to_cpu(dr->wLength));
+               break;
+ 
+       case USB_CDC_NOTIFY_NETWORK_CONNECTION:
+@@ -262,7 +262,9 @@ static void wdm_int_callback(struct urb *urb)
+               clear_bit(WDM_POLL_RUNNING, &desc->flags);
+               dev_err(&desc->intf->dev,
+                       "unknown notification %d received: index %d len %d\n",
+-                      dr->bNotificationType, dr->wIndex, dr->wLength);
++                      dr->bNotificationType,
++                      le16_to_cpu(dr->wIndex),
++                      le16_to_cpu(dr->wLength));
+               goto exit;
+       }
+ 
+@@ -408,7 +410,7 @@ static ssize_t wdm_write
+                            USB_RECIP_INTERFACE);
+       req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
+       req->wValue = 0;
+-      req->wIndex = desc->inum;
++      req->wIndex = desc->inum; /* already converted */
+       req->wLength = cpu_to_le16(count);
+       set_bit(WDM_IN_USE, &desc->flags);
+       desc->outbuf = buf;
+@@ -422,7 +424,7 @@ static ssize_t wdm_write
+               rv = usb_translate_errors(rv);
+       } else {
+               dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
+-                      req->wIndex);
++                      le16_to_cpu(req->wIndex));
+       }
+ out:
+       usb_autopm_put_interface(desc->intf);
+@@ -820,7 +822,7 @@ static int wdm_create(struct usb_interface *intf, struct 
usb_endpoint_descriptor
+       desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | 
USB_RECIP_INTERFACE);
+       desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
+       desc->irq->wValue = 0;
+-      desc->irq->wIndex = desc->inum;
++      desc->irq->wIndex = desc->inum; /* already converted */
+       desc->irq->wLength = cpu_to_le16(desc->wMaxCommand);
+ 
+       usb_fill_control_urb(
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index d2bd9d7c8f4b..1847a7d38026 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -3289,10 +3289,10 @@ int usb_port_resume(struct usb_device *udev, 
pm_message_t msg)
+               dev_dbg(hub->intfdev, "can't resume port %d, status %d\n",
+                               port1, status);
+       } else {
+-              /* drive resume for at least 20 msec */
++              /* drive resume for USB_RESUME_TIMEOUT msec */
+               dev_dbg(&udev->dev, "usb %sresume\n",
+                               (PMSG_IS_AUTO(msg) ? "auto-" : ""));
+-              msleep(25);
++              msleep(USB_RESUME_TIMEOUT);
+ 
+               /* Virtual root hubs can trigger on GET_PORT_STATUS to
+                * stop resume signaling.  Then finish the resume
+diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
+index 4d918ed8d343..0f9980088c08 100644
+--- a/drivers/usb/dwc2/hcd.c
++++ b/drivers/usb/dwc2/hcd.c
+@@ -1501,7 +1501,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg 
*hsotg, u16 typereq,
+                       dev_dbg(hsotg->dev,
+                               "ClearPortFeature USB_PORT_FEAT_SUSPEND\n");
+                       writel(0, hsotg->regs + PCGCTL);
+-                      usleep_range(20000, 40000);
++                      msleep(USB_RESUME_TIMEOUT);
+ 
+                       hprt0 = dwc2_read_hprt0(hsotg);
+                       hprt0 |= HPRT0_RES;
+diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
+index d742bed7a5fa..82df926c765d 100644
+--- a/drivers/usb/gadget/composite.c
++++ b/drivers/usb/gadget/composite.c
+@@ -528,7 +528,7 @@ static int bos_desc(struct usb_composite_dev *cdev)
+       usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE;
+       usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY;
+       usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT;
+-      usb_ext->bmAttributes = cpu_to_le32(USB_LPM_SUPPORT);
++      usb_ext->bmAttributes = cpu_to_le32(USB_LPM_SUPPORT | USB_BESL_SUPPORT);
+ 
+       /*
+        * The Superspeed USB Capability descriptor shall be implemented by all
+diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c
+index 98a89d16cc3e..8aa4ba0a0c69 100644
+--- a/drivers/usb/host/fotg210-hcd.c
++++ b/drivers/usb/host/fotg210-hcd.c
+@@ -1595,7 +1595,7 @@ static int fotg210_hub_control(
+                       /* resume signaling for 20 msec */
+                       fotg210_writel(fotg210, temp | PORT_RESUME, status_reg);
+                       fotg210->reset_done[wIndex] = jiffies
+-                                      + msecs_to_jiffies(20);
++                                      + msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                       break;
+               case USB_PORT_FEAT_C_SUSPEND:
+                       clear_bit(wIndex, &fotg210->port_c_suspend);
+diff --git a/drivers/usb/host/fusbh200-hcd.c b/drivers/usb/host/fusbh200-hcd.c
+index ba9499060f63..3e3926aa584e 100644
+--- a/drivers/usb/host/fusbh200-hcd.c
++++ b/drivers/usb/host/fusbh200-hcd.c
+@@ -1550,10 +1550,9 @@ static int fusbh200_hub_control (
+                       if ((temp & PORT_PE) == 0)
+                               goto error;
+ 
+-                      /* resume signaling for 20 msec */
+                       fusbh200_writel(fusbh200, temp | PORT_RESUME, 
status_reg);
+                       fusbh200->reset_done[wIndex] = jiffies
+-                                      + msecs_to_jiffies(20);
++                                      + msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                       break;
+               case USB_PORT_FEAT_C_SUSPEND:
+                       clear_bit(wIndex, &fusbh200->port_c_suspend);
+diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c
+index 240e792c81a7..b62298fe0be8 100644
+--- a/drivers/usb/host/isp116x-hcd.c
++++ b/drivers/usb/host/isp116x-hcd.c
+@@ -1487,7 +1487,7 @@ static int isp116x_bus_resume(struct usb_hcd *hcd)
+       spin_unlock_irq(&isp116x->lock);
+ 
+       hcd->state = HC_STATE_RESUMING;
+-      msleep(20);
++      msleep(USB_RESUME_TIMEOUT);
+ 
+       /* Go operational */
+       spin_lock_irq(&isp116x->lock);
+diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
+index 110b4b9ebeaa..f130bb2f7bbe 100644
+--- a/drivers/usb/host/r8a66597-hcd.c
++++ b/drivers/usb/host/r8a66597-hcd.c
+@@ -2300,7 +2300,7 @@ static int r8a66597_bus_resume(struct usb_hcd *hcd)
+               rh->port &= ~USB_PORT_STAT_SUSPEND;
+               rh->port |= USB_PORT_STAT_C_SUSPEND << 16;
+               r8a66597_mdfy(r8a66597, RESUME, RESUME | UACT, dvstctr_reg);
+-              msleep(50);
++              msleep(USB_RESUME_TIMEOUT);
+               r8a66597_mdfy(r8a66597, UACT, RESUME | UACT, dvstctr_reg);
+       }
+ 
+diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c
+index a517151867af..0f53cc8c8ecf 100644
+--- a/drivers/usb/host/sl811-hcd.c
++++ b/drivers/usb/host/sl811-hcd.c
+@@ -1259,7 +1259,7 @@ sl811h_hub_control(
+                       sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1);
+ 
+                       mod_timer(&sl811->timer, jiffies
+-                                      + msecs_to_jiffies(20));
++                                      + msecs_to_jiffies(USB_RESUME_TIMEOUT));
+                       break;
+               case USB_PORT_FEAT_POWER:
+                       port_power(sl811, 0);
+diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c
+index 93e17b12fb33..98c66d88ebde 100644
+--- a/drivers/usb/host/uhci-hub.c
++++ b/drivers/usb/host/uhci-hub.c
+@@ -165,7 +165,7 @@ static void uhci_check_ports(struct uhci_hcd *uhci)
+                               /* Port received a wakeup request */
+                               set_bit(port, &uhci->resuming_ports);
+                               uhci->ports_timeout = jiffies +
+-                                              msecs_to_jiffies(25);
++                                      msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                               usb_hcd_start_port_resume(
+                                               &uhci_to_hcd(uhci)->self, port);
+ 
+@@ -337,7 +337,8 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 
typeReq, u16 wValue,
+                       uhci_finish_suspend(uhci, port, port_addr);
+ 
+                       /* USB v2.0 7.1.7.5 */
+-                      uhci->ports_timeout = jiffies + msecs_to_jiffies(50);
++                      uhci->ports_timeout = jiffies +
++                              msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                       break;
+               case USB_PORT_FEAT_POWER:
+                       /* UHCI has no power switching */
+diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
+index a95eee8ddc38..05185b9d4495 100644
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -1768,7 +1768,7 @@ static void handle_port_status(struct xhci_hcd *xhci,
+               } else {
+                       xhci_dbg(xhci, "resume HS port %d\n", port_id);
+                       bus_state->resume_done[faked_port_index] = jiffies +
+-                              msecs_to_jiffies(20);
++                              msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                       set_bit(faked_port_index, &bus_state->resuming_ports);
+                       mod_timer(&hcd->rh_timer,
+                                 bus_state->resume_done[faked_port_index]);
+diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c
+index 0180eef05656..964ebafe8b44 100644
+--- a/drivers/usb/phy/phy.c
++++ b/drivers/usb/phy/phy.c
+@@ -78,7 +78,9 @@ static void devm_usb_phy_release(struct device *dev, void 
*res)
+ 
+ static int devm_usb_phy_match(struct device *dev, void *res, void *match_data)
+ {
+-      return res == match_data;
++      struct usb_phy **phy = res;
++
++      return *phy == match_data;
+ }
+ 
+ /**
+diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
+index f4d7b2fc9ffb..78f46089a077 100644
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -751,6 +751,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
+           i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
+               int elf_prot = 0, elf_flags;
+               unsigned long k, vaddr;
++              unsigned long total_size = 0;
+ 
+               if (elf_ppnt->p_type != PT_LOAD)
+                       continue;
+@@ -815,10 +816,16 @@ static int load_elf_binary(struct linux_binprm *bprm)
+ #else
+                       load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
+ #endif
++                      total_size = total_mapping_size(elf_phdata,
++                                                      loc->elf_ex.e_phnum);
++                      if (!total_size) {
++                              error = -EINVAL;
++                              goto out_free_dentry;
++                      }
+               }
+ 
+               error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
+-                              elf_prot, elf_flags, 0);
++                              elf_prot, elf_flags, total_size);
+               if (BAD_ADDR(error)) {
+                       send_sig(SIGKILL, current, 0);
+                       retval = IS_ERR((void *)error) ?
+diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
+index d2f1c011d73a..794d7c6ea9ee 100644
+--- a/fs/btrfs/extent-tree.c
++++ b/fs/btrfs/extent-tree.c
+@@ -6645,12 +6645,11 @@ static int __btrfs_free_reserved_extent(struct 
btrfs_root *root,
+               return -ENOSPC;
+       }
+ 
+-      if (btrfs_test_opt(root, DISCARD))
+-              ret = btrfs_discard_extent(root, start, len, NULL);
+-
+       if (pin)
+               pin_down_extent(root, cache, start, len, 1);
+       else {
++              if (btrfs_test_opt(root, DISCARD))
++                      ret = btrfs_discard_extent(root, start, len, NULL);
+               btrfs_add_free_space(cache, start, len);
+               btrfs_update_reserved_bytes(cache, len, RESERVE_FREE);
+       }
+diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
+index 0b72006aecbe..3e16042338e4 100644
+--- a/fs/btrfs/ioctl.c
++++ b/fs/btrfs/ioctl.c
+@@ -2708,6 +2708,9 @@ static int btrfs_extent_same(struct inode *src, u64 
loff, u64 len,
+       if (src == dst)
+               return -EINVAL;
+ 
++      if (len == 0)
++              return 0;
++
+       btrfs_double_lock(src, loff, dst, dst_loff, len);
+ 
+       ret = extent_same_check_offsets(src, loff, len);
+@@ -3226,6 +3229,11 @@ static noinline long btrfs_ioctl_clone(struct file 
*file, unsigned long srcfd,
+       if (off + len == src->i_size)
+               len = ALIGN(src->i_size, bs) - off;
+ 
++      if (len == 0) {
++              ret = 0;
++              goto out_unlock;
++      }
++
+       /* verify the end result is block aligned */
+       if (!IS_ALIGNED(off, bs) || !IS_ALIGNED(off + len, bs) ||
+           !IS_ALIGNED(destoff, bs))
+diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
+index ad8328d797ea..488e987c3374 100644
+--- a/fs/btrfs/xattr.c
++++ b/fs/btrfs/xattr.c
+@@ -324,22 +324,42 @@ const struct xattr_handler *btrfs_xattr_handlers[] = {
+ /*
+  * Check if the attribute is in a supported namespace.
+  *
+- * This applied after the check for the synthetic attributes in the system
++ * This is applied after the check for the synthetic attributes in the system
+  * namespace.
+  */
+-static bool btrfs_is_valid_xattr(const char *name)
++static int btrfs_is_valid_xattr(const char *name)
+ {
+-      return !strncmp(name, XATTR_SECURITY_PREFIX,
+-                      XATTR_SECURITY_PREFIX_LEN) ||
+-             !strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) ||
+-             !strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) ||
+-             !strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) ||
+-              !strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN);
++      int len = strlen(name);
++      int prefixlen = 0;
++
++      if (!strncmp(name, XATTR_SECURITY_PREFIX,
++                      XATTR_SECURITY_PREFIX_LEN))
++              prefixlen = XATTR_SECURITY_PREFIX_LEN;
++      else if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
++              prefixlen = XATTR_SYSTEM_PREFIX_LEN;
++      else if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN))
++              prefixlen = XATTR_TRUSTED_PREFIX_LEN;
++      else if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN))
++              prefixlen = XATTR_USER_PREFIX_LEN;
++      else if (!strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN))
++              prefixlen = XATTR_BTRFS_PREFIX_LEN;
++      else
++              return -EOPNOTSUPP;
++
++      /*
++       * The name cannot consist of just prefix
++       */
++      if (len <= prefixlen)
++              return -EINVAL;
++
++      return 0;
+ }
+ 
+ ssize_t btrfs_getxattr(struct dentry *dentry, const char *name,
+                      void *buffer, size_t size)
+ {
++      int ret;
++
+       /*
+        * If this is a request for a synthetic attribute in the system.*
+        * namespace use the generic infrastructure to resolve a handler
+@@ -348,8 +368,9 @@ ssize_t btrfs_getxattr(struct dentry *dentry, const char 
*name,
+       if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
+               return generic_getxattr(dentry, name, buffer, size);
+ 
+-      if (!btrfs_is_valid_xattr(name))
+-              return -EOPNOTSUPP;
++      ret = btrfs_is_valid_xattr(name);
++      if (ret)
++              return ret;
+       return __btrfs_getxattr(dentry->d_inode, name, buffer, size);
+ }
+ 
+@@ -357,6 +378,7 @@ int btrfs_setxattr(struct dentry *dentry, const char 
*name, const void *value,
+                  size_t size, int flags)
+ {
+       struct btrfs_root *root = BTRFS_I(dentry->d_inode)->root;
++      int ret;
+ 
+       /*
+        * The permission on security.* and system.* is not checked
+@@ -373,8 +395,9 @@ int btrfs_setxattr(struct dentry *dentry, const char 
*name, const void *value,
+       if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
+               return generic_setxattr(dentry, name, value, size, flags);
+ 
+-      if (!btrfs_is_valid_xattr(name))
+-              return -EOPNOTSUPP;
++      ret = btrfs_is_valid_xattr(name);
++      if (ret)
++              return ret;
+ 
+       if (!strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN))
+               return btrfs_set_prop(dentry->d_inode, name,
+@@ -390,6 +413,7 @@ int btrfs_setxattr(struct dentry *dentry, const char 
*name, const void *value,
+ int btrfs_removexattr(struct dentry *dentry, const char *name)
+ {
+       struct btrfs_root *root = BTRFS_I(dentry->d_inode)->root;
++      int ret;
+ 
+       /*
+        * The permission on security.* and system.* is not checked
+@@ -406,8 +430,9 @@ int btrfs_removexattr(struct dentry *dentry, const char 
*name)
+       if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
+               return generic_removexattr(dentry, name);
+ 
+-      if (!btrfs_is_valid_xattr(name))
+-              return -EOPNOTSUPP;
++      ret = btrfs_is_valid_xattr(name);
++      if (ret)
++              return ret;
+ 
+       if (!strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN))
+               return btrfs_set_prop(dentry->d_inode, name,
+diff --git a/fs/exec.c b/fs/exec.c
+index ea4449d0536a..05f1942d7edb 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1268,6 +1268,53 @@ static void check_unsafe_exec(struct linux_binprm *bprm)
+       spin_unlock(&p->fs->lock);
+ }
+ 
++static void bprm_fill_uid(struct linux_binprm *bprm)
++{
++      struct inode *inode;
++      unsigned int mode;
++      kuid_t uid;
++      kgid_t gid;
++
++      /* clear any previous set[ug]id data from a previous binary */
++      bprm->cred->euid = current_euid();
++      bprm->cred->egid = current_egid();
++
++      if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
++              return;
++
++      if (current->no_new_privs)
++              return;
++
++      inode = file_inode(bprm->file);
++      mode = ACCESS_ONCE(inode->i_mode);
++      if (!(mode & (S_ISUID|S_ISGID)))
++              return;
++
++      /* Be careful if suid/sgid is set */
++      mutex_lock(&inode->i_mutex);
++
++      /* reload atomically mode/uid/gid now that lock held */
++      mode = inode->i_mode;
++      uid = inode->i_uid;
++      gid = inode->i_gid;
++      mutex_unlock(&inode->i_mutex);
++
++      /* We ignore suid/sgid if there are no mappings for them in the ns */
++      if (!kuid_has_mapping(bprm->cred->user_ns, uid) ||
++               !kgid_has_mapping(bprm->cred->user_ns, gid))
++              return;
++
++      if (mode & S_ISUID) {
++              bprm->per_clear |= PER_CLEAR_ON_SETID;
++              bprm->cred->euid = uid;
++      }
++
++      if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
++              bprm->per_clear |= PER_CLEAR_ON_SETID;
++              bprm->cred->egid = gid;
++      }
++}
++
+ /*
+  * Fill the binprm structure from the inode.
+  * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
+@@ -1276,36 +1323,9 @@ static void check_unsafe_exec(struct linux_binprm *bprm)
+  */
+ int prepare_binprm(struct linux_binprm *bprm)
+ {
+-      struct inode *inode = file_inode(bprm->file);
+-      umode_t mode = inode->i_mode;
+       int retval;
+ 
+-
+-      /* clear any previous set[ug]id data from a previous binary */
+-      bprm->cred->euid = current_euid();
+-      bprm->cred->egid = current_egid();
+-
+-      if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) &&
+-          !current->no_new_privs &&
+-          kuid_has_mapping(bprm->cred->user_ns, inode->i_uid) &&
+-          kgid_has_mapping(bprm->cred->user_ns, inode->i_gid)) {
+-              /* Set-uid? */
+-              if (mode & S_ISUID) {
+-                      bprm->per_clear |= PER_CLEAR_ON_SETID;
+-                      bprm->cred->euid = inode->i_uid;
+-              }
+-
+-              /* Set-gid? */
+-              /*
+-               * If setgid is set but no group execute bit then this
+-               * is a candidate for mandatory locking, not a setgid
+-               * executable.
+-               */
+-              if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
+-                      bprm->per_clear |= PER_CLEAR_ON_SETID;
+-                      bprm->cred->egid = inode->i_gid;
+-              }
+-      }
++      bprm_fill_uid(bprm);
+ 
+       /* fill in binprm security blob */
+       retval = security_bprm_set_creds(bprm);
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index 2dcbfb6245d8..bc7e37bc0c5b 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -1869,7 +1869,7 @@ static int ext4_add_entry(handle_t *handle, struct 
dentry *dentry,
+                         struct inode *inode)
+ {
+       struct inode *dir = dentry->d_parent->d_inode;
+-      struct buffer_head *bh;
++      struct buffer_head *bh = NULL;
+       struct ext4_dir_entry_2 *de;
+       struct ext4_dir_entry_tail *t;
+       struct super_block *sb;
+@@ -1893,14 +1893,14 @@ static int ext4_add_entry(handle_t *handle, struct 
dentry *dentry,
+                       return retval;
+               if (retval == 1) {
+                       retval = 0;
+-                      return retval;
++                      goto out;
+               }
+       }
+ 
+       if (is_dx(dir)) {
+               retval = ext4_dx_add_entry(handle, dentry, inode);
+               if (!retval || (retval != ERR_BAD_DX_DIR))
+-                      return retval;
++                      goto out;
+               ext4_clear_inode_flag(dir, EXT4_INODE_INDEX);
+               dx_fallback++;
+               ext4_mark_inode_dirty(handle, dir);
+@@ -1912,14 +1912,15 @@ static int ext4_add_entry(handle_t *handle, struct 
dentry *dentry,
+                       return PTR_ERR(bh);
+ 
+               retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
+-              if (retval != -ENOSPC) {
+-                      brelse(bh);
+-                      return retval;
+-              }
++              if (retval != -ENOSPC)
++                      goto out;
+ 
+               if (blocks == 1 && !dx_fallback &&
+-                  EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX))
+-                      return make_indexed_dir(handle, dentry, inode, bh);
++                  EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) 
{
++                      retval = make_indexed_dir(handle, dentry, inode, bh);
++                      bh = NULL; /* make_indexed_dir releases bh */
++                      goto out;
++              }
+               brelse(bh);
+       }
+       bh = ext4_append(handle, dir, &block);
+@@ -1935,6 +1936,7 @@ static int ext4_add_entry(handle_t *handle, struct 
dentry *dentry,
+       }
+ 
+       retval = add_dirent_to_buf(handle, dentry, inode, de, bh);
++out:
+       brelse(bh);
+       if (retval == 0)
+               ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY);
+diff --git a/fs/namei.c b/fs/namei.c
+index 0dd72c8e65fd..ccb8000f3459 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -1545,7 +1545,8 @@ static inline int walk_component(struct nameidata *nd, 
struct path *path,
+ 
+       if (should_follow_link(path->dentry, follow)) {
+               if (nd->flags & LOOKUP_RCU) {
+-                      if (unlikely(unlazy_walk(nd, path->dentry))) {
++                      if (unlikely(nd->path.mnt != path->mnt ||
++                                   unlazy_walk(nd, path->dentry))) {
+                               err = -ECHILD;
+                               goto out_err;
+                       }
+@@ -2992,7 +2993,8 @@ finish_lookup:
+ 
+       if (should_follow_link(path->dentry, !symlink_ok)) {
+               if (nd->flags & LOOKUP_RCU) {
+-                      if (unlikely(unlazy_walk(nd, path->dentry))) {
++                      if (unlikely(nd->path.mnt != path->mnt ||
++                                   unlazy_walk(nd, path->dentry))) {
+                               error = -ECHILD;
+                               goto out;
+                       }
+diff --git a/fs/open.c b/fs/open.c
+index 2ed7325f713e..17679f2b2f1c 100644
+--- a/fs/open.c
++++ b/fs/open.c
+@@ -539,6 +539,7 @@ static int chown_common(struct path *path, uid_t user, 
gid_t group)
+       uid = make_kuid(current_user_ns(), user);
+       gid = make_kgid(current_user_ns(), group);
+ 
++retry_deleg:
+       newattrs.ia_valid =  ATTR_CTIME;
+       if (user != (uid_t) -1) {
+               if (!uid_valid(uid))
+@@ -555,7 +556,6 @@ static int chown_common(struct path *path, uid_t user, 
gid_t group)
+       if (!S_ISDIR(inode->i_mode))
+               newattrs.ia_valid |=
+                       ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
+-retry_deleg:
+       mutex_lock(&inode->i_mutex);
+       error = security_path_chown(path, uid, gid);
+       if (!error)
+diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
+index 68a3ada689c9..8fc12f80b616 100644
+--- a/include/acpi/actypes.h
++++ b/include/acpi/actypes.h
+@@ -198,9 +198,29 @@ typedef int INT32;
+ typedef s32 acpi_native_int;
+ 
+ typedef u32 acpi_size;
++
++#ifdef ACPI_32BIT_PHYSICAL_ADDRESS
++
++/*
++ * OSPMs can define this to shrink the size of the structures for 32-bit
++ * none PAE environment. ASL compiler may always define this to generate
++ * 32-bit OSPM compliant tables.
++ */
+ typedef u32 acpi_io_address;
+ typedef u32 acpi_physical_address;
+ 
++#else                         /* ACPI_32BIT_PHYSICAL_ADDRESS */
++
++/*
++ * It is reported that, after some calculations, the physical addresses can
++ * wrap over the 32-bit boundary on 32-bit PAE environment.
++ * https://bugzilla.kernel.org/show_bug.cgi?id=87971
++ */
++typedef u64 acpi_io_address;
++typedef u64 acpi_physical_address;
++
++#endif                                /* ACPI_32BIT_PHYSICAL_ADDRESS */
++
+ #define ACPI_MAX_PTR                    ACPI_UINT32_MAX
+ #define ACPI_SIZE_MAX                   ACPI_UINT32_MAX
+ 
+diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h
+index b402eb67af83..579912c7156c 100644
+--- a/include/acpi/platform/acenv.h
++++ b/include/acpi/platform/acenv.h
+@@ -76,6 +76,7 @@
+ #define ACPI_LARGE_NAMESPACE_NODE
+ #define ACPI_DATA_TABLE_DISASSEMBLY
+ #define ACPI_SINGLE_THREADED
++#define ACPI_32BIT_PHYSICAL_ADDRESS
+ #endif
+ 
+ /* acpi_exec configuration. Multithreaded with full AML debugger */
+diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
+index f1a24b5c3b90..b58fd667f87b 100644
+--- a/include/asm-generic/sections.h
++++ b/include/asm-generic/sections.h
+@@ -3,6 +3,8 @@
+ 
+ /* References to section boundaries */
+ 
++#include <linux/compiler.h>
++
+ /*
+  * Usage guidelines:
+  * _text, _data: architecture specific, don't use them in arch-independent 
code
+@@ -37,6 +39,8 @@ extern char __start_rodata[], __end_rodata[];
+ /* Start and end of .ctors section - used for constructor calls. */
+ extern char __ctors_start[], __ctors_end[];
+ 
++extern __visible const void __nosave_begin, __nosave_end;
++
+ /* function descriptor handling (if any).  Override
+  * in asm/sections.h */
+ #ifndef dereference_function_descriptor
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index ad8f85908a56..ab3133797ff7 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -661,6 +661,7 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff 
*from,
+ 
+ struct sk_buff *__alloc_skb(unsigned int size, gfp_t priority, int flags,
+                           int node);
++struct sk_buff *__build_skb(void *data, unsigned int frag_size);
+ struct sk_buff *build_skb(void *data, unsigned int frag_size);
+ static inline struct sk_buff *alloc_skb(unsigned int size,
+                                       gfp_t priority)
+diff --git a/include/linux/usb.h b/include/linux/usb.h
+index 7f6eb859873e..49466beab90d 100644
+--- a/include/linux/usb.h
++++ b/include/linux/usb.h
+@@ -206,6 +206,32 @@ void usb_put_intf(struct usb_interface *intf);
+ #define USB_MAXINTERFACES     32
+ #define USB_MAXIADS           (USB_MAXINTERFACES/2)
+ 
++/*
++ * USB Resume Timer: Every Host controller driver should drive the resume
++ * signalling on the bus for the amount of time defined by this macro.
++ *
++ * That way we will have a 'stable' behavior among all HCDs supported by 
Linux.
++ *
++ * Note that the USB Specification states we should drive resume for *at 
least*
++ * 20 ms, but it doesn't give an upper bound. This creates two possible
++ * situations which we want to avoid:
++ *
++ * (a) sometimes an msleep(20) might expire slightly before 20 ms, which 
causes
++ * us to fail USB Electrical Tests, thus failing Certification
++ *
++ * (b) Some (many) devices actually need more than 20 ms of resume signalling,
++ * and while we can argue that's against the USB Specification, we don't have
++ * control over which devices a certification laboratory will be using for
++ * certification. If CertLab uses a device which was tested against Windows 
and
++ * that happens to have relaxed resume signalling rules, we might fall into
++ * situations where we fail interoperability and electrical tests.
++ *
++ * In order to avoid both conditions, we're using a 40 ms resume timeout, 
which
++ * should cope with both LPJ calibration errors and devices not following 
every
++ * detail of the USB Specification.
++ */
++#define USB_RESUME_TIMEOUT    40 /* ms */
++
+ /**
+  * struct usb_interface_cache - long-term representation of a device interface
+  * @num_altsetting: number of altsettings defined.
+diff --git a/include/target/target_core_base.h 
b/include/target/target_core_base.h
+index 349325404add..e4b9e011d2a1 100644
+--- a/include/target/target_core_base.h
++++ b/include/target/target_core_base.h
+@@ -513,7 +513,7 @@ struct se_cmd {
+       sense_reason_t          (*execute_cmd)(struct se_cmd *);
+       sense_reason_t          (*execute_rw)(struct se_cmd *, struct 
scatterlist *,
+                                             u32, enum dma_data_direction);
+-      sense_reason_t (*transport_complete_callback)(struct se_cmd *);
++      sense_reason_t (*transport_complete_callback)(struct se_cmd *, bool);
+ 
+       unsigned char           *t_task_cdb;
+       unsigned char           __t_task_cdb[TCM_MAX_COMMAND_SIZE];
+diff --git a/kernel/ptrace.c b/kernel/ptrace.c
+index 1f4bcb3cc21c..be9760f8284a 100644
+--- a/kernel/ptrace.c
++++ b/kernel/ptrace.c
+@@ -720,6 +720,8 @@ static int ptrace_peek_siginfo(struct task_struct *child,
+ static int ptrace_resume(struct task_struct *child, long request,
+                        unsigned long data)
+ {
++      bool need_siglock;
++
+       if (!valid_signal(data))
+               return -EIO;
+ 
+@@ -747,8 +749,26 @@ static int ptrace_resume(struct task_struct *child, long 
request,
+               user_disable_single_step(child);
+       }
+ 
++      /*
++       * Change ->exit_code and ->state under siglock to avoid the race
++       * with wait_task_stopped() in between; a non-zero ->exit_code will
++       * wrongly look like another report from tracee.
++       *
++       * Note that we need siglock even if ->exit_code == data and/or this
++       * status was not reported yet, the new status must not be cleared by
++       * wait_task_stopped() after resume.
++       *
++       * If data == 0 we do not care if wait_task_stopped() reports the old
++       * status and clears the code too; this can't race with the tracee, it
++       * takes siglock after resume.
++       */
++      need_siglock = data && !thread_group_empty(current);
++      if (need_siglock)
++              spin_lock_irq(&child->sighand->siglock);
+       child->exit_code = data;
+       wake_up_state(child, __TASK_TRACED);
++      if (need_siglock)
++              spin_unlock_irq(&child->sighand->siglock);
+ 
+       return 0;
+ }
+diff --git a/kernel/softirq.c b/kernel/softirq.c
+index 490fcbb1dc5b..93be750348c8 100644
+--- a/kernel/softirq.c
++++ b/kernel/softirq.c
+@@ -657,9 +657,13 @@ static void run_ksoftirqd(unsigned int cpu)
+                * in the task stack here.
+                */
+               __do_softirq();
+-              rcu_note_context_switch(cpu);
+               local_irq_enable();
+               cond_resched();
++
++              preempt_disable();
++              rcu_note_context_switch(cpu);
++              preempt_enable();
++
+               return;
+       }
+       local_irq_enable();
+diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
+index 774a0807fe81..da41de9dc319 100644
+--- a/kernel/trace/ring_buffer.c
++++ b/kernel/trace/ring_buffer.c
+@@ -2651,7 +2651,7 @@ static DEFINE_PER_CPU(unsigned int, current_context);
+ 
+ static __always_inline int trace_recursive_lock(void)
+ {
+-      unsigned int val = this_cpu_read(current_context);
++      unsigned int val = __this_cpu_read(current_context);
+       int bit;
+ 
+       if (in_interrupt()) {
+@@ -2668,18 +2668,17 @@ static __always_inline int trace_recursive_lock(void)
+               return 1;
+ 
+       val |= (1 << bit);
+-      this_cpu_write(current_context, val);
++      __this_cpu_write(current_context, val);
+ 
+       return 0;
+ }
+ 
+ static __always_inline void trace_recursive_unlock(void)
+ {
+-      unsigned int val = this_cpu_read(current_context);
++      unsigned int val = __this_cpu_read(current_context);
+ 
+-      val--;
+-      val &= this_cpu_read(current_context);
+-      this_cpu_write(current_context, val);
++      val &= val & (val - 1);
++      __this_cpu_write(current_context, val);
+ }
+ 
+ #else
+diff --git a/lib/string.c b/lib/string.c
+index 43d0781daf47..cb9ea2181557 100644
+--- a/lib/string.c
++++ b/lib/string.c
+@@ -598,7 +598,7 @@ EXPORT_SYMBOL(memset);
+ void memzero_explicit(void *s, size_t count)
+ {
+       memset(s, 0, count);
+-      OPTIMIZER_HIDE_VAR(s);
++      barrier();
+ }
+ EXPORT_SYMBOL(memzero_explicit);
+ 
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index e2b1bba69882..69ec61abfb37 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -278,13 +278,14 @@ nodata:
+ EXPORT_SYMBOL(__alloc_skb);
+ 
+ /**
+- * build_skb - build a network buffer
++ * __build_skb - build a network buffer
+  * @data: data buffer provided by caller
+- * @frag_size: size of fragment, or 0 if head was kmalloced
++ * @frag_size: size of data, or 0 if head was kmalloced
+  *
+  * Allocate a new &sk_buff. Caller provides space holding head and
+  * skb_shared_info. @data must have been allocated by kmalloc() only if
+- * @frag_size is 0, otherwise data should come from the page allocator.
++ * @frag_size is 0, otherwise data should come from the page allocator
++ *  or vmalloc()
+  * The return is the new skb buffer.
+  * On a failure the return is %NULL, and @data is not freed.
+  * Notes :
+@@ -295,7 +296,7 @@ EXPORT_SYMBOL(__alloc_skb);
+  *  before giving packet to stack.
+  *  RX rings only contains data buffers, not full skbs.
+  */
+-struct sk_buff *build_skb(void *data, unsigned int frag_size)
++struct sk_buff *__build_skb(void *data, unsigned int frag_size)
+ {
+       struct skb_shared_info *shinfo;
+       struct sk_buff *skb;
+@@ -309,7 +310,6 @@ struct sk_buff *build_skb(void *data, unsigned int 
frag_size)
+ 
+       memset(skb, 0, offsetof(struct sk_buff, tail));
+       skb->truesize = SKB_TRUESIZE(size);
+-      skb->head_frag = frag_size != 0;
+       atomic_set(&skb->users, 1);
+       skb->head = data;
+       skb->data = data;
+@@ -326,6 +326,23 @@ struct sk_buff *build_skb(void *data, unsigned int 
frag_size)
+ 
+       return skb;
+ }
++
++/* build_skb() is wrapper over __build_skb(), that specifically
++ * takes care of skb->head and skb->pfmemalloc
++ * This means that if @frag_size is not zero, then @data must be backed
++ * by a page fragment, not kmalloc() or vmalloc()
++ */
++struct sk_buff *build_skb(void *data, unsigned int frag_size)
++{
++      struct sk_buff *skb = __build_skb(data, frag_size);
++
++      if (skb && frag_size) {
++              skb->head_frag = 1;
++              if (virt_to_head_page(data)->pfmemalloc)
++                      skb->pfmemalloc = 1;
++      }
++      return skb;
++}
+ EXPORT_SYMBOL(build_skb);
+ 
+ struct netdev_alloc_cache {
+@@ -352,7 +369,8 @@ refill:
+                       gfp_t gfp = gfp_mask;
+ 
+                       if (order)
+-                              gfp |= __GFP_COMP | __GFP_NOWARN;
++                              gfp |= __GFP_COMP | __GFP_NOWARN |
++                                     __GFP_NOMEMALLOC;
+                       nc->frag.page = alloc_pages(gfp, order);
+                       if (likely(nc->frag.page))
+                               break;
+diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
+index ecb34b5ea42f..57075c4508f7 100644
+--- a/net/ipv4/ip_forward.c
++++ b/net/ipv4/ip_forward.c
+@@ -127,6 +127,9 @@ int ip_forward(struct sk_buff *skb)
+       struct rtable *rt;      /* Route we use */
+       struct ip_options *opt  = &(IPCB(skb)->opt);
+ 
++      if (unlikely(skb->sk))
++              goto drop;
++
+       if (skb_warn_if_lro(skb))
+               goto drop;
+ 
+diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
+index 8c70c73da347..a68cd7100349 100644
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -2595,39 +2595,65 @@ begin_fwd:
+       }
+ }
+ 
+-/* Send a fin.  The caller locks the socket for us.  This cannot be
+- * allowed to fail queueing a FIN frame under any circumstances.
++/* We allow to exceed memory limits for FIN packets to expedite
++ * connection tear down and (memory) recovery.
++ * Otherwise tcp_send_fin() could be tempted to either delay FIN
++ * or even be forced to close flow without any FIN.
++ */
++static void sk_forced_wmem_schedule(struct sock *sk, int size)
++{
++      int amt, status;
++
++      if (size <= sk->sk_forward_alloc)
++              return;
++      amt = sk_mem_pages(size);
++      sk->sk_forward_alloc += amt * SK_MEM_QUANTUM;
++      sk_memory_allocated_add(sk, amt, &status);
++}
++
++/* Send a FIN. The caller locks the socket for us.
++ * We should try to send a FIN packet really hard, but eventually give up.
+  */
+ void tcp_send_fin(struct sock *sk)
+ {
++      struct sk_buff *skb, *tskb = tcp_write_queue_tail(sk);
+       struct tcp_sock *tp = tcp_sk(sk);
+-      struct sk_buff *skb = tcp_write_queue_tail(sk);
+-      int mss_now;
+ 
+-      /* Optimization, tack on the FIN if we have a queue of
+-       * unsent frames.  But be careful about outgoing SACKS
+-       * and IP options.
++      /* Optimization, tack on the FIN if we have one skb in write queue and
++       * this skb was not yet sent, or we are under memory pressure.
++       * Note: in the latter case, FIN packet will be sent after a timeout,
++       * as TCP stack thinks it has already been transmitted.
+        */
+-      mss_now = tcp_current_mss(sk);
+-
+-      if (tcp_send_head(sk) != NULL) {
+-              TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_FIN;
+-              TCP_SKB_CB(skb)->end_seq++;
++      if (tskb && (tcp_send_head(sk) || sk_under_memory_pressure(sk))) {
++coalesce:
++              TCP_SKB_CB(tskb)->tcp_flags |= TCPHDR_FIN;
++              TCP_SKB_CB(tskb)->end_seq++;
+               tp->write_seq++;
++              if (!tcp_send_head(sk)) {
++                      /* This means tskb was already sent.
++                       * Pretend we included the FIN on previous transmit.
++                       * We need to set tp->snd_nxt to the value it would have
++                       * if FIN had been sent. This is because retransmit path
++                       * does not change tp->snd_nxt.
++                       */
++                      tp->snd_nxt++;
++                      return;
++              }
+       } else {
+-              /* Socket is locked, keep trying until memory is available. */
+-              for (;;) {
+-                      skb = sk_stream_alloc_skb(sk, 0, sk->sk_allocation);
+-                      if (skb)
+-                              break;
+-                      yield();
++              skb = alloc_skb_fclone(MAX_TCP_HEADER, sk->sk_allocation);
++              if (unlikely(!skb)) {
++                      if (tskb)
++                              goto coalesce;
++                      return;
+               }
++              skb_reserve(skb, MAX_TCP_HEADER);
++              sk_forced_wmem_schedule(sk, skb->truesize);
+               /* FIN eats a sequence byte, write_seq advanced by 
tcp_queue_skb(). */
+               tcp_init_nondata_skb(skb, tp->write_seq,
+                                    TCPHDR_ACK | TCPHDR_FIN);
+               tcp_queue_skb(sk, skb);
+       }
+-      __tcp_push_pending_frames(sk, mss_now, TCP_NAGLE_OFF);
++      __tcp_push_pending_frames(sk, tcp_current_mss(sk), TCP_NAGLE_OFF);
+ }
+ 
+ /* We get here when a process closes a file descriptor (either due to
+diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
+index 1d52506bda14..a0b0ea949192 100644
+--- a/net/netlink/af_netlink.c
++++ b/net/netlink/af_netlink.c
+@@ -1624,13 +1624,11 @@ static struct sk_buff 
*netlink_alloc_large_skb(unsigned int size,
+       if (data == NULL)
+               return NULL;
+ 
+-      skb = build_skb(data, size);
++      skb = __build_skb(data, size);
+       if (skb == NULL)
+               vfree(data);
+-      else {
+-              skb->head_frag = 0;
++      else
+               skb->destructor = netlink_skb_destructor;
+-      }
+ 
+       return skb;
+ }
+diff --git a/sound/pci/emu10k1/emuproc.c b/sound/pci/emu10k1/emuproc.c
+index 2ca9f2e93139..53745f4c2bf5 100644
+--- a/sound/pci/emu10k1/emuproc.c
++++ b/sound/pci/emu10k1/emuproc.c
+@@ -241,31 +241,22 @@ static void snd_emu10k1_proc_spdif_read(struct 
snd_info_entry *entry,
+       struct snd_emu10k1 *emu = entry->private_data;
+       u32 value;
+       u32 value2;
+-      unsigned long flags;
+       u32 rate;
+ 
+       if (emu->card_capabilities->emu_model) {
+-              spin_lock_irqsave(&emu->emu_lock, flags);
+               snd_emu1010_fpga_read(emu, 0x38, &value);
+-              spin_unlock_irqrestore(&emu->emu_lock, flags);
+               if ((value & 0x1) == 0) {
+-                      spin_lock_irqsave(&emu->emu_lock, flags);
+                       snd_emu1010_fpga_read(emu, 0x2a, &value);
+                       snd_emu1010_fpga_read(emu, 0x2b, &value2);
+-                      spin_unlock_irqrestore(&emu->emu_lock, flags);
+                       rate = 0x1770000 / (((value << 5) | value2)+1); 
+                       snd_iprintf(buffer, "ADAT Locked : %u\n", rate);
+               } else {
+                       snd_iprintf(buffer, "ADAT Unlocked\n");
+               }
+-              spin_lock_irqsave(&emu->emu_lock, flags);
+               snd_emu1010_fpga_read(emu, 0x20, &value);
+-              spin_unlock_irqrestore(&emu->emu_lock, flags);
+               if ((value & 0x4) == 0) {
+-                      spin_lock_irqsave(&emu->emu_lock, flags);
+                       snd_emu1010_fpga_read(emu, 0x28, &value);
+                       snd_emu1010_fpga_read(emu, 0x29, &value2);
+-                      spin_unlock_irqrestore(&emu->emu_lock, flags);
+                       rate = 0x1770000 / (((value << 5) | value2)+1); 
+                       snd_iprintf(buffer, "SPDIF Locked : %d\n", rate);
+               } else {
+@@ -410,14 +401,11 @@ static void snd_emu_proc_emu1010_reg_read(struct 
snd_info_entry *entry,
+ {
+       struct snd_emu10k1 *emu = entry->private_data;
+       u32 value;
+-      unsigned long flags;
+       int i;
+       snd_iprintf(buffer, "EMU1010 Registers:\n\n");
+ 
+       for(i = 0; i < 0x40; i+=1) {
+-              spin_lock_irqsave(&emu->emu_lock, flags);
+               snd_emu1010_fpga_read(emu, i, &value);
+-              spin_unlock_irqrestore(&emu->emu_lock, flags);
+               snd_iprintf(buffer, "%02X: %08X, %02X\n", i, value, (value >> 
8) & 0x7f);
+       }
+ }
+diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c
+index 5e3bc3c6801a..f40a7a4b6591 100644
+--- a/sound/soc/davinci/davinci-evm.c
++++ b/sound/soc/davinci/davinci-evm.c
+@@ -384,18 +384,8 @@ static int davinci_evm_probe(struct platform_device *pdev)
+       return ret;
+ }
+ 
+-static int davinci_evm_remove(struct platform_device *pdev)
+-{
+-      struct snd_soc_card *card = platform_get_drvdata(pdev);
+-
+-      snd_soc_unregister_card(card);
+-
+-      return 0;
+-}
+-
+ static struct platform_driver davinci_evm_driver = {
+       .probe          = davinci_evm_probe,
+-      .remove         = davinci_evm_remove,
+       .driver         = {
+               .name   = "davinci_evm",
+               .owner  = THIS_MODULE,
+diff --git a/tools/lib/traceevent/kbuffer-parse.c 
b/tools/lib/traceevent/kbuffer-parse.c
+index dcc665228c71..deb3569ab004 100644
+--- a/tools/lib/traceevent/kbuffer-parse.c
++++ b/tools/lib/traceevent/kbuffer-parse.c
+@@ -372,7 +372,6 @@ translate_data(struct kbuffer *kbuf, void *data, void 
**rptr,
+       switch (type_len) {
+       case KBUFFER_TYPE_PADDING:
+               *length = read_4(kbuf, data);
+-              data += *length;
+               break;
+ 
+       case KBUFFER_TYPE_TIME_EXTEND:
+diff --git a/tools/power/x86/turbostat/Makefile 
b/tools/power/x86/turbostat/Makefile
+index d1b3a361e526..4039854560d0 100644
+--- a/tools/power/x86/turbostat/Makefile
++++ b/tools/power/x86/turbostat/Makefile
+@@ -1,8 +1,12 @@
+ CC            = $(CROSS_COMPILE)gcc
+-BUILD_OUTPUT  := $(PWD)
++BUILD_OUTPUT  := $(CURDIR)
+ PREFIX                := /usr
+ DESTDIR               :=
+ 
++ifeq ("$(origin O)", "command line")
++      BUILD_OUTPUT := $(O)
++endif
++
+ turbostat : turbostat.c
+ CFLAGS +=     -Wall
+ CFLAGS +=     
-DMSRHEADER='"../../../../arch/x86/include/uapi/asm/msr-index.h"'
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 66112533b1e9..eed250e9c218 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -1549,8 +1549,8 @@ int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct 
gfn_to_hva_cache *ghc,
+       ghc->generation = slots->generation;
+       ghc->len = len;
+       ghc->memslot = gfn_to_memslot(kvm, start_gfn);
+-      ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, &nr_pages_avail);
+-      if (!kvm_is_error_hva(ghc->hva) && nr_pages_avail >= nr_pages_needed) {
++      ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, NULL);
++      if (!kvm_is_error_hva(ghc->hva) && nr_pages_needed <= 1) {
+               ghc->hva += offset;
+       } else {
+               /*

Reply via email to