commit:     b3664958047a78d65c5ad40678c8bff0d0843099
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sat Apr 22 17:03:12 2017 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sat Apr 22 17:03:12 2017 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=b3664958

Linux patch 4.10.12

 0000_README              |    4 +
 1011_linux-4.10.12.patch | 3376 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3380 insertions(+)

diff --git a/0000_README b/0000_README
index f05d7f1..e55a9e7 100644
--- a/0000_README
+++ b/0000_README
@@ -87,6 +87,10 @@ Patch:  1010_linux-4.10.11.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.10.11
 
+Patch:  1011_linux-4.10.12.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.10.12
+
 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/1011_linux-4.10.12.patch b/1011_linux-4.10.12.patch
new file mode 100644
index 0000000..74cbab6
--- /dev/null
+++ b/1011_linux-4.10.12.patch
@@ -0,0 +1,3376 @@
+diff --git a/Makefile b/Makefile
+index 412f2a0a3814..9689d3f644ea 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 10
+-SUBLEVEL = 11
++SUBLEVEL = 12
+ EXTRAVERSION =
+ NAME = Fearless Coyote
+ 
+diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
+index 0ddf3698b85d..8ac0e5994ed2 100644
+--- a/arch/mips/lantiq/irq.c
++++ b/arch/mips/lantiq/irq.c
+@@ -269,11 +269,6 @@ static void ltq_hw5_irqdispatch(void)
+ DEFINE_HWx_IRQDISPATCH(5)
+ #endif
+ 
+-static void ltq_hw_irq_handler(struct irq_desc *desc)
+-{
+-      ltq_hw_irqdispatch(irq_desc_get_irq(desc) - 2);
+-}
+-
+ #ifdef CONFIG_MIPS_MT_SMP
+ void __init arch_init_ipiirq(int irq, struct irqaction *action)
+ {
+@@ -318,19 +313,23 @@ static struct irqaction irq_call = {
+ asmlinkage void plat_irq_dispatch(void)
+ {
+       unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
+-      int irq;
+-
+-      if (!pending) {
+-              spurious_interrupt();
+-              return;
++      unsigned int i;
++
++      if ((MIPS_CPU_TIMER_IRQ == 7) && (pending & CAUSEF_IP7)) {
++              do_IRQ(MIPS_CPU_TIMER_IRQ);
++              goto out;
++      } else {
++              for (i = 0; i < MAX_IM; i++) {
++                      if (pending & (CAUSEF_IP2 << i)) {
++                              ltq_hw_irqdispatch(i);
++                              goto out;
++                      }
++              }
+       }
++      pr_alert("Spurious IRQ: CAUSE=0x%08x\n", read_c0_status());
+ 
+-      pending >>= CAUSEB_IP;
+-      while (pending) {
+-              irq = fls(pending) - 1;
+-              do_IRQ(MIPS_CPU_IRQ_BASE + irq);
+-              pending &= ~BIT(irq);
+-      }
++out:
++      return;
+ }
+ 
+ static int icu_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
+@@ -355,6 +354,11 @@ static const struct irq_domain_ops irq_domain_ops = {
+       .map = icu_map,
+ };
+ 
++static struct irqaction cascade = {
++      .handler = no_action,
++      .name = "cascade",
++};
++
+ int __init icu_of_init(struct device_node *node, struct device_node *parent)
+ {
+       struct device_node *eiu_node;
+@@ -386,7 +390,7 @@ int __init icu_of_init(struct device_node *node, struct 
device_node *parent)
+       mips_cpu_irq_init();
+ 
+       for (i = 0; i < MAX_IM; i++)
+-              irq_set_chained_handler(i + 2, ltq_hw_irq_handler);
++              setup_irq(i + 2, &cascade);
+ 
+       if (cpu_has_vint) {
+               pr_info("Setting up vectored interrupts\n");
+diff --git a/arch/parisc/include/asm/uaccess.h 
b/arch/parisc/include/asm/uaccess.h
+index 7fcf5128996a..0497ceceeb85 100644
+--- a/arch/parisc/include/asm/uaccess.h
++++ b/arch/parisc/include/asm/uaccess.h
+@@ -42,10 +42,10 @@ static inline long access_ok(int type, const void __user * 
addr,
+ #define get_user __get_user
+ 
+ #if !defined(CONFIG_64BIT)
+-#define LDD_USER(ptr)         __get_user_asm64(ptr)
++#define LDD_USER(val, ptr)    __get_user_asm64(val, ptr)
+ #define STD_USER(x, ptr)      __put_user_asm64(x, ptr)
+ #else
+-#define LDD_USER(ptr)         __get_user_asm("ldd", ptr)
++#define LDD_USER(val, ptr)    __get_user_asm(val, "ldd", ptr)
+ #define STD_USER(x, ptr)      __put_user_asm("std", x, ptr)
+ #endif
+ 
+@@ -100,63 +100,87 @@ struct exception_data {
+               " mtsp %0,%%sr2\n\t"            \
+               : : "r"(get_fs()) : )
+ 
+-#define __get_user(x, ptr)                               \
+-({                                                       \
+-      register long __gu_err __asm__ ("r8") = 0;       \
+-      register long __gu_val;                          \
+-                                                       \
+-      load_sr2();                                      \
+-      switch (sizeof(*(ptr))) {                        \
+-          case 1: __get_user_asm("ldb", ptr); break;   \
+-          case 2: __get_user_asm("ldh", ptr); break;   \
+-          case 4: __get_user_asm("ldw", ptr); break;   \
+-          case 8: LDD_USER(ptr);  break;               \
+-          default: BUILD_BUG(); break;                 \
+-      }                                                \
+-                                                       \
+-      (x) = (__force __typeof__(*(ptr))) __gu_val;     \
+-      __gu_err;                                        \
++#define __get_user_internal(val, ptr)                 \
++({                                                    \
++      register long __gu_err __asm__ ("r8") = 0;      \
++                                                      \
++      switch (sizeof(*(ptr))) {                       \
++      case 1: __get_user_asm(val, "ldb", ptr); break; \
++      case 2: __get_user_asm(val, "ldh", ptr); break; \
++      case 4: __get_user_asm(val, "ldw", ptr); break; \
++      case 8: LDD_USER(val, ptr); break;              \
++      default: BUILD_BUG();                           \
++      }                                               \
++                                                      \
++      __gu_err;                                       \
+ })
+ 
+-#define __get_user_asm(ldx, ptr)                        \
++#define __get_user(val, ptr)                          \
++({                                                    \
++      load_sr2();                                     \
++      __get_user_internal(val, ptr);                  \
++})
++
++#define __get_user_asm(val, ldx, ptr)                 \
++{                                                     \
++      register long __gu_val;                         \
++                                                      \
+       __asm__("1: " ldx " 0(%%sr2,%2),%0\n"           \
+               "9:\n"                                  \
+               ASM_EXCEPTIONTABLE_ENTRY_EFAULT(1b, 9b) \
+               : "=r"(__gu_val), "=r"(__gu_err)        \
+-              : "r"(ptr), "1"(__gu_err));
++              : "r"(ptr), "1"(__gu_err));             \
++                                                      \
++      (val) = (__force __typeof__(*(ptr))) __gu_val;  \
++}
+ 
+ #if !defined(CONFIG_64BIT)
+ 
+-#define __get_user_asm64(ptr)                                 \
++#define __get_user_asm64(val, ptr)                    \
++{                                                     \
++      union {                                         \
++              unsigned long long      l;              \
++              __typeof__(*(ptr))      t;              \
++      } __gu_tmp;                                     \
++                                                      \
+       __asm__("   copy %%r0,%R0\n"                    \
+               "1: ldw 0(%%sr2,%2),%0\n"               \
+               "2: ldw 4(%%sr2,%2),%R0\n"              \
+               "9:\n"                                  \
+               ASM_EXCEPTIONTABLE_ENTRY_EFAULT(1b, 9b) \
+               ASM_EXCEPTIONTABLE_ENTRY_EFAULT(2b, 9b) \
+-              : "=r"(__gu_val), "=r"(__gu_err)        \
+-              : "r"(ptr), "1"(__gu_err));
++              : "=&r"(__gu_tmp.l), "=r"(__gu_err)     \
++              : "r"(ptr), "1"(__gu_err));             \
++                                                      \
++      (val) = __gu_tmp.t;                             \
++}
+ 
+ #endif /* !defined(CONFIG_64BIT) */
+ 
+ 
+-#define __put_user(x, ptr)                                      \
++#define __put_user_internal(x, ptr)                           \
+ ({                                                            \
+       register long __pu_err __asm__ ("r8") = 0;              \
+         __typeof__(*(ptr)) __x = (__typeof__(*(ptr)))(x);     \
+                                                               \
+-      load_sr2();                                             \
+       switch (sizeof(*(ptr))) {                               \
+-          case 1: __put_user_asm("stb", __x, ptr); break;     \
+-          case 2: __put_user_asm("sth", __x, ptr); break;     \
+-          case 4: __put_user_asm("stw", __x, ptr); break;     \
+-          case 8: STD_USER(__x, ptr); break;                  \
+-          default: BUILD_BUG(); break;                        \
+-      }                                                       \
++      case 1: __put_user_asm("stb", __x, ptr); break;         \
++      case 2: __put_user_asm("sth", __x, ptr); break;         \
++      case 4: __put_user_asm("stw", __x, ptr); break;         \
++      case 8: STD_USER(__x, ptr); break;                      \
++      default: BUILD_BUG();                                   \
++      }                                                       \
+                                                               \
+       __pu_err;                                               \
+ })
+ 
++#define __put_user(x, ptr)                                    \
++({                                                            \
++      load_sr2();                                             \
++      __put_user_internal(x, ptr);                            \
++})
++
++
+ /*
+  * The "__put_user/kernel_asm()" macros tell gcc they read from memory
+  * instead of writing. This is because they do not write to any memory
+diff --git a/arch/parisc/lib/lusercopy.S b/arch/parisc/lib/lusercopy.S
+index f01188c044ee..85c28bb80fb7 100644
+--- a/arch/parisc/lib/lusercopy.S
++++ b/arch/parisc/lib/lusercopy.S
+@@ -201,7 +201,7 @@ ENTRY_CFI(pa_memcpy)
+       add     dst,len,end
+ 
+       /* short copy with less than 16 bytes? */
+-      cmpib,>>=,n 15,len,.Lbyte_loop
++      cmpib,COND(>>=),n 15,len,.Lbyte_loop
+ 
+       /* same alignment? */
+       xor     src,dst,t0
+@@ -216,7 +216,7 @@ ENTRY_CFI(pa_memcpy)
+       /* loop until we are 64-bit aligned */
+ .Lalign_loop64:
+       extru   dst,31,3,t1
+-      cmpib,=,n       0,t1,.Lcopy_loop_16
++      cmpib,=,n       0,t1,.Lcopy_loop_16_start
+ 20:   ldb,ma  1(srcspc,src),t1
+ 21:   stb,ma  t1,1(dstspc,dst)
+       b       .Lalign_loop64
+@@ -225,6 +225,7 @@ ENTRY_CFI(pa_memcpy)
+       ASM_EXCEPTIONTABLE_ENTRY(20b,.Lcopy_done)
+       ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
+ 
++.Lcopy_loop_16_start:
+       ldi     31,t0
+ .Lcopy_loop_16:
+       cmpb,COND(>>=),n t0,len,.Lword_loop
+@@ -267,7 +268,7 @@ ENTRY_CFI(pa_memcpy)
+       /* loop until we are 32-bit aligned */
+ .Lalign_loop32:
+       extru   dst,31,2,t1
+-      cmpib,=,n       0,t1,.Lcopy_loop_4
++      cmpib,=,n       0,t1,.Lcopy_loop_8
+ 20:   ldb,ma  1(srcspc,src),t1
+ 21:   stb,ma  t1,1(dstspc,dst)
+       b       .Lalign_loop32
+@@ -277,7 +278,7 @@ ENTRY_CFI(pa_memcpy)
+       ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
+ 
+ 
+-.Lcopy_loop_4:
++.Lcopy_loop_8:
+       cmpib,COND(>>=),n 15,len,.Lbyte_loop
+ 
+ 10:   ldw     0(srcspc,src),t1
+@@ -299,7 +300,7 @@ ENTRY_CFI(pa_memcpy)
+       ASM_EXCEPTIONTABLE_ENTRY(16b,.Lcopy_done)
+       ASM_EXCEPTIONTABLE_ENTRY(17b,.Lcopy_done)
+ 
+-      b       .Lcopy_loop_4
++      b       .Lcopy_loop_8
+       ldo     -16(len),len
+ 
+ .Lbyte_loop:
+@@ -324,7 +325,7 @@ ENTRY_CFI(pa_memcpy)
+ .Lunaligned_copy:
+       /* align until dst is 32bit-word-aligned */
+       extru   dst,31,2,t1
+-      cmpib,COND(=),n 0,t1,.Lcopy_dstaligned
++      cmpib,=,n       0,t1,.Lcopy_dstaligned
+ 20:   ldb     0(srcspc,src),t1
+       ldo     1(src),src
+ 21:   stb,ma  t1,1(dstspc,dst)
+@@ -362,7 +363,7 @@ ENTRY_CFI(pa_memcpy)
+       cmpiclr,<> 1,t0,%r0
+       b,n .Lcase1
+ .Lcase0:
+-      cmpb,= %r0,len,.Lcda_finish
++      cmpb,COND(=) %r0,len,.Lcda_finish
+       nop
+ 
+ 1:    ldw,ma 4(srcspc,src), a3
+@@ -376,7 +377,7 @@ ENTRY_CFI(pa_memcpy)
+ 1:    ldw,ma 4(srcspc,src), a3
+       ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
+       ldo -1(len),len
+-      cmpb,=,n %r0,len,.Ldo0
++      cmpb,COND(=),n %r0,len,.Ldo0
+ .Ldo4:
+ 1:    ldw,ma 4(srcspc,src), a0
+       ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
+@@ -402,7 +403,7 @@ ENTRY_CFI(pa_memcpy)
+ 1:    stw,ma t0, 4(dstspc,dst)
+       ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcopy_done)
+       ldo -4(len),len
+-      cmpb,<> %r0,len,.Ldo4
++      cmpb,COND(<>) %r0,len,.Ldo4
+       nop
+ .Ldo0:
+       shrpw a2, a3, %sar, t0
+@@ -436,14 +437,14 @@ ENTRY_CFI(pa_memcpy)
+       /* fault exception fixup handlers: */
+ #ifdef CONFIG_64BIT
+ .Lcopy16_fault:
+-10:   b       .Lcopy_done
+-      std,ma  t1,8(dstspc,dst)
++      b       .Lcopy_done
++10:   std,ma  t1,8(dstspc,dst)
+       ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
+ #endif
+ 
+ .Lcopy8_fault:
+-10:   b       .Lcopy_done
+-      stw,ma  t1,4(dstspc,dst)
++      b       .Lcopy_done
++10:   stw,ma  t1,4(dstspc,dst)
+       ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
+ 
+       .exit
+diff --git a/arch/x86/entry/vdso/vdso32-setup.c 
b/arch/x86/entry/vdso/vdso32-setup.c
+index 7853b53959cd..3f9d1a83891a 100644
+--- a/arch/x86/entry/vdso/vdso32-setup.c
++++ b/arch/x86/entry/vdso/vdso32-setup.c
+@@ -30,8 +30,10 @@ static int __init vdso32_setup(char *s)
+ {
+       vdso32_enabled = simple_strtoul(s, NULL, 0);
+ 
+-      if (vdso32_enabled > 1)
++      if (vdso32_enabled > 1) {
+               pr_warn("vdso32 values other than 0 and 1 are no longer 
allowed; vdso disabled\n");
++              vdso32_enabled = 0;
++      }
+ 
+       return 1;
+ }
+@@ -62,13 +64,18 @@ subsys_initcall(sysenter_setup);
+ /* Register vsyscall32 into the ABI table */
+ #include <linux/sysctl.h>
+ 
++static const int zero;
++static const int one = 1;
++
+ static struct ctl_table abi_table2[] = {
+       {
+               .procname       = "vsyscall32",
+               .data           = &vdso32_enabled,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+-              .proc_handler   = proc_dointvec
++              .proc_handler   = proc_dointvec_minmax,
++              .extra1         = (int *)&zero,
++              .extra2         = (int *)&one,
+       },
+       {}
+ };
+diff --git a/arch/x86/events/intel/lbr.c b/arch/x86/events/intel/lbr.c
+index 81b321ace8e0..f924629836a8 100644
+--- a/arch/x86/events/intel/lbr.c
++++ b/arch/x86/events/intel/lbr.c
+@@ -507,6 +507,9 @@ static void intel_pmu_lbr_read_32(struct cpu_hw_events 
*cpuc)
+               cpuc->lbr_entries[i].to         = msr_lastbranch.to;
+               cpuc->lbr_entries[i].mispred    = 0;
+               cpuc->lbr_entries[i].predicted  = 0;
++              cpuc->lbr_entries[i].in_tx      = 0;
++              cpuc->lbr_entries[i].abort      = 0;
++              cpuc->lbr_entries[i].cycles     = 0;
+               cpuc->lbr_entries[i].reserved   = 0;
+       }
+       cpuc->lbr_stack.nr = i;
+diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
+index e7f155c3045e..94aad6364b47 100644
+--- a/arch/x86/include/asm/elf.h
++++ b/arch/x86/include/asm/elf.h
+@@ -278,7 +278,7 @@ struct task_struct;
+ 
+ #define       ARCH_DLINFO_IA32                                                
\
+ do {                                                                  \
+-      if (vdso32_enabled) {                                           \
++      if (VDSO_CURRENT_BASE) {                                        \
+               NEW_AUX_ENT(AT_SYSINFO, VDSO_ENTRY);                    \
+               NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_CURRENT_BASE);        \
+       }                                                               \
+diff --git a/arch/x86/include/asm/pmem.h b/arch/x86/include/asm/pmem.h
+index 2c1ebeb4d737..529bb4a6487a 100644
+--- a/arch/x86/include/asm/pmem.h
++++ b/arch/x86/include/asm/pmem.h
+@@ -55,7 +55,8 @@ static inline int arch_memcpy_from_pmem(void *dst, const 
void *src, size_t n)
+  * @size:     number of bytes to write back
+  *
+  * Write back a cache range using the CLWB (cache line write back)
+- * instruction.
++ * instruction. Note that @size is internally rounded up to be cache
++ * line size aligned.
+  */
+ static inline void arch_wb_cache_pmem(void *addr, size_t size)
+ {
+@@ -69,15 +70,6 @@ static inline void arch_wb_cache_pmem(void *addr, size_t 
size)
+               clwb(p);
+ }
+ 
+-/*
+- * copy_from_iter_nocache() on x86 only uses non-temporal stores for iovec
+- * iterators, so for other types (bvec & kvec) we must do a cache write-back.
+- */
+-static inline bool __iter_needs_pmem_wb(struct iov_iter *i)
+-{
+-      return iter_is_iovec(i) == false;
+-}
+-
+ /**
+  * arch_copy_from_iter_pmem - copy data from an iterator to PMEM
+  * @addr:     PMEM destination address
+@@ -94,7 +86,35 @@ static inline size_t arch_copy_from_iter_pmem(void *addr, 
size_t bytes,
+       /* TODO: skip the write-back by always using non-temporal stores */
+       len = copy_from_iter_nocache(addr, bytes, i);
+ 
+-      if (__iter_needs_pmem_wb(i))
++      /*
++       * In the iovec case on x86_64 copy_from_iter_nocache() uses
++       * non-temporal stores for the bulk of the transfer, but we need
++       * to manually flush if the transfer is unaligned. A cached
++       * memory copy is used when destination or size is not naturally
++       * aligned. That is:
++       *   - Require 8-byte alignment when size is 8 bytes or larger.
++       *   - Require 4-byte alignment when size is 4 bytes.
++       *
++       * In the non-iovec case the entire destination needs to be
++       * flushed.
++       */
++      if (iter_is_iovec(i)) {
++              unsigned long flushed, dest = (unsigned long) addr;
++
++              if (bytes < 8) {
++                      if (!IS_ALIGNED(dest, 4) || (bytes != 4))
++                              arch_wb_cache_pmem(addr, 1);
++              } else {
++                      if (!IS_ALIGNED(dest, 8)) {
++                              dest = ALIGN(dest, 
boot_cpu_data.x86_clflush_size);
++                              arch_wb_cache_pmem(addr, 1);
++                      }
++
++                      flushed = dest - (unsigned long) addr;
++                      if (bytes > flushed && !IS_ALIGNED(bytes - flushed, 8))
++                              arch_wb_cache_pmem(addr + bytes - 1, 1);
++              }
++      } else
+               arch_wb_cache_pmem(addr, bytes);
+ 
+       return len;
+diff --git a/arch/x86/kernel/cpu/intel_rdt_schemata.c 
b/arch/x86/kernel/cpu/intel_rdt_schemata.c
+index f369cb8db0d5..badd2b31a560 100644
+--- a/arch/x86/kernel/cpu/intel_rdt_schemata.c
++++ b/arch/x86/kernel/cpu/intel_rdt_schemata.c
+@@ -200,11 +200,11 @@ ssize_t rdtgroup_schemata_write(struct kernfs_open_file 
*of,
+       }
+ 
+ out:
+-      rdtgroup_kn_unlock(of->kn);
+       for_each_enabled_rdt_resource(r) {
+               kfree(r->tmp_cbms);
+               r->tmp_cbms = NULL;
+       }
++      rdtgroup_kn_unlock(of->kn);
+       return ret ?: nbytes;
+ }
+ 
+diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c
+index ec1f756f9dc9..71beb28600d4 100644
+--- a/arch/x86/kernel/signal_compat.c
++++ b/arch/x86/kernel/signal_compat.c
+@@ -151,8 +151,8 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, 
const siginfo_t *from,
+ 
+                               if (from->si_signo == SIGSEGV) {
+                                       if (from->si_code == SEGV_BNDERR) {
+-                                              compat_uptr_t lower = (unsigned 
long)&to->si_lower;
+-                                              compat_uptr_t upper = (unsigned 
long)&to->si_upper;
++                                              compat_uptr_t lower = (unsigned 
long)from->si_lower;
++                                              compat_uptr_t upper = (unsigned 
long)from->si_upper;
+                                               put_user_ex(lower, 
&to->si_lower);
+                                               put_user_ex(upper, 
&to->si_upper);
+                                       }
+diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
+index 22af912d66d2..889e7619a091 100644
+--- a/arch/x86/mm/init.c
++++ b/arch/x86/mm/init.c
+@@ -643,21 +643,40 @@ void __init init_mem_mapping(void)
+  * devmem_is_allowed() checks to see if /dev/mem access to a certain address
+  * is valid. The argument is a physical page number.
+  *
+- *
+- * On x86, access has to be given to the first megabyte of ram because that 
area
+- * contains BIOS code and data regions used by X and dosemu and similar apps.
+- * Access has to be given to non-kernel-ram areas as well, these contain the 
PCI
+- * mmio resources as well as potential bios/acpi data regions.
++ * On x86, access has to be given to the first megabyte of RAM because that
++ * area traditionally contains BIOS code and data regions used by X, dosemu,
++ * and similar apps. Since they map the entire memory range, the whole range
++ * must be allowed (for mapping), but any areas that would otherwise be
++ * disallowed are flagged as being "zero filled" instead of rejected.
++ * Access has to be given to non-kernel-ram areas as well, these contain the
++ * PCI mmio resources as well as potential bios/acpi data regions.
+  */
+ int devmem_is_allowed(unsigned long pagenr)
+ {
+-      if (pagenr < 256)
+-              return 1;
+-      if (iomem_is_exclusive(pagenr << PAGE_SHIFT))
++      if (page_is_ram(pagenr)) {
++              /*
++               * For disallowed memory regions in the low 1MB range,
++               * request that the page be shown as all zeros.
++               */
++              if (pagenr < 256)
++                      return 2;
++
++              return 0;
++      }
++
++      /*
++       * This must follow RAM test, since System RAM is considered a
++       * restricted resource under CONFIG_STRICT_IOMEM.
++       */
++      if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) {
++              /* Low 1MB bypasses iomem restrictions. */
++              if (pagenr < 256)
++                      return 1;
++
+               return 0;
+-      if (!page_is_ram(pagenr))
+-              return 1;
+-      return 0;
++      }
++
++      return 1;
+ }
+ 
+ void free_init_pages(char *what, unsigned long begin, unsigned long end)
+diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c
+index 30031d5293c4..cdfe8c628959 100644
+--- a/arch/x86/platform/efi/quirks.c
++++ b/arch/x86/platform/efi/quirks.c
+@@ -201,6 +201,10 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 
size)
+               return;
+       }
+ 
++      /* No need to reserve regions that will never be freed. */
++      if (md.attribute & EFI_MEMORY_RUNTIME)
++              return;
++
+       size += addr % EFI_PAGE_SIZE;
+       size = round_up(size, EFI_PAGE_SIZE);
+       addr = round_down(addr, EFI_PAGE_SIZE);
+diff --git a/arch/x86/xen/apic.c b/arch/x86/xen/apic.c
+index 44c88ad1841a..bcea81f36fc5 100644
+--- a/arch/x86/xen/apic.c
++++ b/arch/x86/xen/apic.c
+@@ -145,7 +145,7 @@ static void xen_silent_inquire(int apicid)
+ static int xen_cpu_present_to_apicid(int cpu)
+ {
+       if (cpu_present(cpu))
+-              return xen_get_apic_id(xen_apic_read(APIC_ID));
++              return cpu_data(cpu).apicid;
+       else
+               return BAD_APICID;
+ }
+diff --git a/crypto/ahash.c b/crypto/ahash.c
+index 2ce8bcb9049c..cce0268a13fe 100644
+--- a/crypto/ahash.c
++++ b/crypto/ahash.c
+@@ -31,6 +31,7 @@ struct ahash_request_priv {
+       crypto_completion_t complete;
+       void *data;
+       u8 *result;
++      u32 flags;
+       void *ubuf[] CRYPTO_MINALIGN_ATTR;
+ };
+ 
+@@ -252,6 +253,8 @@ static int ahash_save_req(struct ahash_request *req, 
crypto_completion_t cplt)
+       priv->result = req->result;
+       priv->complete = req->base.complete;
+       priv->data = req->base.data;
++      priv->flags = req->base.flags;
++
+       /*
+        * WARNING: We do not backup req->priv here! The req->priv
+        *          is for internal use of the Crypto API and the
+@@ -266,38 +269,44 @@ static int ahash_save_req(struct ahash_request *req, 
crypto_completion_t cplt)
+       return 0;
+ }
+ 
+-static void ahash_restore_req(struct ahash_request *req)
++static void ahash_restore_req(struct ahash_request *req, int err)
+ {
+       struct ahash_request_priv *priv = req->priv;
+ 
++      if (!err)
++              memcpy(priv->result, req->result,
++                     crypto_ahash_digestsize(crypto_ahash_reqtfm(req)));
++
+       /* Restore the original crypto request. */
+       req->result = priv->result;
+-      req->base.complete = priv->complete;
+-      req->base.data = priv->data;
++
++      ahash_request_set_callback(req, priv->flags,
++                                 priv->complete, priv->data);
+       req->priv = NULL;
+ 
+       /* Free the req->priv.priv from the ADJUSTED request. */
+       kzfree(priv);
+ }
+ 
+-static void ahash_op_unaligned_finish(struct ahash_request *req, int err)
++static void ahash_notify_einprogress(struct ahash_request *req)
+ {
+       struct ahash_request_priv *priv = req->priv;
++      struct crypto_async_request oreq;
+ 
+-      if (err == -EINPROGRESS)
+-              return;
+-
+-      if (!err)
+-              memcpy(priv->result, req->result,
+-                     crypto_ahash_digestsize(crypto_ahash_reqtfm(req)));
++      oreq.data = priv->data;
+ 
+-      ahash_restore_req(req);
++      priv->complete(&oreq, -EINPROGRESS);
+ }
+ 
+ static void ahash_op_unaligned_done(struct crypto_async_request *req, int err)
+ {
+       struct ahash_request *areq = req->data;
+ 
++      if (err == -EINPROGRESS) {
++              ahash_notify_einprogress(areq);
++              return;
++      }
++
+       /*
+        * Restore the original request, see ahash_op_unaligned() for what
+        * goes where.
+@@ -308,7 +317,7 @@ static void ahash_op_unaligned_done(struct 
crypto_async_request *req, int err)
+        */
+ 
+       /* First copy req->result into req->priv.result */
+-      ahash_op_unaligned_finish(areq, err);
++      ahash_restore_req(areq, err);
+ 
+       /* Complete the ORIGINAL request. */
+       areq->base.complete(&areq->base, err);
+@@ -324,7 +333,12 @@ static int ahash_op_unaligned(struct ahash_request *req,
+               return err;
+ 
+       err = op(req);
+-      ahash_op_unaligned_finish(req, err);
++      if (err == -EINPROGRESS ||
++          (err == -EBUSY && (ahash_request_flags(req) &
++                             CRYPTO_TFM_REQ_MAY_BACKLOG)))
++              return err;
++
++      ahash_restore_req(req, err);
+ 
+       return err;
+ }
+@@ -359,25 +373,14 @@ int crypto_ahash_digest(struct ahash_request *req)
+ }
+ EXPORT_SYMBOL_GPL(crypto_ahash_digest);
+ 
+-static void ahash_def_finup_finish2(struct ahash_request *req, int err)
++static void ahash_def_finup_done2(struct crypto_async_request *req, int err)
+ {
+-      struct ahash_request_priv *priv = req->priv;
++      struct ahash_request *areq = req->data;
+ 
+       if (err == -EINPROGRESS)
+               return;
+ 
+-      if (!err)
+-              memcpy(priv->result, req->result,
+-                     crypto_ahash_digestsize(crypto_ahash_reqtfm(req)));
+-
+-      ahash_restore_req(req);
+-}
+-
+-static void ahash_def_finup_done2(struct crypto_async_request *req, int err)
+-{
+-      struct ahash_request *areq = req->data;
+-
+-      ahash_def_finup_finish2(areq, err);
++      ahash_restore_req(areq, err);
+ 
+       areq->base.complete(&areq->base, err);
+ }
+@@ -388,11 +391,15 @@ static int ahash_def_finup_finish1(struct ahash_request 
*req, int err)
+               goto out;
+ 
+       req->base.complete = ahash_def_finup_done2;
+-      req->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
++
+       err = crypto_ahash_reqtfm(req)->final(req);
++      if (err == -EINPROGRESS ||
++          (err == -EBUSY && (ahash_request_flags(req) &
++                             CRYPTO_TFM_REQ_MAY_BACKLOG)))
++              return err;
+ 
+ out:
+-      ahash_def_finup_finish2(req, err);
++      ahash_restore_req(req, err);
+       return err;
+ }
+ 
+@@ -400,7 +407,16 @@ static void ahash_def_finup_done1(struct 
crypto_async_request *req, int err)
+ {
+       struct ahash_request *areq = req->data;
+ 
++      if (err == -EINPROGRESS) {
++              ahash_notify_einprogress(areq);
++              return;
++      }
++
++      areq->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
++
+       err = ahash_def_finup_finish1(areq, err);
++      if (areq->priv)
++              return;
+ 
+       areq->base.complete(&areq->base, err);
+ }
+@@ -415,6 +431,11 @@ static int ahash_def_finup(struct ahash_request *req)
+               return err;
+ 
+       err = tfm->update(req);
++      if (err == -EINPROGRESS ||
++          (err == -EBUSY && (ahash_request_flags(req) &
++                             CRYPTO_TFM_REQ_MAY_BACKLOG)))
++              return err;
++
+       return ahash_def_finup_finish1(req, err);
+ }
+ 
+diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c
+index 533265f110e0..c3177c989dc8 100644
+--- a/crypto/algif_aead.c
++++ b/crypto/algif_aead.c
+@@ -39,6 +39,7 @@ struct aead_async_req {
+       struct aead_async_rsgl first_rsgl;
+       struct list_head list;
+       struct kiocb *iocb;
++      struct sock *sk;
+       unsigned int tsgls;
+       char iv[];
+ };
+@@ -378,12 +379,10 @@ static ssize_t aead_sendpage(struct socket *sock, struct 
page *page,
+ 
+ static void aead_async_cb(struct crypto_async_request *_req, int err)
+ {
+-      struct sock *sk = _req->data;
+-      struct alg_sock *ask = alg_sk(sk);
+-      struct aead_ctx *ctx = ask->private;
+-      struct crypto_aead *tfm = crypto_aead_reqtfm(&ctx->aead_req);
+-      struct aead_request *req = aead_request_cast(_req);
++      struct aead_request *req = _req->data;
++      struct crypto_aead *tfm = crypto_aead_reqtfm(req);
+       struct aead_async_req *areq = GET_ASYM_REQ(req, tfm);
++      struct sock *sk = areq->sk;
+       struct scatterlist *sg = areq->tsgl;
+       struct aead_async_rsgl *rsgl;
+       struct kiocb *iocb = areq->iocb;
+@@ -446,11 +445,12 @@ static int aead_recvmsg_async(struct socket *sock, 
struct msghdr *msg,
+       memset(&areq->first_rsgl, '\0', sizeof(areq->first_rsgl));
+       INIT_LIST_HEAD(&areq->list);
+       areq->iocb = msg->msg_iocb;
++      areq->sk = sk;
+       memcpy(areq->iv, ctx->iv, crypto_aead_ivsize(tfm));
+       aead_request_set_tfm(req, tfm);
+       aead_request_set_ad(req, ctx->aead_assoclen);
+       aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
+-                                aead_async_cb, sk);
++                                aead_async_cb, req);
+       used -= ctx->aead_assoclen;
+ 
+       /* take over all tx sgls from ctx */
+diff --git a/crypto/lrw.c b/crypto/lrw.c
+index 3ea095adafd9..a8bfae4451bf 100644
+--- a/crypto/lrw.c
++++ b/crypto/lrw.c
+@@ -345,6 +345,13 @@ static void encrypt_done(struct crypto_async_request 
*areq, int err)
+       struct rctx *rctx;
+ 
+       rctx = skcipher_request_ctx(req);
++
++      if (err == -EINPROGRESS) {
++              if (rctx->left != req->cryptlen)
++                      return;
++              goto out;
++      }
++
+       subreq = &rctx->subreq;
+       subreq->base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
+ 
+@@ -352,6 +359,7 @@ static void encrypt_done(struct crypto_async_request 
*areq, int err)
+       if (rctx->left)
+               return;
+ 
++out:
+       skcipher_request_complete(req, err);
+ }
+ 
+@@ -389,6 +397,13 @@ static void decrypt_done(struct crypto_async_request 
*areq, int err)
+       struct rctx *rctx;
+ 
+       rctx = skcipher_request_ctx(req);
++
++      if (err == -EINPROGRESS) {
++              if (rctx->left != req->cryptlen)
++                      return;
++              goto out;
++      }
++
+       subreq = &rctx->subreq;
+       subreq->base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
+ 
+@@ -396,6 +411,7 @@ static void decrypt_done(struct crypto_async_request 
*areq, int err)
+       if (rctx->left)
+               return;
+ 
++out:
+       skcipher_request_complete(req, err);
+ }
+ 
+diff --git a/crypto/xts.c b/crypto/xts.c
+index c976bfac29da..89ace5ebc2da 100644
+--- a/crypto/xts.c
++++ b/crypto/xts.c
+@@ -286,6 +286,13 @@ static void encrypt_done(struct crypto_async_request 
*areq, int err)
+       struct rctx *rctx;
+ 
+       rctx = skcipher_request_ctx(req);
++
++      if (err == -EINPROGRESS) {
++              if (rctx->left != req->cryptlen)
++                      return;
++              goto out;
++      }
++
+       subreq = &rctx->subreq;
+       subreq->base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
+ 
+@@ -293,6 +300,7 @@ static void encrypt_done(struct crypto_async_request 
*areq, int err)
+       if (rctx->left)
+               return;
+ 
++out:
+       skcipher_request_complete(req, err);
+ }
+ 
+@@ -330,6 +338,13 @@ static void decrypt_done(struct crypto_async_request 
*areq, int err)
+       struct rctx *rctx;
+ 
+       rctx = skcipher_request_ctx(req);
++
++      if (err == -EINPROGRESS) {
++              if (rctx->left != req->cryptlen)
++                      return;
++              goto out;
++      }
++
+       subreq = &rctx->subreq;
+       subreq->base.flags &= CRYPTO_TFM_REQ_MAY_BACKLOG;
+ 
+@@ -337,6 +352,7 @@ static void decrypt_done(struct crypto_async_request 
*areq, int err)
+       if (rctx->left)
+               return;
+ 
++out:
+       skcipher_request_complete(req, err);
+ }
+ 
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 48e19d013170..22ca89242518 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -729,12 +729,12 @@ static void start_transaction(struct acpi_ec *ec)
+ 
+ static int ec_guard(struct acpi_ec *ec)
+ {
+-      unsigned long guard = usecs_to_jiffies(ec_polling_guard);
++      unsigned long guard = usecs_to_jiffies(ec->polling_guard);
+       unsigned long timeout = ec->timestamp + guard;
+ 
+       /* Ensure guarding period before polling EC status */
+       do {
+-              if (ec_busy_polling) {
++              if (ec->busy_polling) {
+                       /* Perform busy polling */
+                       if (ec_transaction_completed(ec))
+                               return 0;
+@@ -998,6 +998,28 @@ static void acpi_ec_stop(struct acpi_ec *ec, bool 
suspending)
+       spin_unlock_irqrestore(&ec->lock, flags);
+ }
+ 
++static void acpi_ec_enter_noirq(struct acpi_ec *ec)
++{
++      unsigned long flags;
++
++      spin_lock_irqsave(&ec->lock, flags);
++      ec->busy_polling = true;
++      ec->polling_guard = 0;
++      ec_log_drv("interrupt blocked");
++      spin_unlock_irqrestore(&ec->lock, flags);
++}
++
++static void acpi_ec_leave_noirq(struct acpi_ec *ec)
++{
++      unsigned long flags;
++
++      spin_lock_irqsave(&ec->lock, flags);
++      ec->busy_polling = ec_busy_polling;
++      ec->polling_guard = ec_polling_guard;
++      ec_log_drv("interrupt unblocked");
++      spin_unlock_irqrestore(&ec->lock, flags);
++}
++
+ void acpi_ec_block_transactions(void)
+ {
+       struct acpi_ec *ec = first_ec;
+@@ -1278,7 +1300,7 @@ acpi_ec_space_handler(u32 function, 
acpi_physical_address address,
+       if (function != ACPI_READ && function != ACPI_WRITE)
+               return AE_BAD_PARAMETER;
+ 
+-      if (ec_busy_polling || bits > 8)
++      if (ec->busy_polling || bits > 8)
+               acpi_ec_burst_enable(ec);
+ 
+       for (i = 0; i < bytes; ++i, ++address, ++value)
+@@ -1286,7 +1308,7 @@ acpi_ec_space_handler(u32 function, 
acpi_physical_address address,
+                       acpi_ec_read(ec, address, value) :
+                       acpi_ec_write(ec, address, *value);
+ 
+-      if (ec_busy_polling || bits > 8)
++      if (ec->busy_polling || bits > 8)
+               acpi_ec_burst_disable(ec);
+ 
+       switch (result) {
+@@ -1329,6 +1351,8 @@ static struct acpi_ec *acpi_ec_alloc(void)
+       spin_lock_init(&ec->lock);
+       INIT_WORK(&ec->work, acpi_ec_event_handler);
+       ec->timestamp = jiffies;
++      ec->busy_polling = true;
++      ec->polling_guard = 0;
+       return ec;
+ }
+ 
+@@ -1390,6 +1414,7 @@ static int ec_install_handlers(struct acpi_ec *ec, bool 
handle_events)
+       acpi_ec_start(ec, false);
+ 
+       if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
++              acpi_ec_enter_noirq(ec);
+               status = acpi_install_address_space_handler(ec->handle,
+                                                           ACPI_ADR_SPACE_EC,
+                                                           
&acpi_ec_space_handler,
+@@ -1429,6 +1454,7 @@ static int ec_install_handlers(struct acpi_ec *ec, bool 
handle_events)
+               /* This is not fatal as we can poll EC events */
+               if (ACPI_SUCCESS(status)) {
+                       set_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags);
++                      acpi_ec_leave_noirq(ec);
+                       if (test_bit(EC_FLAGS_STARTED, &ec->flags) &&
+                           ec->reference_count >= 1)
+                               acpi_ec_enable_gpe(ec, true);
+@@ -1839,34 +1865,6 @@ int __init acpi_ec_ecdt_probe(void)
+ }
+ 
+ #ifdef CONFIG_PM_SLEEP
+-static void acpi_ec_enter_noirq(struct acpi_ec *ec)
+-{
+-      unsigned long flags;
+-
+-      if (ec == first_ec) {
+-              spin_lock_irqsave(&ec->lock, flags);
+-              ec->saved_busy_polling = ec_busy_polling;
+-              ec->saved_polling_guard = ec_polling_guard;
+-              ec_busy_polling = true;
+-              ec_polling_guard = 0;
+-              ec_log_drv("interrupt blocked");
+-              spin_unlock_irqrestore(&ec->lock, flags);
+-      }
+-}
+-
+-static void acpi_ec_leave_noirq(struct acpi_ec *ec)
+-{
+-      unsigned long flags;
+-
+-      if (ec == first_ec) {
+-              spin_lock_irqsave(&ec->lock, flags);
+-              ec_busy_polling = ec->saved_busy_polling;
+-              ec_polling_guard = ec->saved_polling_guard;
+-              ec_log_drv("interrupt unblocked");
+-              spin_unlock_irqrestore(&ec->lock, flags);
+-      }
+-}
+-
+ static int acpi_ec_suspend_noirq(struct device *dev)
+ {
+       struct acpi_ec *ec =
+diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
+index 0c452265c111..219b90bc0922 100644
+--- a/drivers/acpi/internal.h
++++ b/drivers/acpi/internal.h
+@@ -172,8 +172,8 @@ struct acpi_ec {
+       struct work_struct work;
+       unsigned long timestamp;
+       unsigned long nr_pending_queries;
+-      bool saved_busy_polling;
+-      unsigned int saved_polling_guard;
++      bool busy_polling;
++      unsigned int polling_guard;
+ };
+ 
+ extern struct acpi_ec *first_ec;
+diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
+index 662036bdc65e..c8ea9d698cd0 100644
+--- a/drivers/acpi/nfit/core.c
++++ b/drivers/acpi/nfit/core.c
+@@ -1617,7 +1617,11 @@ static int cmp_map(const void *m0, const void *m1)
+       const struct nfit_set_info_map *map0 = m0;
+       const struct nfit_set_info_map *map1 = m1;
+ 
+-      return map0->region_offset - map1->region_offset;
++      if (map0->region_offset < map1->region_offset)
++              return -1;
++      else if (map0->region_offset > map1->region_offset)
++              return 1;
++      return 0;
+ }
+ 
+ /* Retrieve the nth entry referencing this spa */
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index 192691880d55..2433569b02ef 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -1857,15 +1857,20 @@ static void acpi_bus_attach(struct acpi_device *device)
+               return;
+ 
+       device->flags.match_driver = true;
+-      if (!ret) {
+-              ret = device_attach(&device->dev);
+-              if (ret < 0)
+-                      return;
+-
+-              if (!ret && device->pnp.type.platform_id)
+-                      acpi_default_enumeration(device);
++      if (ret > 0) {
++              acpi_device_set_enumerated(device);
++              goto ok;
+       }
+ 
++      ret = device_attach(&device->dev);
++      if (ret < 0)
++              return;
++
++      if (ret > 0 || !device->pnp.type.platform_id)
++              acpi_device_set_enumerated(device);
++      else
++              acpi_default_enumeration(device);
++
+  ok:
+       list_for_each_entry(child, &device->children, node)
+               acpi_bus_attach(child);
+diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
+index e5ab7d9e8c45..5b4b59be8b1f 100644
+--- a/drivers/block/zram/zram_drv.c
++++ b/drivers/block/zram/zram_drv.c
+@@ -583,13 +583,13 @@ static int zram_decompress_page(struct zram *zram, char 
*mem, u32 index)
+ 
+       if (!handle || zram_test_flag(meta, index, ZRAM_ZERO)) {
+               bit_spin_unlock(ZRAM_ACCESS, &meta->table[index].value);
+-              clear_page(mem);
++              memset(mem, 0, PAGE_SIZE);
+               return 0;
+       }
+ 
+       cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_RO);
+       if (size == PAGE_SIZE) {
+-              copy_page(mem, cmem);
++              memcpy(mem, cmem, PAGE_SIZE);
+       } else {
+               struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp);
+ 
+@@ -781,7 +781,7 @@ static int zram_bvec_write(struct zram *zram, struct 
bio_vec *bvec, u32 index,
+ 
+       if ((clen == PAGE_SIZE) && !is_partial_io(bvec)) {
+               src = kmap_atomic(page);
+-              copy_page(cmem, src);
++              memcpy(cmem, src, PAGE_SIZE);
+               kunmap_atomic(src);
+       } else {
+               memcpy(cmem, src, clen);
+diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
+index fde005ef9d36..4ee2a10207d0 100644
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -571,9 +571,12 @@ config TELCLOCK
+         controlling the behavior of this hardware.
+ 
+ config DEVPORT
+-      bool
++      bool "/dev/port character device"
+       depends on ISA || PCI
+       default y
++      help
++        Say Y here if you want to support the /dev/port device. The /dev/port
++        device is similar to /dev/mem, but for I/O ports.
+ 
+ source "drivers/s390/char/Kconfig"
+ 
+diff --git a/drivers/char/mem.c b/drivers/char/mem.c
+index 6d9cc2d39d22..7e4a9d1296bb 100644
+--- a/drivers/char/mem.c
++++ b/drivers/char/mem.c
+@@ -60,6 +60,10 @@ static inline int valid_mmap_phys_addr_range(unsigned long 
pfn, size_t size)
+ #endif
+ 
+ #ifdef CONFIG_STRICT_DEVMEM
++static inline int page_is_allowed(unsigned long pfn)
++{
++      return devmem_is_allowed(pfn);
++}
+ static inline int range_is_allowed(unsigned long pfn, unsigned long size)
+ {
+       u64 from = ((u64)pfn) << PAGE_SHIFT;
+@@ -75,6 +79,10 @@ static inline int range_is_allowed(unsigned long pfn, 
unsigned long size)
+       return 1;
+ }
+ #else
++static inline int page_is_allowed(unsigned long pfn)
++{
++      return 1;
++}
+ static inline int range_is_allowed(unsigned long pfn, unsigned long size)
+ {
+       return 1;
+@@ -122,23 +130,31 @@ static ssize_t read_mem(struct file *file, char __user 
*buf,
+ 
+       while (count > 0) {
+               unsigned long remaining;
++              int allowed;
+ 
+               sz = size_inside_page(p, count);
+ 
+-              if (!range_is_allowed(p >> PAGE_SHIFT, count))
++              allowed = page_is_allowed(p >> PAGE_SHIFT);
++              if (!allowed)
+                       return -EPERM;
++              if (allowed == 2) {
++                      /* Show zeros for restricted memory. */
++                      remaining = clear_user(buf, sz);
++              } else {
++                      /*
++                       * On ia64 if a page has been mapped somewhere as
++                       * uncached, then it must also be accessed uncached
++                       * by the kernel or data corruption may occur.
++                       */
++                      ptr = xlate_dev_mem_ptr(p);
++                      if (!ptr)
++                              return -EFAULT;
+ 
+-              /*
+-               * On ia64 if a page has been mapped somewhere as uncached, then
+-               * it must also be accessed uncached by the kernel or data
+-               * corruption may occur.
+-               */
+-              ptr = xlate_dev_mem_ptr(p);
+-              if (!ptr)
+-                      return -EFAULT;
++                      remaining = copy_to_user(buf, ptr, sz);
++
++                      unxlate_dev_mem_ptr(p, ptr);
++              }
+ 
+-              remaining = copy_to_user(buf, ptr, sz);
+-              unxlate_dev_mem_ptr(p, ptr);
+               if (remaining)
+                       return -EFAULT;
+ 
+@@ -181,30 +197,36 @@ static ssize_t write_mem(struct file *file, const char 
__user *buf,
+ #endif
+ 
+       while (count > 0) {
++              int allowed;
++
+               sz = size_inside_page(p, count);
+ 
+-              if (!range_is_allowed(p >> PAGE_SHIFT, sz))
++              allowed = page_is_allowed(p >> PAGE_SHIFT);
++              if (!allowed)
+                       return -EPERM;
+ 
+-              /*
+-               * On ia64 if a page has been mapped somewhere as uncached, then
+-               * it must also be accessed uncached by the kernel or data
+-               * corruption may occur.
+-               */
+-              ptr = xlate_dev_mem_ptr(p);
+-              if (!ptr) {
+-                      if (written)
+-                              break;
+-                      return -EFAULT;
+-              }
++              /* Skip actual writing when a page is marked as restricted. */
++              if (allowed == 1) {
++                      /*
++                       * On ia64 if a page has been mapped somewhere as
++                       * uncached, then it must also be accessed uncached
++                       * by the kernel or data corruption may occur.
++                       */
++                      ptr = xlate_dev_mem_ptr(p);
++                      if (!ptr) {
++                              if (written)
++                                      break;
++                              return -EFAULT;
++                      }
+ 
+-              copied = copy_from_user(ptr, buf, sz);
+-              unxlate_dev_mem_ptr(p, ptr);
+-              if (copied) {
+-                      written += sz - copied;
+-                      if (written)
+-                              break;
+-                      return -EFAULT;
++                      copied = copy_from_user(ptr, buf, sz);
++                      unxlate_dev_mem_ptr(p, ptr);
++                      if (copied) {
++                              written += sz - copied;
++                              if (written)
++                                      break;
++                              return -EFAULT;
++                      }
+               }
+ 
+               buf += sz;
+diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
+index 17857beb4892..3cbf4c95e446 100644
+--- a/drivers/char/virtio_console.c
++++ b/drivers/char/virtio_console.c
+@@ -1136,6 +1136,8 @@ static int put_chars(u32 vtermno, const char *buf, int 
count)
+ {
+       struct port *port;
+       struct scatterlist sg[1];
++      void *data;
++      int ret;
+ 
+       if (unlikely(early_put_chars))
+               return early_put_chars(vtermno, buf, count);
+@@ -1144,8 +1146,14 @@ static int put_chars(u32 vtermno, const char *buf, int 
count)
+       if (!port)
+               return -EPIPE;
+ 
+-      sg_init_one(sg, buf, count);
+-      return __send_to_port(port, sg, 1, count, (void *)buf, false);
++      data = kmemdup(buf, count, GFP_ATOMIC);
++      if (!data)
++              return -ENOMEM;
++
++      sg_init_one(sg, data, count);
++      ret = __send_to_port(port, sg, 1, count, data, false);
++      kfree(data);
++      return ret;
+ }
+ 
+ /*
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
+index 0af2229b09fb..791e1ef25baf 100644
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -2405,6 +2405,20 @@ EXPORT_SYMBOL_GPL(cpufreq_boost_enabled);
+  *********************************************************************/
+ static enum cpuhp_state hp_online;
+ 
++static int cpuhp_cpufreq_online(unsigned int cpu)
++{
++      cpufreq_online(cpu);
++
++      return 0;
++}
++
++static int cpuhp_cpufreq_offline(unsigned int cpu)
++{
++      cpufreq_offline(cpu);
++
++      return 0;
++}
++
+ /**
+  * cpufreq_register_driver - register a CPU Frequency driver
+  * @driver_data: A struct cpufreq_driver containing the values#
+@@ -2467,8 +2481,8 @@ int cpufreq_register_driver(struct cpufreq_driver 
*driver_data)
+       }
+ 
+       ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "cpufreq:online",
+-                                      cpufreq_online,
+-                                      cpufreq_offline);
++                                      cpuhp_cpufreq_online,
++                                      cpuhp_cpufreq_offline);
+       if (ret < 0)
+               goto err_if_unreg;
+       hp_online = ret;
+diff --git a/drivers/firmware/efi/libstub/gop.c 
b/drivers/firmware/efi/libstub/gop.c
+index 932742e4cf23..24c461dea7af 100644
+--- a/drivers/firmware/efi/libstub/gop.c
++++ b/drivers/firmware/efi/libstub/gop.c
+@@ -149,7 +149,8 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+ 
+               status = __gop_query32(sys_table_arg, gop32, &info, &size,
+                                      &current_fb_base);
+-              if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
++              if (status == EFI_SUCCESS && (!first_gop || conout_found) &&
++                  info->pixel_format != PIXEL_BLT_ONLY) {
+                       /*
+                        * Systems that use the UEFI Console Splitter may
+                        * provide multiple GOP devices, not all of which are
+@@ -266,7 +267,8 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+ 
+               status = __gop_query64(sys_table_arg, gop64, &info, &size,
+                                      &current_fb_base);
+-              if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
++              if (status == EFI_SUCCESS && (!first_gop || conout_found) &&
++                  info->pixel_format != PIXEL_BLT_ONLY) {
+                       /*
+                        * Systems that use the UEFI Console Splitter may
+                        * provide multiple GOP devices, not all of which are
+diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
+index ad531126667c..e3da97b409bc 100644
+--- a/drivers/gpu/drm/drm_fb_helper.c
++++ b/drivers/gpu/drm/drm_fb_helper.c
+@@ -1256,9 +1256,9 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo 
*var,
+        * to KMS, hence fail if different settings are requested.
+        */
+       if (var->bits_per_pixel != fb->bits_per_pixel ||
+-          var->xres != fb->width || var->yres != fb->height ||
+-          var->xres_virtual != fb->width || var->yres_virtual != fb->height) {
+-              DRM_DEBUG("fb userspace requested width/height/bpp different 
than current fb "
++          var->xres > fb->width || var->yres > fb->height ||
++          var->xres_virtual > fb->width || var->yres_virtual > fb->height) {
++              DRM_DEBUG("fb requested width/height/bpp can't fit in current 
fb "
+                         "request %dx%d-%d (virtual %dx%d) > %dx%d-%d\n",
+                         var->xres, var->yres, var->bits_per_pixel,
+                         var->xres_virtual, var->yres_virtual,
+diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c 
b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+index db0a43a090d0..34ffe6e1f6d0 100644
+--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
++++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
+@@ -1309,7 +1309,7 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
+       if (!fence) {
+               event_free(gpu, event);
+               ret = -ENOMEM;
+-              goto out_pm_put;
++              goto out_unlock;
+       }
+ 
+       gpu->event[event].fence = fence;
+@@ -1349,6 +1349,7 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
+       hangcheck_timer_reset(gpu);
+       ret = 0;
+ 
++out_unlock:
+       mutex_unlock(&gpu->lock);
+ 
+ out_pm_put:
+diff --git a/drivers/gpu/drm/i915/gvt/execlist.c 
b/drivers/gpu/drm/i915/gvt/execlist.c
+index 34083731669d..6804bf5fec3a 100644
+--- a/drivers/gpu/drm/i915/gvt/execlist.c
++++ b/drivers/gpu/drm/i915/gvt/execlist.c
+@@ -778,7 +778,8 @@ static void init_vgpu_execlist(struct intel_vgpu *vgpu, 
int ring_id)
+                       _EL_OFFSET_STATUS_PTR);
+ 
+       ctx_status_ptr.dw = vgpu_vreg(vgpu, ctx_status_ptr_reg);
+-      ctx_status_ptr.read_ptr = ctx_status_ptr.write_ptr = 0x7;
++      ctx_status_ptr.read_ptr = 0;
++      ctx_status_ptr.write_ptr = 0x7;
+       vgpu_vreg(vgpu, ctx_status_ptr_reg) = ctx_status_ptr.dw;
+ }
+ 
+diff --git a/drivers/gpu/drm/nouveau/nv50_display.c 
b/drivers/gpu/drm/nouveau/nv50_display.c
+index 32097fd615fd..96b510871631 100644
+--- a/drivers/gpu/drm/nouveau/nv50_display.c
++++ b/drivers/gpu/drm/nouveau/nv50_display.c
+@@ -995,7 +995,6 @@ nv50_wndw_atomic_destroy_state(struct drm_plane *plane,
+ {
+       struct nv50_wndw_atom *asyw = nv50_wndw_atom(state);
+       __drm_atomic_helper_plane_destroy_state(&asyw->state);
+-      dma_fence_put(asyw->state.fence);
+       kfree(asyw);
+ }
+ 
+@@ -1007,7 +1006,6 @@ nv50_wndw_atomic_duplicate_state(struct drm_plane *plane)
+       if (!(asyw = kmalloc(sizeof(*asyw), GFP_KERNEL)))
+               return NULL;
+       __drm_atomic_helper_plane_duplicate_state(plane, &asyw->state);
+-      asyw->state.fence = NULL;
+       asyw->interval = 1;
+       asyw->sema = armw->sema;
+       asyw->ntfy = armw->ntfy;
+@@ -2038,6 +2036,7 @@ nv50_head_atomic_check_mode(struct nv50_head *head, 
struct nv50_head_atom *asyh)
+       u32 vbackp  = (mode->vtotal - mode->vsync_end) * vscan / ilace;
+       u32 hfrontp =  mode->hsync_start - mode->hdisplay;
+       u32 vfrontp = (mode->vsync_start - mode->vdisplay) * vscan / ilace;
++      u32 blankus;
+       struct nv50_head_mode *m = &asyh->mode;
+ 
+       m->h.active = mode->htotal;
+@@ -2051,9 +2050,10 @@ nv50_head_atomic_check_mode(struct nv50_head *head, 
struct nv50_head_atom *asyh)
+       m->v.blanks = m->v.active - vfrontp - 1;
+ 
+       /*XXX: Safe underestimate, even "0" works */
+-      m->v.blankus = (m->v.active - mode->vdisplay - 2) * m->h.active;
+-      m->v.blankus *= 1000;
+-      m->v.blankus /= mode->clock;
++      blankus = (m->v.active - mode->vdisplay - 2) * m->h.active;
++      blankus *= 1000;
++      blankus /= mode->clock;
++      m->v.blankus = blankus;
+ 
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
+               m->v.blank2e =  m->v.active + m->v.synce + vbackp;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+index cceda959b47c..c2f7f6755aec 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/base.c
+@@ -714,7 +714,7 @@ nv4a_chipset = {
+       .i2c = nv04_i2c_new,
+       .imem = nv40_instmem_new,
+       .mc = nv44_mc_new,
+-      .mmu = nv44_mmu_new,
++      .mmu = nv04_mmu_new,
+       .pci = nv40_pci_new,
+       .therm = nv40_therm_new,
+       .timer = nv41_timer_new,
+@@ -2270,6 +2270,35 @@ nv136_chipset = {
+       .fifo = gp100_fifo_new,
+ };
+ 
++static const struct nvkm_device_chip
++nv137_chipset = {
++      .name = "GP107",
++      .bar = gf100_bar_new,
++      .bios = nvkm_bios_new,
++      .bus = gf100_bus_new,
++      .devinit = gm200_devinit_new,
++      .fb = gp102_fb_new,
++      .fuse = gm107_fuse_new,
++      .gpio = gk104_gpio_new,
++      .i2c = gm200_i2c_new,
++      .ibus = gm200_ibus_new,
++      .imem = nv50_instmem_new,
++      .ltc = gp100_ltc_new,
++      .mc = gp100_mc_new,
++      .mmu = gf100_mmu_new,
++      .pci = gp100_pci_new,
++      .pmu = gp102_pmu_new,
++      .timer = gk20a_timer_new,
++      .top = gk104_top_new,
++      .ce[0] = gp102_ce_new,
++      .ce[1] = gp102_ce_new,
++      .ce[2] = gp102_ce_new,
++      .ce[3] = gp102_ce_new,
++      .disp = gp102_disp_new,
++      .dma = gf119_dma_new,
++      .fifo = gp100_fifo_new,
++};
++
+ static int
+ nvkm_device_event_ctor(struct nvkm_object *object, void *data, u32 size,
+                      struct nvkm_notify *notify)
+@@ -2707,6 +2736,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
+               case 0x132: device->chip = &nv132_chipset; break;
+               case 0x134: device->chip = &nv134_chipset; break;
+               case 0x136: device->chip = &nv136_chipset; break;
++              case 0x137: device->chip = &nv137_chipset; break;
+               default:
+                       nvdev_error(device, "unknown chipset (%08x)\n", boot0);
+                       goto done;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c
+index 003ac915eaad..8a8895246d26 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c
+@@ -198,7 +198,7 @@ nv31_mpeg_intr(struct nvkm_engine *engine)
+               }
+ 
+               if (type == 0x00000010) {
+-                      if (!nv31_mpeg_mthd(mpeg, mthd, data))
++                      if (nv31_mpeg_mthd(mpeg, mthd, data))
+                               show &= ~0x01000000;
+               }
+       }
+diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
+index e536f37e24b0..c3cf02ed468e 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
++++ b/drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
+@@ -172,7 +172,7 @@ nv44_mpeg_intr(struct nvkm_engine *engine)
+               }
+ 
+               if (type == 0x00000010) {
+-                      if (!nv44_mpeg_mthd(subdev->device, mthd, data))
++                      if (nv44_mpeg_mthd(subdev->device, mthd, data))
+                               show &= ~0x01000000;
+               }
+       }
+diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
+index c7d5b2b643d1..b9f48d4e155a 100644
+--- a/drivers/input/joystick/xpad.c
++++ b/drivers/input/joystick/xpad.c
+@@ -202,6 +202,7 @@ static const struct xpad_device {
+       { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", 
MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
+       { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, 
XTYPE_XBOX360 },
+       { 0x1532, 0x0037, "Razer Sabertooth", 0, XTYPE_XBOX360 },
++      { 0x1532, 0x0a03, "Razer Wildcat", 0, XTYPE_XBOXONE },
+       { 0x15e4, 0x3f00, "Power A Mini Pro Elite", 0, XTYPE_XBOX360 },
+       { 0x15e4, 0x3f0a, "Xbox Airflo wired controller", 0, XTYPE_XBOX360 },
+       { 0x15e4, 0x3f10, "Batarang Xbox 360 controller", 0, XTYPE_XBOX360 },
+@@ -330,6 +331,7 @@ static struct usb_device_id xpad_table[] = {
+       XPAD_XBOX360_VENDOR(0x24c6),            /* PowerA Controllers */
+       XPAD_XBOXONE_VENDOR(0x24c6),            /* PowerA Controllers */
+       XPAD_XBOX360_VENDOR(0x1532),            /* Razer Sabertooth */
++      XPAD_XBOXONE_VENDOR(0x1532),            /* Razer Wildcat */
+       XPAD_XBOX360_VENDOR(0x15e4),            /* Numark X-Box 360 controllers 
*/
+       XPAD_XBOX360_VENDOR(0x162e),            /* Joytech X-Box 360 
controllers */
+       { }
+diff --git a/drivers/irqchip/irq-imx-gpcv2.c b/drivers/irqchip/irq-imx-gpcv2.c
+index 15af9a9753e5..2d203b422129 100644
+--- a/drivers/irqchip/irq-imx-gpcv2.c
++++ b/drivers/irqchip/irq-imx-gpcv2.c
+@@ -230,6 +230,8 @@ static int __init imx_gpcv2_irqchip_init(struct 
device_node *node,
+               return -ENOMEM;
+       }
+ 
++      raw_spin_lock_init(&cd->rlock);
++
+       cd->gpc_base = of_iomap(node, 0);
+       if (!cd->gpc_base) {
+               pr_err("fsl-gpcv2: unable to map gpc registers\n");
+diff --git a/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c 
b/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
+index a8e6624fbe83..a9bb2dde98ea 100644
+--- a/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
++++ b/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
+@@ -1013,8 +1013,8 @@ EXPORT_SYMBOL(dvb_usbv2_probe);
+ void dvb_usbv2_disconnect(struct usb_interface *intf)
+ {
+       struct dvb_usb_device *d = usb_get_intfdata(intf);
+-      const char *name = d->name;
+-      struct device dev = d->udev->dev;
++      const char *devname = kstrdup(dev_name(&d->udev->dev), GFP_KERNEL);
++      const char *drvname = d->name;
+ 
+       dev_dbg(&d->udev->dev, "%s: bInterfaceNumber=%d\n", __func__,
+                       intf->cur_altsetting->desc.bInterfaceNumber);
+@@ -1024,8 +1024,9 @@ void dvb_usbv2_disconnect(struct usb_interface *intf)
+ 
+       dvb_usbv2_exit(d);
+ 
+-      dev_info(&dev, "%s: '%s' successfully deinitialized and disconnected\n",
+-                      KBUILD_MODNAME, name);
++      pr_info("%s: '%s:%s' successfully deinitialized and disconnected\n",
++              KBUILD_MODNAME, drvname, devname);
++      kfree(devname);
+ }
+ EXPORT_SYMBOL(dvb_usbv2_disconnect);
+ 
+diff --git a/drivers/media/usb/dvb-usb/cxusb.c 
b/drivers/media/usb/dvb-usb/cxusb.c
+index 9b8771eb31d4..a10961948f8c 100644
+--- a/drivers/media/usb/dvb-usb/cxusb.c
++++ b/drivers/media/usb/dvb-usb/cxusb.c
+@@ -59,23 +59,24 @@ static int cxusb_ctrl_msg(struct dvb_usb_device *d,
+                         u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
+ {
+       struct cxusb_state *st = d->priv;
+-      int ret, wo;
++      int ret;
+ 
+       if (1 + wlen > MAX_XFER_SIZE) {
+               warn("i2c wr: len=%d is too big!\n", wlen);
+               return -EOPNOTSUPP;
+       }
+ 
+-      wo = (rbuf == NULL || rlen == 0); /* write-only */
++      if (rlen > MAX_XFER_SIZE) {
++              warn("i2c rd: len=%d is too big!\n", rlen);
++              return -EOPNOTSUPP;
++      }
+ 
+       mutex_lock(&d->data_mutex);
+       st->data[0] = cmd;
+       memcpy(&st->data[1], wbuf, wlen);
+-      if (wo)
+-              ret = dvb_usb_generic_write(d, st->data, 1 + wlen);
+-      else
+-              ret = dvb_usb_generic_rw(d, st->data, 1 + wlen,
+-                                       rbuf, rlen, 0);
++      ret = dvb_usb_generic_rw(d, st->data, 1 + wlen, st->data, rlen, 0);
++      if (!ret && rbuf && rlen)
++              memcpy(rbuf, st->data, rlen);
+ 
+       mutex_unlock(&d->data_mutex);
+       return ret;
+diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c 
b/drivers/net/can/ifi_canfd/ifi_canfd.c
+index 368bb0710d8f..481895b2f9f4 100644
+--- a/drivers/net/can/ifi_canfd/ifi_canfd.c
++++ b/drivers/net/can/ifi_canfd/ifi_canfd.c
+@@ -557,7 +557,7 @@ static int ifi_canfd_poll(struct napi_struct *napi, int 
quota)
+       int work_done = 0;
+ 
+       u32 stcmd = readl(priv->base + IFI_CANFD_STCMD);
+-      u32 rxstcmd = readl(priv->base + IFI_CANFD_STCMD);
++      u32 rxstcmd = readl(priv->base + IFI_CANFD_RXSTCMD);
+       u32 errctr = readl(priv->base + IFI_CANFD_ERROR_CTR);
+ 
+       /* Handle bus state changes */
+diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
+index 23d4a1728cdf..351bac8f6503 100644
+--- a/drivers/nvdimm/bus.c
++++ b/drivers/nvdimm/bus.c
+@@ -934,8 +934,14 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, 
struct nvdimm *nvdimm,
+       rc = nd_desc->ndctl(nd_desc, nvdimm, cmd, buf, buf_len, NULL);
+       if (rc < 0)
+               goto out_unlock;
++      nvdimm_bus_unlock(&nvdimm_bus->dev);
++
+       if (copy_to_user(p, buf, buf_len))
+               rc = -EFAULT;
++
++      vfree(buf);
++      return rc;
++
+  out_unlock:
+       nvdimm_bus_unlock(&nvdimm_bus->dev);
+  out:
+diff --git a/drivers/nvdimm/claim.c b/drivers/nvdimm/claim.c
+index b3323c0697f6..ca6d572c48fc 100644
+--- a/drivers/nvdimm/claim.c
++++ b/drivers/nvdimm/claim.c
+@@ -243,7 +243,15 @@ static int nsio_rw_bytes(struct nd_namespace_common *ndns,
+       }
+ 
+       if (unlikely(is_bad_pmem(&nsio->bb, sector, sz_align))) {
+-              if (IS_ALIGNED(offset, 512) && IS_ALIGNED(size, 512)) {
++              /*
++               * FIXME: nsio_rw_bytes() may be called from atomic
++               * context in the btt case and nvdimm_clear_poison()
++               * takes a sleeping lock. Until the locking can be
++               * reworked this capability requires that the namespace
++               * is not claimed by btt.
++               */
++              if (IS_ALIGNED(offset, 512) && IS_ALIGNED(size, 512)
++                              && (!ndns->claim || !is_nd_btt(ndns->claim))) {
+                       long cleared;
+ 
+                       cleared = nvdimm_clear_poison(&ndns->dev, offset, size);
+diff --git a/drivers/nvdimm/dimm_devs.c b/drivers/nvdimm/dimm_devs.c
+index 0eedc49e0d47..8b721321be5b 100644
+--- a/drivers/nvdimm/dimm_devs.c
++++ b/drivers/nvdimm/dimm_devs.c
+@@ -395,7 +395,7 @@ EXPORT_SYMBOL_GPL(nvdimm_create);
+ 
+ int alias_dpa_busy(struct device *dev, void *data)
+ {
+-      resource_size_t map_end, blk_start, new, busy;
++      resource_size_t map_end, blk_start, new;
+       struct blk_alloc_info *info = data;
+       struct nd_mapping *nd_mapping;
+       struct nd_region *nd_region;
+@@ -436,29 +436,19 @@ int alias_dpa_busy(struct device *dev, void *data)
+  retry:
+       /*
+        * Find the free dpa from the end of the last pmem allocation to
+-       * the end of the interleave-set mapping that is not already
+-       * covered by a blk allocation.
++       * the end of the interleave-set mapping.
+        */
+-      busy = 0;
+       for_each_dpa_resource(ndd, res) {
++              if (strncmp(res->name, "pmem", 4) != 0)
++                      continue;
+               if ((res->start >= blk_start && res->start < map_end)
+                               || (res->end >= blk_start
+                                       && res->end <= map_end)) {
+-                      if (strncmp(res->name, "pmem", 4) == 0) {
+-                              new = max(blk_start, min(map_end + 1,
+-                                                      res->end + 1));
+-                              if (new != blk_start) {
+-                                      blk_start = new;
+-                                      goto retry;
+-                              }
+-                      } else
+-                              busy += min(map_end, res->end)
+-                                      - max(nd_mapping->start, res->start) + 
1;
+-              } else if (nd_mapping->start > res->start
+-                              && map_end < res->end) {
+-                      /* total eclipse of the PMEM region mapping */
+-                      busy += nd_mapping->size;
+-                      break;
++                      new = max(blk_start, min(map_end + 1, res->end + 1));
++                      if (new != blk_start) {
++                              blk_start = new;
++                              goto retry;
++                      }
+               }
+       }
+ 
+@@ -470,52 +460,11 @@ int alias_dpa_busy(struct device *dev, void *data)
+               return 1;
+       }
+ 
+-      info->available -= blk_start - nd_mapping->start + busy;
++      info->available -= blk_start - nd_mapping->start;
+ 
+       return 0;
+ }
+ 
+-static int blk_dpa_busy(struct device *dev, void *data)
+-{
+-      struct blk_alloc_info *info = data;
+-      struct nd_mapping *nd_mapping;
+-      struct nd_region *nd_region;
+-      resource_size_t map_end;
+-      int i;
+-
+-      if (!is_nd_pmem(dev))
+-              return 0;
+-
+-      nd_region = to_nd_region(dev);
+-      for (i = 0; i < nd_region->ndr_mappings; i++) {
+-              nd_mapping  = &nd_region->mapping[i];
+-              if (nd_mapping->nvdimm == info->nd_mapping->nvdimm)
+-                      break;
+-      }
+-
+-      if (i >= nd_region->ndr_mappings)
+-              return 0;
+-
+-      map_end = nd_mapping->start + nd_mapping->size - 1;
+-      if (info->res->start >= nd_mapping->start
+-                      && info->res->start < map_end) {
+-              if (info->res->end <= map_end) {
+-                      info->busy = 0;
+-                      return 1;
+-              } else {
+-                      info->busy -= info->res->end - map_end;
+-                      return 0;
+-              }
+-      } else if (info->res->end >= nd_mapping->start
+-                      && info->res->end <= map_end) {
+-              info->busy -= nd_mapping->start - info->res->start;
+-              return 0;
+-      } else {
+-              info->busy -= nd_mapping->size;
+-              return 0;
+-      }
+-}
+-
+ /**
+  * nd_blk_available_dpa - account the unused dpa of BLK region
+  * @nd_mapping: container of dpa-resource-root + labels
+@@ -545,11 +494,7 @@ resource_size_t nd_blk_available_dpa(struct nd_region 
*nd_region)
+       for_each_dpa_resource(ndd, res) {
+               if (strncmp(res->name, "blk", 3) != 0)
+                       continue;
+-
+-              info.res = res;
+-              info.busy = resource_size(res);
+-              device_for_each_child(&nvdimm_bus->dev, &info, blk_dpa_busy);
+-              info.available -= info.busy;
++              info.available -= resource_size(res);
+       }
+ 
+       return info.available;
+diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
+index a66192f692e3..c29b9b611ab2 100644
+--- a/drivers/platform/x86/acer-wmi.c
++++ b/drivers/platform/x86/acer-wmi.c
+@@ -1846,11 +1846,24 @@ static int __init acer_wmi_enable_lm(void)
+       return status;
+ }
+ 
++#define ACER_WMID_ACCEL_HID   "BST0001"
++
+ static acpi_status __init acer_wmi_get_handle_cb(acpi_handle ah, u32 level,
+                                               void *ctx, void **retval)
+ {
++      struct acpi_device *dev;
++
++      if (!strcmp(ctx, "SENR")) {
++              if (acpi_bus_get_device(ah, &dev))
++                      return AE_OK;
++              if (!strcmp(ACER_WMID_ACCEL_HID, acpi_device_hid(dev)))
++                      return AE_OK;
++      } else
++              return AE_OK;
++
+       *(acpi_handle *)retval = ah;
+-      return AE_OK;
++
++      return AE_CTRL_TERMINATE;
+ }
+ 
+ static int __init acer_wmi_get_handle(const char *name, const char *prop,
+@@ -1877,7 +1890,7 @@ static int __init acer_wmi_accel_setup(void)
+ {
+       int err;
+ 
+-      err = acer_wmi_get_handle("SENR", "BST0001", &gsensor_handle);
++      err = acer_wmi_get_handle("SENR", ACER_WMID_ACCEL_HID, &gsensor_handle);
+       if (err)
+               return err;
+ 
+@@ -2233,10 +2246,11 @@ static int __init acer_wmi_init(void)
+               err = acer_wmi_input_setup();
+               if (err)
+                       return err;
++              err = acer_wmi_accel_setup();
++              if (err)
++                      return err;
+       }
+ 
+-      acer_wmi_accel_setup();
+-
+       err = platform_driver_register(&acer_platform_driver);
+       if (err) {
+               pr_err("Unable to register platform driver\n");
+diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c
+index ef89df1f7336..744d56197286 100644
+--- a/drivers/pwm/pwm-rockchip.c
++++ b/drivers/pwm/pwm-rockchip.c
+@@ -191,6 +191,28 @@ static int rockchip_pwm_config(struct pwm_chip *chip, 
struct pwm_device *pwm,
+       return 0;
+ }
+ 
++static int rockchip_pwm_enable(struct pwm_chip *chip,
++                       struct pwm_device *pwm,
++                       bool enable,
++                       enum pwm_polarity polarity)
++{
++      struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
++      int ret;
++
++      if (enable) {
++              ret = clk_enable(pc->clk);
++              if (ret)
++                      return ret;
++      }
++
++      pc->data->set_enable(chip, pwm, enable, polarity);
++
++      if (!enable)
++              clk_disable(pc->clk);
++
++      return 0;
++}
++
+ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+                             struct pwm_state *state)
+ {
+@@ -207,22 +229,26 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, 
struct pwm_device *pwm,
+               return ret;
+ 
+       if (state->polarity != curstate.polarity && enabled) {
+-              pc->data->set_enable(chip, pwm, false, state->polarity);
++              ret = rockchip_pwm_enable(chip, pwm, false, state->polarity);
++              if (ret)
++                      goto out;
+               enabled = false;
+       }
+ 
+       ret = rockchip_pwm_config(chip, pwm, state->duty_cycle, state->period);
+       if (ret) {
+               if (enabled != curstate.enabled)
+-                      pc->data->set_enable(chip, pwm, !enabled,
+-                                           state->polarity);
+-
++                      rockchip_pwm_enable(chip, pwm, !enabled,
++                                    state->polarity);
+               goto out;
+       }
+ 
+-      if (state->enabled != enabled)
+-              pc->data->set_enable(chip, pwm, state->enabled,
+-                                   state->polarity);
++      if (state->enabled != enabled) {
++              ret = rockchip_pwm_enable(chip, pwm, state->enabled,
++                                  state->polarity);
++              if (ret)
++                      goto out;
++      }
+ 
+       /*
+        * Update the state with the real hardware, which can differ a bit
+diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c
+index 3853ba963bb5..19e03d0b956b 100644
+--- a/drivers/rtc/rtc-tegra.c
++++ b/drivers/rtc/rtc-tegra.c
+@@ -18,6 +18,7 @@
+  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+  */
+ #include <linux/kernel.h>
++#include <linux/clk.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+@@ -59,6 +60,7 @@ struct tegra_rtc_info {
+       struct platform_device  *pdev;
+       struct rtc_device       *rtc_dev;
+       void __iomem            *rtc_base; /* NULL if not initialized. */
++      struct clk              *clk;
+       int                     tegra_rtc_irq; /* alarm and periodic irq */
+       spinlock_t              tegra_rtc_lock;
+ };
+@@ -326,6 +328,14 @@ static int __init tegra_rtc_probe(struct platform_device 
*pdev)
+       if (info->tegra_rtc_irq <= 0)
+               return -EBUSY;
+ 
++      info->clk = devm_clk_get(&pdev->dev, NULL);
++      if (IS_ERR(info->clk))
++              return PTR_ERR(info->clk);
++
++      ret = clk_prepare_enable(info->clk);
++      if (ret < 0)
++              return ret;
++
+       /* set context info. */
+       info->pdev = pdev;
+       spin_lock_init(&info->tegra_rtc_lock);
+@@ -346,7 +356,7 @@ static int __init tegra_rtc_probe(struct platform_device 
*pdev)
+               ret = PTR_ERR(info->rtc_dev);
+               dev_err(&pdev->dev, "Unable to register device (err=%d).\n",
+                       ret);
+-              return ret;
++              goto disable_clk;
+       }
+ 
+       ret = devm_request_irq(&pdev->dev, info->tegra_rtc_irq,
+@@ -356,12 +366,25 @@ static int __init tegra_rtc_probe(struct platform_device 
*pdev)
+               dev_err(&pdev->dev,
+                       "Unable to request interrupt for device (err=%d).\n",
+                       ret);
+-              return ret;
++              goto disable_clk;
+       }
+ 
+       dev_notice(&pdev->dev, "Tegra internal Real Time Clock\n");
+ 
+       return 0;
++
++disable_clk:
++      clk_disable_unprepare(info->clk);
++      return ret;
++}
++
++static int tegra_rtc_remove(struct platform_device *pdev)
++{
++      struct tegra_rtc_info *info = platform_get_drvdata(pdev);
++
++      clk_disable_unprepare(info->clk);
++
++      return 0;
+ }
+ 
+ #ifdef CONFIG_PM_SLEEP
+@@ -413,6 +436,7 @@ static void tegra_rtc_shutdown(struct platform_device 
*pdev)
+ 
+ MODULE_ALIAS("platform:tegra_rtc");
+ static struct platform_driver tegra_rtc_driver = {
++      .remove         = tegra_rtc_remove,
+       .shutdown       = tegra_rtc_shutdown,
+       .driver         = {
+               .name   = "tegra_rtc",
+diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
+index dc79524178ad..f72fe724074d 100644
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -1125,8 +1125,13 @@ static inline
+ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha)
+ {
+       struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
++      struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82;
+ 
+-      return ((RD_REG_DWORD(&reg->host_status)) == ISP_REG_DISCONNECT);
++      if (IS_P3P_TYPE(ha))
++              return ((RD_REG_DWORD(&reg82->host_int)) == ISP_REG_DISCONNECT);
++      else
++              return ((RD_REG_DWORD(&reg->host_status)) ==
++                      ISP_REG_DISCONNECT);
+ }
+ 
+ /**************************************************************************
+diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
+index 1ee57619c95e..d3886917b2ea 100644
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -2109,6 +2109,22 @@ static void read_capacity_error(struct scsi_disk *sdkp, 
struct scsi_device *sdp,
+ 
+ #define READ_CAPACITY_RETRIES_ON_RESET        10
+ 
++/*
++ * Ensure that we don't overflow sector_t when CONFIG_LBDAF is not set
++ * and the reported logical block size is bigger than 512 bytes. Note
++ * that last_sector is a u64 and therefore logical_to_sectors() is not
++ * applicable.
++ */
++static bool sd_addressable_capacity(u64 lba, unsigned int sector_size)
++{
++      u64 last_sector = (lba + 1ULL) << (ilog2(sector_size) - 9);
++
++      if (sizeof(sector_t) == 4 && last_sector > U32_MAX)
++              return false;
++
++      return true;
++}
++
+ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
+                                               unsigned char *buffer)
+ {
+@@ -2174,7 +2190,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, 
struct scsi_device *sdp,
+               return -ENODEV;
+       }
+ 
+-      if ((sizeof(sdkp->capacity) == 4) && (lba >= 0xffffffffULL)) {
++      if (!sd_addressable_capacity(lba, sector_size)) {
+               sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
+                       "kernel compiled with support for large block "
+                       "devices.\n");
+@@ -2263,7 +2279,7 @@ static int read_capacity_10(struct scsi_disk *sdkp, 
struct scsi_device *sdp,
+               return sector_size;
+       }
+ 
+-      if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) {
++      if (!sd_addressable_capacity(lba, sector_size)) {
+               sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a "
+                       "kernel compiled with support for large block "
+                       "devices.\n");
+@@ -2963,7 +2979,8 @@ static int sd_revalidate_disk(struct gendisk *disk)
+               q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks);
+               rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks);
+       } else
+-              rw_max = BLK_DEF_MAX_SECTORS;
++              rw_max = min_not_zero(logical_to_sectors(sdp, dev_max),
++                                    (sector_t)BLK_DEF_MAX_SECTORS);
+ 
+       /* Combine with controller limits */
+       q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q));
+diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
+index 94352e4df831..94b0aacefae6 100644
+--- a/drivers/scsi/sr.c
++++ b/drivers/scsi/sr.c
+@@ -833,6 +833,7 @@ static void get_capabilities(struct scsi_cd *cd)
+       unsigned char *buffer;
+       struct scsi_mode_data data;
+       struct scsi_sense_hdr sshdr;
++      unsigned int ms_len = 128;
+       int rc, n;
+ 
+       static const char *loadmech[] =
+@@ -859,10 +860,11 @@ static void get_capabilities(struct scsi_cd *cd)
+       scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
+ 
+       /* ask for mode page 0x2a */
+-      rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128,
++      rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
+                            SR_TIMEOUT, 3, &data, NULL);
+ 
+-      if (!scsi_status_is_good(rc)) {
++      if (!scsi_status_is_good(rc) || data.length > ms_len ||
++          data.header_length + data.block_descriptor_length > data.length) {
+               /* failed, drive doesn't have capabilities mode page */
+               cd->cdi.speed = 1;
+               cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |
+diff --git a/drivers/target/iscsi/iscsi_target_parameters.c 
b/drivers/target/iscsi/iscsi_target_parameters.c
+index e65bf78ceef3..fce627628200 100644
+--- a/drivers/target/iscsi/iscsi_target_parameters.c
++++ b/drivers/target/iscsi/iscsi_target_parameters.c
+@@ -782,22 +782,6 @@ static void 
iscsi_check_proposer_for_optional_reply(struct iscsi_param *param)
+               if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH))
+                       SET_PSTATE_REPLY_OPTIONAL(param);
+               /*
+-               * The GlobalSAN iSCSI Initiator for MacOSX does
+-               * not respond to MaxBurstLength, FirstBurstLength,
+-               * DefaultTime2Wait or DefaultTime2Retain parameter keys.
+-               * So, we set them to 'reply optional' here, and assume the
+-               * the defaults from iscsi_parameters.h if the initiator
+-               * is not RFC compliant and the keys are not negotiated.
+-               */
+-              if (!strcmp(param->name, MAXBURSTLENGTH))
+-                      SET_PSTATE_REPLY_OPTIONAL(param);
+-              if (!strcmp(param->name, FIRSTBURSTLENGTH))
+-                      SET_PSTATE_REPLY_OPTIONAL(param);
+-              if (!strcmp(param->name, DEFAULTTIME2WAIT))
+-                      SET_PSTATE_REPLY_OPTIONAL(param);
+-              if (!strcmp(param->name, DEFAULTTIME2RETAIN))
+-                      SET_PSTATE_REPLY_OPTIONAL(param);
+-              /*
+                * Required for gPXE iSCSI boot client
+                */
+               if (!strcmp(param->name, MAXCONNECTIONS))
+diff --git a/drivers/target/iscsi/iscsi_target_util.c 
b/drivers/target/iscsi/iscsi_target_util.c
+index b5a1b4ccba12..712fd36a1220 100644
+--- a/drivers/target/iscsi/iscsi_target_util.c
++++ b/drivers/target/iscsi/iscsi_target_util.c
+@@ -736,21 +736,23 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd, bool 
shutdown)
+ {
+       struct se_cmd *se_cmd = NULL;
+       int rc;
++      bool op_scsi = false;
+       /*
+        * Determine if a struct se_cmd is associated with
+        * this struct iscsi_cmd.
+        */
+       switch (cmd->iscsi_opcode) {
+       case ISCSI_OP_SCSI_CMD:
+-              se_cmd = &cmd->se_cmd;
+-              __iscsit_free_cmd(cmd, true, shutdown);
++              op_scsi = true;
+               /*
+                * Fallthrough
+                */
+       case ISCSI_OP_SCSI_TMFUNC:
+-              rc = transport_generic_free_cmd(&cmd->se_cmd, shutdown);
+-              if (!rc && shutdown && se_cmd && se_cmd->se_sess) {
+-                      __iscsit_free_cmd(cmd, true, shutdown);
++              se_cmd = &cmd->se_cmd;
++              __iscsit_free_cmd(cmd, op_scsi, shutdown);
++              rc = transport_generic_free_cmd(se_cmd, shutdown);
++              if (!rc && shutdown && se_cmd->se_sess) {
++                      __iscsit_free_cmd(cmd, op_scsi, shutdown);
+                       target_put_sess_cmd(se_cmd);
+               }
+               break;
+diff --git a/drivers/target/target_core_fabric_configfs.c 
b/drivers/target/target_core_fabric_configfs.c
+index d8a16ca6baa5..d1e6cab8e3d3 100644
+--- a/drivers/target/target_core_fabric_configfs.c
++++ b/drivers/target/target_core_fabric_configfs.c
+@@ -92,6 +92,11 @@ static int target_fabric_mappedlun_link(
+               pr_err("Source se_lun->lun_se_dev does not exist\n");
+               return -EINVAL;
+       }
++      if (lun->lun_shutdown) {
++              pr_err("Unable to create mappedlun symlink because"
++                      " lun->lun_shutdown=true\n");
++              return -EINVAL;
++      }
+       se_tpg = lun->lun_tpg;
+ 
+       nacl_ci = &lun_acl_ci->ci_parent->ci_group->cg_item;
+diff --git a/drivers/target/target_core_tpg.c 
b/drivers/target/target_core_tpg.c
+index 2744251178ad..1949f50725a5 100644
+--- a/drivers/target/target_core_tpg.c
++++ b/drivers/target/target_core_tpg.c
+@@ -640,6 +640,8 @@ void core_tpg_remove_lun(
+        */
+       struct se_device *dev = rcu_dereference_raw(lun->lun_se_dev);
+ 
++      lun->lun_shutdown = true;
++
+       core_clear_lun_from_tpg(lun, tpg);
+       /*
+        * Wait for any active I/O references to percpu se_lun->lun_ref to
+@@ -661,6 +663,8 @@ void core_tpg_remove_lun(
+       }
+       if (!(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE))
+               hlist_del_rcu(&lun->link);
++
++      lun->lun_shutdown = false;
+       mutex_unlock(&tpg->tpg_lun_mutex);
+ 
+       percpu_ref_exit(&lun->lun_ref);
+diff --git a/drivers/target/target_core_user.c 
b/drivers/target/target_core_user.c
+index 8041710b6972..ced82cd3cb0e 100644
+--- a/drivers/target/target_core_user.c
++++ b/drivers/target/target_core_user.c
+@@ -307,24 +307,50 @@ static void free_data_area(struct tcmu_dev *udev, struct 
tcmu_cmd *cmd)
+                  DATA_BLOCK_BITS);
+ }
+ 
+-static void gather_data_area(struct tcmu_dev *udev, unsigned long *cmd_bitmap,
+-              struct scatterlist *data_sg, unsigned int data_nents)
++static void gather_data_area(struct tcmu_dev *udev, struct tcmu_cmd *cmd,
++                           bool bidi)
+ {
++      struct se_cmd *se_cmd = cmd->se_cmd;
+       int i, block;
+       int block_remaining = 0;
+       void *from, *to;
+       size_t copy_bytes, from_offset;
+-      struct scatterlist *sg;
++      struct scatterlist *sg, *data_sg;
++      unsigned int data_nents;
++      DECLARE_BITMAP(bitmap, DATA_BLOCK_BITS);
++
++      bitmap_copy(bitmap, cmd->data_bitmap, DATA_BLOCK_BITS);
++
++      if (!bidi) {
++              data_sg = se_cmd->t_data_sg;
++              data_nents = se_cmd->t_data_nents;
++      } else {
++              uint32_t count;
++
++              /*
++               * For bidi case, the first count blocks are for Data-Out
++               * buffer blocks, and before gathering the Data-In buffer
++               * the Data-Out buffer blocks should be discarded.
++               */
++              count = DIV_ROUND_UP(se_cmd->data_length, DATA_BLOCK_SIZE);
++              while (count--) {
++                      block = find_first_bit(bitmap, DATA_BLOCK_BITS);
++                      clear_bit(block, bitmap);
++              }
++
++              data_sg = se_cmd->t_bidi_data_sg;
++              data_nents = se_cmd->t_bidi_data_nents;
++      }
+ 
+       for_each_sg(data_sg, sg, data_nents, i) {
+               int sg_remaining = sg->length;
+               to = kmap_atomic(sg_page(sg)) + sg->offset;
+               while (sg_remaining > 0) {
+                       if (block_remaining == 0) {
+-                              block = find_first_bit(cmd_bitmap,
++                              block = find_first_bit(bitmap,
+                                               DATA_BLOCK_BITS);
+                               block_remaining = DATA_BLOCK_SIZE;
+-                              clear_bit(block, cmd_bitmap);
++                              clear_bit(block, bitmap);
+                       }
+                       copy_bytes = min_t(size_t, sg_remaining,
+                                       block_remaining);
+@@ -390,6 +416,27 @@ static bool is_ring_space_avail(struct tcmu_dev *udev, 
size_t cmd_size, size_t d
+       return true;
+ }
+ 
++static inline size_t tcmu_cmd_get_data_length(struct tcmu_cmd *tcmu_cmd)
++{
++      struct se_cmd *se_cmd = tcmu_cmd->se_cmd;
++      size_t data_length = round_up(se_cmd->data_length, DATA_BLOCK_SIZE);
++
++      if (se_cmd->se_cmd_flags & SCF_BIDI) {
++              BUG_ON(!(se_cmd->t_bidi_data_sg && se_cmd->t_bidi_data_nents));
++              data_length += round_up(se_cmd->t_bidi_data_sg->length,
++                              DATA_BLOCK_SIZE);
++      }
++
++      return data_length;
++}
++
++static inline uint32_t tcmu_cmd_get_block_cnt(struct tcmu_cmd *tcmu_cmd)
++{
++      size_t data_length = tcmu_cmd_get_data_length(tcmu_cmd);
++
++      return data_length / DATA_BLOCK_SIZE;
++}
++
+ static sense_reason_t
+ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
+ {
+@@ -403,7 +450,7 @@ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
+       uint32_t cmd_head;
+       uint64_t cdb_off;
+       bool copy_to_data_area;
+-      size_t data_length;
++      size_t data_length = tcmu_cmd_get_data_length(tcmu_cmd);
+       DECLARE_BITMAP(old_bitmap, DATA_BLOCK_BITS);
+ 
+       if (test_bit(TCMU_DEV_BIT_BROKEN, &udev->flags))
+@@ -417,8 +464,7 @@ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
+        * expensive to tell how many regions are freed in the bitmap
+       */
+       base_command_size = max(offsetof(struct tcmu_cmd_entry,
+-                              req.iov[se_cmd->t_bidi_data_nents +
+-                                      se_cmd->t_data_nents]),
++                              req.iov[tcmu_cmd_get_block_cnt(tcmu_cmd)]),
+                               sizeof(struct tcmu_cmd_entry));
+       command_size = base_command_size
+               + round_up(scsi_command_size(se_cmd->t_task_cdb), 
TCMU_OP_ALIGN_SIZE);
+@@ -429,11 +475,6 @@ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
+ 
+       mb = udev->mb_addr;
+       cmd_head = mb->cmd_head % udev->cmdr_size; /* UAM */
+-      data_length = se_cmd->data_length;
+-      if (se_cmd->se_cmd_flags & SCF_BIDI) {
+-              BUG_ON(!(se_cmd->t_bidi_data_sg && se_cmd->t_bidi_data_nents));
+-              data_length += se_cmd->t_bidi_data_sg->length;
+-      }
+       if ((command_size > (udev->cmdr_size / 2)) ||
+           data_length > udev->data_size) {
+               pr_warn("TCMU: Request of size %zu/%zu is too big for %u/%zu "
+@@ -503,11 +544,14 @@ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
+       entry->req.iov_dif_cnt = 0;
+ 
+       /* Handle BIDI commands */
+-      iov_cnt = 0;
+-      alloc_and_scatter_data_area(udev, se_cmd->t_bidi_data_sg,
+-              se_cmd->t_bidi_data_nents, &iov, &iov_cnt, false);
+-      entry->req.iov_bidi_cnt = iov_cnt;
+-
++      if (se_cmd->se_cmd_flags & SCF_BIDI) {
++              iov_cnt = 0;
++              iov++;
++              alloc_and_scatter_data_area(udev, se_cmd->t_bidi_data_sg,
++                              se_cmd->t_bidi_data_nents, &iov, &iov_cnt,
++                              false);
++              entry->req.iov_bidi_cnt = iov_cnt;
++      }
+       /* cmd's data_bitmap is what changed in process */
+       bitmap_xor(tcmu_cmd->data_bitmap, old_bitmap, udev->data_bitmap,
+                       DATA_BLOCK_BITS);
+@@ -583,19 +627,11 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, 
struct tcmu_cmd_entry *
+                              se_cmd->scsi_sense_length);
+               free_data_area(udev, cmd);
+       } else if (se_cmd->se_cmd_flags & SCF_BIDI) {
+-              DECLARE_BITMAP(bitmap, DATA_BLOCK_BITS);
+-
+               /* Get Data-In buffer before clean up */
+-              bitmap_copy(bitmap, cmd->data_bitmap, DATA_BLOCK_BITS);
+-              gather_data_area(udev, bitmap,
+-                      se_cmd->t_bidi_data_sg, se_cmd->t_bidi_data_nents);
++              gather_data_area(udev, cmd, true);
+               free_data_area(udev, cmd);
+       } else if (se_cmd->data_direction == DMA_FROM_DEVICE) {
+-              DECLARE_BITMAP(bitmap, DATA_BLOCK_BITS);
+-
+-              bitmap_copy(bitmap, cmd->data_bitmap, DATA_BLOCK_BITS);
+-              gather_data_area(udev, bitmap,
+-                      se_cmd->t_data_sg, se_cmd->t_data_nents);
++              gather_data_area(udev, cmd, false);
+               free_data_area(udev, cmd);
+       } else if (se_cmd->data_direction == DMA_TO_DEVICE) {
+               free_data_area(udev, cmd);
+diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c
+index 8c4dc1e1f94f..b827a8113e26 100644
+--- a/drivers/video/fbdev/efifb.c
++++ b/drivers/video/fbdev/efifb.c
+@@ -10,6 +10,7 @@
+ #include <linux/efi.h>
+ #include <linux/errno.h>
+ #include <linux/fb.h>
++#include <linux/pci.h>
+ #include <linux/platform_device.h>
+ #include <linux/screen_info.h>
+ #include <video/vga.h>
+@@ -143,6 +144,8 @@ static struct attribute *efifb_attrs[] = {
+ };
+ ATTRIBUTE_GROUPS(efifb);
+ 
++static bool pci_dev_disabled; /* FB base matches BAR of a disabled device */
++
+ static int efifb_probe(struct platform_device *dev)
+ {
+       struct fb_info *info;
+@@ -152,7 +155,7 @@ static int efifb_probe(struct platform_device *dev)
+       unsigned int size_total;
+       char *option = NULL;
+ 
+-      if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
++      if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || pci_dev_disabled)
+               return -ENODEV;
+ 
+       if (fb_get_options("efifb", &option))
+@@ -360,3 +363,64 @@ static struct platform_driver efifb_driver = {
+ };
+ 
+ builtin_platform_driver(efifb_driver);
++
++#if defined(CONFIG_PCI) && !defined(CONFIG_X86)
++
++static bool pci_bar_found;    /* did we find a BAR matching the efifb base? */
++
++static void claim_efifb_bar(struct pci_dev *dev, int idx)
++{
++      u16 word;
++
++      pci_bar_found = true;
++
++      pci_read_config_word(dev, PCI_COMMAND, &word);
++      if (!(word & PCI_COMMAND_MEMORY)) {
++              pci_dev_disabled = true;
++              dev_err(&dev->dev,
++                      "BAR %d: assigned to efifb but device is disabled!\n",
++                      idx);
++              return;
++      }
++
++      if (pci_claim_resource(dev, idx)) {
++              pci_dev_disabled = true;
++              dev_err(&dev->dev,
++                      "BAR %d: failed to claim resource for efifb!\n", idx);
++              return;
++      }
++
++      dev_info(&dev->dev, "BAR %d: assigned to efifb\n", idx);
++}
++
++static void efifb_fixup_resources(struct pci_dev *dev)
++{
++      u64 base = screen_info.lfb_base;
++      u64 size = screen_info.lfb_size;
++      int i;
++
++      if (pci_bar_found || screen_info.orig_video_isVGA != VIDEO_TYPE_EFI)
++              return;
++
++      if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
++              base |= (u64)screen_info.ext_lfb_base << 32;
++
++      if (!base)
++              return;
++
++      for (i = 0; i < PCI_STD_RESOURCE_END; i++) {
++              struct resource *res = &dev->resource[i];
++
++              if (!(res->flags & IORESOURCE_MEM))
++                      continue;
++
++              if (res->start <= base && res->end >= base + size - 1) {
++                      claim_efifb_bar(dev, i);
++                      break;
++              }
++      }
++}
++DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY,
++                             16, efifb_fixup_resources);
++
++#endif
+diff --git a/drivers/video/fbdev/xen-fbfront.c 
b/drivers/video/fbdev/xen-fbfront.c
+index d0115a7af0a9..3ee309c50b2d 100644
+--- a/drivers/video/fbdev/xen-fbfront.c
++++ b/drivers/video/fbdev/xen-fbfront.c
+@@ -643,7 +643,6 @@ static void xenfb_backend_changed(struct xenbus_device 
*dev,
+               break;
+ 
+       case XenbusStateInitWait:
+-InitWait:
+               xenbus_switch_state(dev, XenbusStateConnected);
+               break;
+ 
+@@ -654,7 +653,8 @@ static void xenfb_backend_changed(struct xenbus_device 
*dev,
+                * get Connected twice here.
+                */
+               if (dev->state != XenbusStateConnected)
+-                      goto InitWait; /* no InitWait seen yet, fudge it */
++                      /* no InitWait seen yet, fudge it */
++                      xenbus_switch_state(dev, XenbusStateConnected);
+ 
+               if (xenbus_read_unsigned(info->xbdev->otherend,
+                                        "request-update", 0))
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index 1cd0e2eefc66..3925758f6dde 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -2597,7 +2597,7 @@ cifs_write_from_iter(loff_t offset, size_t len, struct 
iov_iter *from,
+               wdata->credits = credits;
+ 
+               if (!wdata->cfile->invalidHandle ||
+-                  !cifs_reopen_file(wdata->cfile, false))
++                  !(rc = cifs_reopen_file(wdata->cfile, false)))
+                       rc = server->ops->async_writev(wdata,
+                                       cifs_uncached_writedata_release);
+               if (rc) {
+@@ -3002,7 +3002,7 @@ cifs_send_async_read(loff_t offset, size_t len, struct 
cifsFileInfo *open_file,
+               rdata->credits = credits;
+ 
+               if (!rdata->cfile->invalidHandle ||
+-                  !cifs_reopen_file(rdata->cfile, true))
++                  !(rc = cifs_reopen_file(rdata->cfile, true)))
+                       rc = server->ops->async_readv(rdata);
+ error:
+               if (rc) {
+@@ -3577,7 +3577,7 @@ static int cifs_readpages(struct file *file, struct 
address_space *mapping,
+               }
+ 
+               if (!rdata->cfile->invalidHandle ||
+-                  !cifs_reopen_file(rdata->cfile, true))
++                  !(rc = cifs_reopen_file(rdata->cfile, true)))
+                       rc = server->ops->async_readv(rdata);
+               if (rc) {
+                       add_credits_and_wake_if(server, rdata->credits, 0);
+diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
+index bdd32925a15e..7080dac3592c 100644
+--- a/fs/cifs/smb2pdu.c
++++ b/fs/cifs/smb2pdu.c
+@@ -1987,6 +1987,9 @@ void smb2_reconnect_server(struct work_struct *work)
+       struct cifs_tcon *tcon, *tcon2;
+       struct list_head tmp_list;
+       int tcon_exist = false;
++      int rc;
++      int resched = false;
++
+ 
+       /* Prevent simultaneous reconnects that can corrupt tcon->rlist list */
+       mutex_lock(&server->reconnect_mutex);
+@@ -2014,13 +2017,18 @@ void smb2_reconnect_server(struct work_struct *work)
+       spin_unlock(&cifs_tcp_ses_lock);
+ 
+       list_for_each_entry_safe(tcon, tcon2, &tmp_list, rlist) {
+-              if (!smb2_reconnect(SMB2_INTERNAL_CMD, tcon))
++              rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon);
++              if (!rc)
+                       cifs_reopen_persistent_handles(tcon);
++              else
++                      resched = true;
+               list_del_init(&tcon->rlist);
+               cifs_put_tcon(tcon);
+       }
+ 
+       cifs_dbg(FYI, "Reconnecting tcons finished\n");
++      if (resched)
++              queue_delayed_work(cifsiod_wq, &server->reconnect, 2 * HZ);
+       mutex_unlock(&server->reconnect_mutex);
+ 
+       /* now we can safely release srv struct */
+diff --git a/fs/orangefs/devorangefs-req.c b/fs/orangefs/devorangefs-req.c
+index c4ab6fdf17a0..e1534c9bab16 100644
+--- a/fs/orangefs/devorangefs-req.c
++++ b/fs/orangefs/devorangefs-req.c
+@@ -208,14 +208,19 @@ static ssize_t orangefs_devreq_read(struct file *file,
+                               continue;
+                       /*
+                        * Skip ops whose filesystem we don't know about unless
+-                       * it is being mounted.
++                       * it is being mounted or unmounted.  It is possible for
++                       * a filesystem we don't know about to be unmounted if
++                       * it fails to mount in the kernel after userspace has
++                       * been sent the mount request.
+                        */
+                       /* XXX: is there a better way to detect this? */
+                       } else if (ret == -1 &&
+                                  !(op->upcall.type ==
+                                       ORANGEFS_VFS_OP_FS_MOUNT ||
+                                    op->upcall.type ==
+-                                      ORANGEFS_VFS_OP_GETATTR)) {
++                                      ORANGEFS_VFS_OP_GETATTR ||
++                                   op->upcall.type ==
++                                      ORANGEFS_VFS_OP_FS_UMOUNT)) {
+                               gossip_debug(GOSSIP_DEV_DEBUG,
+                                   "orangefs: skipping op tag %llu %s\n",
+                                   llu(op->tag), get_opname_string(op));
+diff --git a/fs/orangefs/orangefs-kernel.h b/fs/orangefs/orangefs-kernel.h
+index 3bf803d732c5..45dd8f27b2ac 100644
+--- a/fs/orangefs/orangefs-kernel.h
++++ b/fs/orangefs/orangefs-kernel.h
+@@ -249,6 +249,7 @@ struct orangefs_sb_info_s {
+       char devname[ORANGEFS_MAX_SERVER_ADDR_LEN];
+       struct super_block *sb;
+       int mount_pending;
++      int no_list;
+       struct list_head list;
+ };
+ 
+diff --git a/fs/orangefs/super.c b/fs/orangefs/super.c
+index cd261c8de53a..629d8c917fa6 100644
+--- a/fs/orangefs/super.c
++++ b/fs/orangefs/super.c
+@@ -493,7 +493,7 @@ struct dentry *orangefs_mount(struct file_system_type *fst,
+ 
+       if (ret) {
+               d = ERR_PTR(ret);
+-              goto free_op;
++              goto free_sb_and_op;
+       }
+ 
+       /*
+@@ -519,6 +519,9 @@ struct dentry *orangefs_mount(struct file_system_type *fst,
+       spin_unlock(&orangefs_superblocks_lock);
+       op_release(new_op);
+ 
++      /* Must be removed from the list now. */
++      ORANGEFS_SB(sb)->no_list = 0;
++
+       if (orangefs_userspace_version >= 20906) {
+               new_op = op_alloc(ORANGEFS_VFS_OP_FEATURES);
+               if (!new_op)
+@@ -533,6 +536,10 @@ struct dentry *orangefs_mount(struct file_system_type 
*fst,
+ 
+       return dget(sb->s_root);
+ 
++free_sb_and_op:
++      /* Will call orangefs_kill_sb with sb not in list. */
++      ORANGEFS_SB(sb)->no_list = 1;
++      deactivate_locked_super(sb);
+ free_op:
+       gossip_err("orangefs_mount: mount request failed with %d\n", ret);
+       if (ret == -EINVAL) {
+@@ -558,12 +565,14 @@ void orangefs_kill_sb(struct super_block *sb)
+        */
+        orangefs_unmount_sb(sb);
+ 
+-      /* remove the sb from our list of orangefs specific sb's */
+-
+-      spin_lock(&orangefs_superblocks_lock);
+-      __list_del_entry(&ORANGEFS_SB(sb)->list);       /* not list_del_init */
+-      ORANGEFS_SB(sb)->list.prev = NULL;
+-      spin_unlock(&orangefs_superblocks_lock);
++      if (!ORANGEFS_SB(sb)->no_list) {
++              /* remove the sb from our list of orangefs specific sb's */
++              spin_lock(&orangefs_superblocks_lock);
++              /* not list_del_init */
++              __list_del_entry(&ORANGEFS_SB(sb)->list);
++              ORANGEFS_SB(sb)->list.prev = NULL;
++              spin_unlock(&orangefs_superblocks_lock);
++      }
+ 
+       /*
+        * make sure that ORANGEFS_DEV_REMOUNT_ALL loop that might've seen us
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index 8f96a49178d0..129215eca0e8 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -899,7 +899,14 @@ static inline void clear_soft_dirty(struct vm_area_struct 
*vma,
+ static inline void clear_soft_dirty_pmd(struct vm_area_struct *vma,
+               unsigned long addr, pmd_t *pmdp)
+ {
+-      pmd_t pmd = pmdp_huge_get_and_clear(vma->vm_mm, addr, pmdp);
++      pmd_t pmd = *pmdp;
++
++      /* See comment in change_huge_pmd() */
++      pmdp_invalidate(vma, addr, pmdp);
++      if (pmd_dirty(*pmdp))
++              pmd = pmd_mkdirty(pmd);
++      if (pmd_young(*pmdp))
++              pmd = pmd_mkyoung(pmd);
+ 
+       pmd = pmd_wrprotect(pmd);
+       pmd = pmd_clear_soft_dirty(pmd);
+diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h
+index 1d4f365d8f03..f6d9af3efa45 100644
+--- a/include/crypto/internal/hash.h
++++ b/include/crypto/internal/hash.h
+@@ -166,6 +166,16 @@ static inline struct ahash_instance *ahash_alloc_instance(
+       return crypto_alloc_instance2(name, alg, ahash_instance_headroom());
+ }
+ 
++static inline void ahash_request_complete(struct ahash_request *req, int err)
++{
++      req->base.complete(&req->base, err);
++}
++
++static inline u32 ahash_request_flags(struct ahash_request *req)
++{
++      return req->base.flags;
++}
++
+ static inline struct crypto_ahash *crypto_spawn_ahash(
+       struct crypto_ahash_spawn *spawn)
+ {
+diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
+index c83c23f0577b..307ae63ef262 100644
+--- a/include/linux/cgroup.h
++++ b/include/linux/cgroup.h
+@@ -570,6 +570,25 @@ static inline void pr_cont_cgroup_path(struct cgroup 
*cgrp)
+       pr_cont_kernfs_path(cgrp->kn);
+ }
+ 
++static inline void cgroup_init_kthreadd(void)
++{
++      /*
++       * kthreadd is inherited by all kthreads, keep it in the root so
++       * that the new kthreads are guaranteed to stay in the root until
++       * initialization is finished.
++       */
++      current->no_cgroup_migration = 1;
++}
++
++static inline void cgroup_kthread_ready(void)
++{
++      /*
++       * This kthread finished initialization.  The creator should have
++       * set PF_NO_SETAFFINITY if this kthread should stay in the root.
++       */
++      current->no_cgroup_migration = 0;
++}
++
+ #else /* !CONFIG_CGROUPS */
+ 
+ struct cgroup_subsys_state;
+@@ -590,6 +609,8 @@ static inline void cgroup_free(struct task_struct *p) {}
+ 
+ static inline int cgroup_init_early(void) { return 0; }
+ static inline int cgroup_init(void) { return 0; }
++static inline void cgroup_init_kthreadd(void) {}
++static inline void cgroup_kthread_ready(void) {}
+ 
+ static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
+                                              struct cgroup *ancestor)
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index ad3ec9ec61f7..f2bdb2141941 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -1620,6 +1620,10 @@ struct task_struct {
+ #ifdef CONFIG_COMPAT_BRK
+       unsigned brk_randomized:1;
+ #endif
++#ifdef CONFIG_CGROUPS
++      /* disallow userland-initiated cgroup migration */
++      unsigned no_cgroup_migration:1;
++#endif
+ 
+       unsigned long atomic_flags; /* Flags needing atomic access. */
+ 
+diff --git a/include/linux/uio.h b/include/linux/uio.h
+index 804e34c6f981..f2d36a3d3005 100644
+--- a/include/linux/uio.h
++++ b/include/linux/uio.h
+@@ -39,7 +39,10 @@ struct iov_iter {
+       };
+       union {
+               unsigned long nr_segs;
+-              int idx;
++              struct {
++                      int idx;
++                      int start_idx;
++              };
+       };
+ };
+ 
+@@ -81,6 +84,7 @@ unsigned long iov_shorten(struct iovec *iov, unsigned long 
nr_segs, size_t to);
+ size_t iov_iter_copy_from_user_atomic(struct page *page,
+               struct iov_iter *i, unsigned long offset, size_t bytes);
+ void iov_iter_advance(struct iov_iter *i, size_t bytes);
++void iov_iter_revert(struct iov_iter *i, size_t bytes);
+ int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
+ size_t iov_iter_single_seg_count(const struct iov_iter *i);
+ size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
+diff --git a/include/target/target_core_base.h 
b/include/target/target_core_base.h
+index 775c2319a72b..cd225c455bca 100644
+--- a/include/target/target_core_base.h
++++ b/include/target/target_core_base.h
+@@ -705,6 +705,7 @@ struct se_lun {
+       u64                     unpacked_lun;
+ #define SE_LUN_LINK_MAGIC                     0xffff7771
+       u32                     lun_link_magic;
++      bool                    lun_shutdown;
+       bool                    lun_access_ro;
+       u32                     lun_index;
+ 
+diff --git a/kernel/audit.c b/kernel/audit.c
+index ba4481d20fa1..765c27c69165 100644
+--- a/kernel/audit.c
++++ b/kernel/audit.c
+@@ -160,7 +160,6 @@ static LIST_HEAD(audit_freelist);
+ 
+ /* queue msgs to send via kauditd_task */
+ static struct sk_buff_head audit_queue;
+-static void kauditd_hold_skb(struct sk_buff *skb);
+ /* queue msgs due to temporary unicast send problems */
+ static struct sk_buff_head audit_retry_queue;
+ /* queue msgs waiting for new auditd connection */
+@@ -454,30 +453,6 @@ static void auditd_set(int pid, u32 portid, struct net 
*net)
+ }
+ 
+ /**
+- * auditd_reset - Disconnect the auditd connection
+- *
+- * Description:
+- * Break the auditd/kauditd connection and move all the queued records into 
the
+- * hold queue in case auditd reconnects.
+- */
+-static void auditd_reset(void)
+-{
+-      struct sk_buff *skb;
+-
+-      /* if it isn't already broken, break the connection */
+-      rcu_read_lock();
+-      if (auditd_conn.pid)
+-              auditd_set(0, 0, NULL);
+-      rcu_read_unlock();
+-
+-      /* flush all of the main and retry queues to the hold queue */
+-      while ((skb = skb_dequeue(&audit_retry_queue)))
+-              kauditd_hold_skb(skb);
+-      while ((skb = skb_dequeue(&audit_queue)))
+-              kauditd_hold_skb(skb);
+-}
+-
+-/**
+  * kauditd_print_skb - Print the audit record to the ring buffer
+  * @skb: audit record
+  *
+@@ -505,9 +480,6 @@ static void kauditd_rehold_skb(struct sk_buff *skb)
+ {
+       /* put the record back in the queue at the same place */
+       skb_queue_head(&audit_hold_queue, skb);
+-
+-      /* fail the auditd connection */
+-      auditd_reset();
+ }
+ 
+ /**
+@@ -544,9 +516,6 @@ static void kauditd_hold_skb(struct sk_buff *skb)
+       /* we have no other options - drop the message */
+       audit_log_lost("kauditd hold queue overflow");
+       kfree_skb(skb);
+-
+-      /* fail the auditd connection */
+-      auditd_reset();
+ }
+ 
+ /**
+@@ -567,6 +536,30 @@ static void kauditd_retry_skb(struct sk_buff *skb)
+ }
+ 
+ /**
++ * auditd_reset - Disconnect the auditd connection
++ *
++ * Description:
++ * Break the auditd/kauditd connection and move all the queued records into 
the
++ * hold queue in case auditd reconnects.
++ */
++static void auditd_reset(void)
++{
++      struct sk_buff *skb;
++
++      /* if it isn't already broken, break the connection */
++      rcu_read_lock();
++      if (auditd_conn.pid)
++              auditd_set(0, 0, NULL);
++      rcu_read_unlock();
++
++      /* flush all of the main and retry queues to the hold queue */
++      while ((skb = skb_dequeue(&audit_retry_queue)))
++              kauditd_hold_skb(skb);
++      while ((skb = skb_dequeue(&audit_queue)))
++              kauditd_hold_skb(skb);
++}
++
++/**
+  * auditd_send_unicast_skb - Send a record via unicast to auditd
+  * @skb: audit record
+  *
+@@ -758,6 +751,7 @@ static int kauditd_thread(void *dummy)
+                                       NULL, kauditd_rehold_skb);
+               if (rc < 0) {
+                       sk = NULL;
++                      auditd_reset();
+                       goto main_queue;
+               }
+ 
+@@ -767,6 +761,7 @@ static int kauditd_thread(void *dummy)
+                                       NULL, kauditd_hold_skb);
+               if (rc < 0) {
+                       sk = NULL;
++                      auditd_reset();
+                       goto main_queue;
+               }
+ 
+@@ -775,16 +770,18 @@ static int kauditd_thread(void *dummy)
+                * unicast, dump failed record sends to the retry queue; if
+                * sk == NULL due to previous failures we will just do the
+                * multicast send and move the record to the retry queue */
+-              kauditd_send_queue(sk, portid, &audit_queue, 1,
+-                                 kauditd_send_multicast_skb,
+-                                 kauditd_retry_skb);
++              rc = kauditd_send_queue(sk, portid, &audit_queue, 1,
++                                      kauditd_send_multicast_skb,
++                                      kauditd_retry_skb);
++              if (sk == NULL || rc < 0)
++                      auditd_reset();
++              sk = NULL;
+ 
+               /* drop our netns reference, no auditd sends past this line */
+               if (net) {
+                       put_net(net);
+                       net = NULL;
+               }
+-              sk = NULL;
+ 
+               /* we have processed all the queues so wake everyone */
+               wake_up(&audit_backlog_wait);
+diff --git a/kernel/cgroup.c b/kernel/cgroup.c
+index 53bbca7c4859..36672b678cce 100644
+--- a/kernel/cgroup.c
++++ b/kernel/cgroup.c
+@@ -2920,11 +2920,12 @@ static ssize_t __cgroup_procs_write(struct 
kernfs_open_file *of, char *buf,
+               tsk = tsk->group_leader;
+ 
+       /*
+-       * Workqueue threads may acquire PF_NO_SETAFFINITY and become
+-       * trapped in a cpuset, or RT worker may be born in a cgroup
+-       * with no rt_runtime allocated.  Just say no.
++       * kthreads may acquire PF_NO_SETAFFINITY during initialization.
++       * If userland migrates such a kthread to a non-root cgroup, it can
++       * become trapped in a cpuset, or RT kthread may be born in a
++       * cgroup with no rt_runtime allocated.  Just say no.
+        */
+-      if (tsk == kthreadd_task || (tsk->flags & PF_NO_SETAFFINITY)) {
++      if (tsk->no_cgroup_migration || (tsk->flags & PF_NO_SETAFFINITY)) {
+               ret = -EINVAL;
+               goto out_unlock_rcu;
+       }
+diff --git a/kernel/kthread.c b/kernel/kthread.c
+index 2318fba86277..175a438901bf 100644
+--- a/kernel/kthread.c
++++ b/kernel/kthread.c
+@@ -18,6 +18,7 @@
+ #include <linux/freezer.h>
+ #include <linux/ptrace.h>
+ #include <linux/uaccess.h>
++#include <linux/cgroup.h>
+ #include <trace/events/sched.h>
+ 
+ static DEFINE_SPINLOCK(kthread_create_lock);
+@@ -223,6 +224,7 @@ static int kthread(void *_create)
+ 
+       ret = -EINTR;
+       if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) {
++              cgroup_kthread_ready();
+               __kthread_parkme(self);
+               ret = threadfn(data);
+       }
+@@ -536,6 +538,7 @@ int kthreadd(void *unused)
+       set_mems_allowed(node_states[N_MEMORY]);
+ 
+       current->flags |= PF_NOFREEZE;
++      cgroup_init_kthreadd();
+ 
+       for (;;) {
+               set_current_state(TASK_INTERRUPTIBLE);
+diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
+index eb230f06ba41..c24bf79bdf9f 100644
+--- a/kernel/trace/ftrace.c
++++ b/kernel/trace/ftrace.c
+@@ -3740,23 +3740,24 @@ static void __enable_ftrace_function_probe(struct 
ftrace_ops_hash *old_hash)
+       ftrace_probe_registered = 1;
+ }
+ 
+-static void __disable_ftrace_function_probe(void)
++static bool __disable_ftrace_function_probe(void)
+ {
+       int i;
+ 
+       if (!ftrace_probe_registered)
+-              return;
++              return false;
+ 
+       for (i = 0; i < FTRACE_FUNC_HASHSIZE; i++) {
+               struct hlist_head *hhd = &ftrace_func_hash[i];
+               if (hhd->first)
+-                      return;
++                      return false;
+       }
+ 
+       /* no more funcs left */
+       ftrace_shutdown(&trace_probe_ops, 0);
+ 
+       ftrace_probe_registered = 0;
++      return true;
+ }
+ 
+ 
+@@ -3886,6 +3887,7 @@ static void
+ __unregister_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
+                                 void *data, int flags)
+ {
++      struct ftrace_ops_hash old_hash_ops;
+       struct ftrace_func_entry *rec_entry;
+       struct ftrace_func_probe *entry;
+       struct ftrace_func_probe *p;
+@@ -3897,6 +3899,7 @@ __unregister_ftrace_function_probe(char *glob, struct 
ftrace_probe_ops *ops,
+       struct hlist_node *tmp;
+       char str[KSYM_SYMBOL_LEN];
+       int i, ret;
++      bool disabled;
+ 
+       if (glob && (strcmp(glob, "*") == 0 || !strlen(glob)))
+               func_g.search = NULL;
+@@ -3915,6 +3918,10 @@ __unregister_ftrace_function_probe(char *glob, struct 
ftrace_probe_ops *ops,
+ 
+       mutex_lock(&trace_probe_ops.func_hash->regex_lock);
+ 
++      old_hash_ops.filter_hash = old_hash;
++      /* Probes only have filters */
++      old_hash_ops.notrace_hash = NULL;
++
+       hash = alloc_and_copy_ftrace_hash(FTRACE_HASH_DEFAULT_BITS, *orig_hash);
+       if (!hash)
+               /* Hmm, should report this somehow */
+@@ -3952,12 +3959,17 @@ __unregister_ftrace_function_probe(char *glob, struct 
ftrace_probe_ops *ops,
+               }
+       }
+       mutex_lock(&ftrace_lock);
+-      __disable_ftrace_function_probe();
++      disabled = __disable_ftrace_function_probe();
+       /*
+        * Remove after the disable is called. Otherwise, if the last
+        * probe is removed, a null hash means *all enabled*.
+        */
+       ret = ftrace_hash_move(&trace_probe_ops, 1, orig_hash, hash);
++
++      /* still need to update the function call sites */
++      if (ftrace_enabled && !disabled)
++              ftrace_run_modify_code(&trace_probe_ops, FTRACE_UPDATE_CALLS,
++                                     &old_hash_ops);
+       synchronize_sched();
+       if (!ret)
+               free_ftrace_hash_rcu(old_hash);
+@@ -5410,6 +5422,15 @@ static void clear_ftrace_pids(struct trace_array *tr)
+       trace_free_pid_list(pid_list);
+ }
+ 
++void ftrace_clear_pids(struct trace_array *tr)
++{
++      mutex_lock(&ftrace_lock);
++
++      clear_ftrace_pids(tr);
++
++      mutex_unlock(&ftrace_lock);
++}
++
+ static void ftrace_pid_reset(struct trace_array *tr)
+ {
+       mutex_lock(&ftrace_lock);
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index 310f0ea0d1a2..6ee340a43f18 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -7409,6 +7409,7 @@ static int instance_rmdir(const char *name)
+ 
+       tracing_set_nop(tr);
+       event_trace_del_tracer(tr);
++      ftrace_clear_pids(tr);
+       ftrace_destroy_function_files(tr);
+       tracefs_remove_recursive(tr->dir);
+       free_trace_buffers(tr);
+diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
+index 1ea51ab53edf..8d5f9bcf2a5b 100644
+--- a/kernel/trace/trace.h
++++ b/kernel/trace/trace.h
+@@ -884,6 +884,7 @@ int using_ftrace_ops_list_func(void);
+ void ftrace_init_tracefs(struct trace_array *tr, struct dentry *d_tracer);
+ void ftrace_init_tracefs_toplevel(struct trace_array *tr,
+                                 struct dentry *d_tracer);
++void ftrace_clear_pids(struct trace_array *tr);
+ #else
+ static inline int ftrace_trace_task(struct trace_array *tr)
+ {
+@@ -902,6 +903,7 @@ ftrace_init_global_array_ops(struct trace_array *tr) { }
+ static inline void ftrace_reset_array_ops(struct trace_array *tr) { }
+ static inline void ftrace_init_tracefs(struct trace_array *tr, struct dentry 
*d) { }
+ static inline void ftrace_init_tracefs_toplevel(struct trace_array *tr, 
struct dentry *d) { }
++static inline void ftrace_clear_pids(struct trace_array *tr) { }
+ /* ftace_func_t type is not defined, use macro instead of static inline */
+ #define ftrace_init_array_ops(tr, func) do { } while (0)
+ #endif /* CONFIG_FUNCTION_TRACER */
+diff --git a/lib/iov_iter.c b/lib/iov_iter.c
+index e68604ae3ced..60abc44385b7 100644
+--- a/lib/iov_iter.c
++++ b/lib/iov_iter.c
+@@ -786,6 +786,68 @@ void iov_iter_advance(struct iov_iter *i, size_t size)
+ }
+ EXPORT_SYMBOL(iov_iter_advance);
+ 
++void iov_iter_revert(struct iov_iter *i, size_t unroll)
++{
++      if (!unroll)
++              return;
++      i->count += unroll;
++      if (unlikely(i->type & ITER_PIPE)) {
++              struct pipe_inode_info *pipe = i->pipe;
++              int idx = i->idx;
++              size_t off = i->iov_offset;
++              while (1) {
++                      size_t n = off - pipe->bufs[idx].offset;
++                      if (unroll < n) {
++                              off -= (n - unroll);
++                              break;
++                      }
++                      unroll -= n;
++                      if (!unroll && idx == i->start_idx) {
++                              off = 0;
++                              break;
++                      }
++                      if (!idx--)
++                              idx = pipe->buffers - 1;
++                      off = pipe->bufs[idx].offset + pipe->bufs[idx].len;
++              }
++              i->iov_offset = off;
++              i->idx = idx;
++              pipe_truncate(i);
++              return;
++      }
++      if (unroll <= i->iov_offset) {
++              i->iov_offset -= unroll;
++              return;
++      }
++      unroll -= i->iov_offset;
++      if (i->type & ITER_BVEC) {
++              const struct bio_vec *bvec = i->bvec;
++              while (1) {
++                      size_t n = (--bvec)->bv_len;
++                      i->nr_segs++;
++                      if (unroll <= n) {
++                              i->bvec = bvec;
++                              i->iov_offset = n - unroll;
++                              return;
++                      }
++                      unroll -= n;
++              }
++      } else { /* same logics for iovec and kvec */
++              const struct iovec *iov = i->iov;
++              while (1) {
++                      size_t n = (--iov)->iov_len;
++                      i->nr_segs++;
++                      if (unroll <= n) {
++                              i->iov = iov;
++                              i->iov_offset = n - unroll;
++                              return;
++                      }
++                      unroll -= n;
++              }
++      }
++}
++EXPORT_SYMBOL(iov_iter_revert);
++
+ /*
+  * Return the count of just the current iov_iter segment.
+  */
+@@ -839,6 +901,7 @@ void iov_iter_pipe(struct iov_iter *i, int direction,
+       i->idx = (pipe->curbuf + pipe->nrbufs) & (pipe->buffers - 1);
+       i->iov_offset = 0;
+       i->count = count;
++      i->start_idx = i->idx;
+ }
+ EXPORT_SYMBOL(iov_iter_pipe);
+ 
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c
+index 5f3ad65c85de..c1a081d17178 100644
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -1393,8 +1393,7 @@ bool madvise_free_huge_pmd(struct mmu_gather *tlb, 
struct vm_area_struct *vma,
+               deactivate_page(page);
+ 
+       if (pmd_young(orig_pmd) || pmd_dirty(orig_pmd)) {
+-              orig_pmd = pmdp_huge_get_and_clear_full(tlb->mm, addr, pmd,
+-                      tlb->fullmm);
++              pmdp_invalidate(vma, addr, pmd);
+               orig_pmd = pmd_mkold(orig_pmd);
+               orig_pmd = pmd_mkclean(orig_pmd);
+ 
+diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
+index 9cc3c0b2c2c1..f9ed0813d64e 100644
+--- a/mm/zsmalloc.c
++++ b/mm/zsmalloc.c
+@@ -280,7 +280,7 @@ struct zs_pool {
+ struct zspage {
+       struct {
+               unsigned int fullness:FULLNESS_BITS;
+-              unsigned int class:CLASS_BITS;
++              unsigned int class:CLASS_BITS + 1;
+               unsigned int isolated:ISOLATED_BITS;
+               unsigned int magic:MAGIC_VAL_BITS;
+       };
+diff --git a/net/core/datagram.c b/net/core/datagram.c
+index ea633342ab0d..f4947e737f34 100644
+--- a/net/core/datagram.c
++++ b/net/core/datagram.c
+@@ -398,7 +398,7 @@ int skb_copy_datagram_iter(const struct sk_buff *skb, int 
offset,
+                          struct iov_iter *to, int len)
+ {
+       int start = skb_headlen(skb);
+-      int i, copy = start - offset;
++      int i, copy = start - offset, start_off = offset, n;
+       struct sk_buff *frag_iter;
+ 
+       trace_skb_copy_datagram_iovec(skb, len);
+@@ -407,11 +407,12 @@ int skb_copy_datagram_iter(const struct sk_buff *skb, 
int offset,
+       if (copy > 0) {
+               if (copy > len)
+                       copy = len;
+-              if (copy_to_iter(skb->data + offset, copy, to) != copy)
++              n = copy_to_iter(skb->data + offset, copy, to);
++              offset += n;
++              if (n != copy)
+                       goto short_copy;
+               if ((len -= copy) == 0)
+                       return 0;
+-              offset += copy;
+       }
+ 
+       /* Copy paged appendix. Hmm... why does this look so complicated? */
+@@ -425,13 +426,14 @@ int skb_copy_datagram_iter(const struct sk_buff *skb, 
int offset,
+               if ((copy = end - offset) > 0) {
+                       if (copy > len)
+                               copy = len;
+-                      if (copy_page_to_iter(skb_frag_page(frag),
++                      n = copy_page_to_iter(skb_frag_page(frag),
+                                             frag->page_offset + offset -
+-                                            start, copy, to) != copy)
++                                            start, copy, to);
++                      offset += n;
++                      if (n != copy)
+                               goto short_copy;
+                       if (!(len -= copy))
+                               return 0;
+-                      offset += copy;
+               }
+               start = end;
+       }
+@@ -463,6 +465,7 @@ int skb_copy_datagram_iter(const struct sk_buff *skb, int 
offset,
+        */
+ 
+ fault:
++      iov_iter_revert(to, offset - start_off);
+       return -EFAULT;
+ 
+ short_copy:
+@@ -613,7 +616,7 @@ static int skb_copy_and_csum_datagram(const struct sk_buff 
*skb, int offset,
+                                     __wsum *csump)
+ {
+       int start = skb_headlen(skb);
+-      int i, copy = start - offset;
++      int i, copy = start - offset, start_off = offset;
+       struct sk_buff *frag_iter;
+       int pos = 0;
+       int n;
+@@ -623,11 +626,11 @@ static int skb_copy_and_csum_datagram(const struct 
sk_buff *skb, int offset,
+               if (copy > len)
+                       copy = len;
+               n = csum_and_copy_to_iter(skb->data + offset, copy, csump, to);
++              offset += n;
+               if (n != copy)
+                       goto fault;
+               if ((len -= copy) == 0)
+                       return 0;
+-              offset += copy;
+               pos = copy;
+       }
+ 
+@@ -649,12 +652,12 @@ static int skb_copy_and_csum_datagram(const struct 
sk_buff *skb, int offset,
+                                                 offset - start, copy,
+                                                 &csum2, to);
+                       kunmap(page);
++                      offset += n;
+                       if (n != copy)
+                               goto fault;
+                       *csump = csum_block_add(*csump, csum2, pos);
+                       if (!(len -= copy))
+                               return 0;
+-                      offset += copy;
+                       pos += copy;
+               }
+               start = end;
+@@ -687,6 +690,7 @@ static int skb_copy_and_csum_datagram(const struct sk_buff 
*skb, int offset,
+               return 0;
+ 
+ fault:
++      iov_iter_revert(to, offset - start_off);
+       return -EFAULT;
+ }
+ 
+@@ -771,6 +775,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
+       }
+       return 0;
+ csum_error:
++      iov_iter_revert(&msg->msg_iter, chunk);
+       return -EINVAL;
+ fault:
+       return -EFAULT;
+diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig
+index fd5d1e091038..e18fe9d6f08f 100644
+--- a/sound/soc/intel/Kconfig
++++ b/sound/soc/intel/Kconfig
+@@ -33,11 +33,9 @@ config SND_SOC_INTEL_SST
+       select SND_SOC_INTEL_SST_MATCH if ACPI
+       depends on (X86 || COMPILE_TEST)
+ 
+-# firmware stuff depends DW_DMAC_CORE; since there is no depends-on from
+-# the reverse selection, each machine driver needs to select
+-# SND_SOC_INTEL_SST_FIRMWARE carefully depending on DW_DMAC_CORE
+ config SND_SOC_INTEL_SST_FIRMWARE
+       tristate
++      select DW_DMAC_CORE
+ 
+ config SND_SOC_INTEL_SST_ACPI
+       tristate
+@@ -47,16 +45,18 @@ config SND_SOC_INTEL_SST_MATCH
+ 
+ config SND_SOC_INTEL_HASWELL
+       tristate
++      select SND_SOC_INTEL_SST
+       select SND_SOC_INTEL_SST_FIRMWARE
+ 
+ config SND_SOC_INTEL_BAYTRAIL
+       tristate
++      select SND_SOC_INTEL_SST
++      select SND_SOC_INTEL_SST_FIRMWARE
+ 
+ config SND_SOC_INTEL_HASWELL_MACH
+       tristate "ASoC Audio DSP support for Intel Haswell Lynxpoint"
+       depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM
+-      depends on DW_DMAC_CORE
+-      select SND_SOC_INTEL_SST
++      depends on DMADEVICES
+       select SND_SOC_INTEL_HASWELL
+       select SND_SOC_RT5640
+       help
+@@ -99,9 +99,8 @@ config SND_SOC_INTEL_BXT_RT298_MACH
+ config SND_SOC_INTEL_BYT_RT5640_MACH
+       tristate "ASoC Audio driver for Intel Baytrail with RT5640 codec"
+       depends on X86_INTEL_LPSS && I2C
+-      depends on DW_DMAC_CORE && (SND_SST_IPC_ACPI = n)
+-      select SND_SOC_INTEL_SST
+-      select SND_SOC_INTEL_SST_FIRMWARE
++      depends on DMADEVICES
++      depends on SND_SST_IPC_ACPI = n
+       select SND_SOC_INTEL_BAYTRAIL
+       select SND_SOC_RT5640
+       help
+@@ -112,9 +111,8 @@ config SND_SOC_INTEL_BYT_RT5640_MACH
+ config SND_SOC_INTEL_BYT_MAX98090_MACH
+       tristate "ASoC Audio driver for Intel Baytrail with MAX98090 codec"
+       depends on X86_INTEL_LPSS && I2C
+-      depends on DW_DMAC_CORE && (SND_SST_IPC_ACPI = n)
+-      select SND_SOC_INTEL_SST
+-      select SND_SOC_INTEL_SST_FIRMWARE
++      depends on DMADEVICES
++      depends on SND_SST_IPC_ACPI = n
+       select SND_SOC_INTEL_BAYTRAIL
+       select SND_SOC_MAX98090
+       help
+@@ -123,9 +121,8 @@ config SND_SOC_INTEL_BYT_MAX98090_MACH
+ 
+ config SND_SOC_INTEL_BDW_RT5677_MACH
+       tristate "ASoC Audio driver for Intel Broadwell with RT5677 codec"
+-      depends on X86_INTEL_LPSS && GPIOLIB && I2C && DW_DMAC
+-      depends on DW_DMAC_CORE=y
+-      select SND_SOC_INTEL_SST
++      depends on X86_INTEL_LPSS && GPIOLIB && I2C
++      depends on DMADEVICES
+       select SND_SOC_INTEL_HASWELL
+       select SND_SOC_RT5677
+       help
+@@ -134,10 +131,8 @@ config SND_SOC_INTEL_BDW_RT5677_MACH
+ 
+ config SND_SOC_INTEL_BROADWELL_MACH
+       tristate "ASoC Audio DSP support for Intel Broadwell Wildcatpoint"
+-      depends on X86_INTEL_LPSS && I2C && DW_DMAC && \
+-                 I2C_DESIGNWARE_PLATFORM
+-      depends on DW_DMAC_CORE
+-      select SND_SOC_INTEL_SST
++      depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM
++      depends on DMADEVICES
+       select SND_SOC_INTEL_HASWELL
+       select SND_SOC_RT286
+       help
+diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
+index 06cc04e5806a..cea3e7958cde 100644
+--- a/tools/perf/util/annotate.c
++++ b/tools/perf/util/annotate.c
+@@ -130,6 +130,12 @@ static struct arch architectures[] = {
+               .name = "powerpc",
+               .init = powerpc__annotate_init,
+       },
++      {
++              .name = "s390",
++              .objdump =  {
++                      .comment_char = '#',
++              },
++      },
+ };
+ 
+ static void ins__delete(struct ins_operands *ops)

Reply via email to