commit:     e98abf3583bf21dcbae41dcb808e371be5e71565
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sun Jan 12 14:52:24 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sun Jan 12 14:52:24 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=e98abf35

Linux patch 4.9.209

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README              |    4 +
 1208_linux-4.9.209.patch | 2684 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2688 insertions(+)

diff --git a/0000_README b/0000_README
index a26dbf7..c11a663 100644
--- a/0000_README
+++ b/0000_README
@@ -875,6 +875,10 @@ Patch:  1207_linux-4.9.208.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.9.208
 
+Patch:  1208_linux-4.9.209.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.9.209
+
 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/1208_linux-4.9.209.patch b/1208_linux-4.9.209.patch
new file mode 100644
index 0000000..ccea173
--- /dev/null
+++ b/1208_linux-4.9.209.patch
@@ -0,0 +1,2684 @@
+diff --git a/Makefile b/Makefile
+index 1d1d9f68e962..ed9a08ab3772 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 208
++SUBLEVEL = 209
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts 
b/arch/arm/boot/dts/am437x-gp-evm.dts
+index 957840cc7b78..b55c094893c6 100644
+--- a/arch/arm/boot/dts/am437x-gp-evm.dts
++++ b/arch/arm/boot/dts/am437x-gp-evm.dts
+@@ -79,7 +79,7 @@
+               };
+ 
+       lcd0: display {
+-              compatible = "osddisplays,osd057T0559-34ts", "panel-dpi";
++              compatible = "osddisplays,osd070t1718-19ts", "panel-dpi";
+               label = "lcd";
+ 
+               panel-timing {
+diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts 
b/arch/arm/boot/dts/am43x-epos-evm.dts
+index 9d35c3f07cad..21918807c9f6 100644
+--- a/arch/arm/boot/dts/am43x-epos-evm.dts
++++ b/arch/arm/boot/dts/am43x-epos-evm.dts
+@@ -41,7 +41,7 @@
+       };
+ 
+       lcd0: display {
+-              compatible = "osddisplays,osd057T0559-34ts", "panel-dpi";
++              compatible = "osddisplays,osd070t1718-19ts", "panel-dpi";
+               label = "lcd";
+ 
+               panel-timing {
+diff --git a/arch/arm/mach-vexpress/spc.c b/arch/arm/mach-vexpress/spc.c
+index fe488523694c..635b0d549487 100644
+--- a/arch/arm/mach-vexpress/spc.c
++++ b/arch/arm/mach-vexpress/spc.c
+@@ -555,8 +555,9 @@ static struct clk *ve_spc_clk_register(struct device 
*cpu_dev)
+ 
+ static int __init ve_spc_clk_init(void)
+ {
+-      int cpu;
++      int cpu, cluster;
+       struct clk *clk;
++      bool init_opp_table[MAX_CLUSTERS] = { false };
+ 
+       if (!info)
+               return 0; /* Continue only if SPC is initialised */
+@@ -582,8 +583,17 @@ static int __init ve_spc_clk_init(void)
+                       continue;
+               }
+ 
++              cluster = topology_physical_package_id(cpu_dev->id);
++              if (init_opp_table[cluster])
++                      continue;
++
+               if (ve_init_opp_table(cpu_dev))
+                       pr_warn("failed to initialise cpu%d opp table\n", cpu);
++              else if (dev_pm_opp_set_sharing_cpus(cpu_dev,
++                       topology_core_cpumask(cpu_dev->id)))
++                      pr_warn("failed to mark OPPs shared for cpu%d\n", cpu);
++              else
++                      init_opp_table[cluster] = true;
+       }
+ 
+       platform_device_register_simple("vexpress-spc-cpufreq", -1, NULL, 0);
+diff --git a/arch/arm64/include/asm/pgtable-prot.h 
b/arch/arm64/include/asm/pgtable-prot.h
+index f705d96a76f2..5bc3de78306a 100644
+--- a/arch/arm64/include/asm/pgtable-prot.h
++++ b/arch/arm64/include/asm/pgtable-prot.h
+@@ -77,13 +77,12 @@
+ #define PAGE_COPY_EXEC                __pgprot(_PAGE_DEFAULT | PTE_USER | 
PTE_NG | PTE_PXN)
+ #define PAGE_READONLY         __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | 
PTE_PXN | PTE_UXN)
+ #define PAGE_READONLY_EXEC    __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | 
PTE_PXN)
+-#define PAGE_EXECONLY         __pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN)
+ 
+ #define __P000  PAGE_NONE
+ #define __P001  PAGE_READONLY
+ #define __P010  PAGE_COPY
+ #define __P011  PAGE_COPY
+-#define __P100  PAGE_EXECONLY
++#define __P100  PAGE_READONLY_EXEC
+ #define __P101  PAGE_READONLY_EXEC
+ #define __P110  PAGE_COPY_EXEC
+ #define __P111  PAGE_COPY_EXEC
+@@ -92,7 +91,7 @@
+ #define __S001  PAGE_READONLY
+ #define __S010  PAGE_SHARED
+ #define __S011  PAGE_SHARED
+-#define __S100  PAGE_EXECONLY
++#define __S100  PAGE_READONLY_EXEC
+ #define __S101  PAGE_READONLY_EXEC
+ #define __S110  PAGE_SHARED_EXEC
+ #define __S111  PAGE_SHARED_EXEC
+diff --git a/arch/arm64/include/asm/pgtable.h 
b/arch/arm64/include/asm/pgtable.h
+index edb2c359480d..56ba1389a95a 100644
+--- a/arch/arm64/include/asm/pgtable.h
++++ b/arch/arm64/include/asm/pgtable.h
+@@ -83,12 +83,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE / 
sizeof(unsigned long)];
+ #define pte_dirty(pte)                (pte_sw_dirty(pte) || pte_hw_dirty(pte))
+ 
+ #define pte_valid(pte)                (!!(pte_val(pte) & PTE_VALID))
+-/*
+- * Execute-only user mappings do not have the PTE_USER bit set. All valid
+- * kernel mappings have the PTE_UXN bit set.
+- */
+ #define pte_valid_not_user(pte) \
+-      ((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == (PTE_VALID | 
PTE_UXN))
++      ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
+ #define pte_valid_young(pte) \
+       ((pte_val(pte) & (PTE_VALID | PTE_AF)) == (PTE_VALID | PTE_AF))
+ #define pte_valid_user(pte) \
+@@ -104,8 +100,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE / 
sizeof(unsigned long)];
+ 
+ /*
+  * p??_access_permitted() is true for valid user mappings (subject to the
+- * write permission check) other than user execute-only which do not have the
+- * PTE_USER bit set. PROT_NONE mappings do not have the PTE_VALID bit set.
++ * write permission check). PROT_NONE mappings do not have the PTE_VALID bit
++ * set.
+  */
+ #define pte_access_permitted(pte, write) \
+       (pte_valid_user(pte) && (!(write) || pte_write(pte)))
+diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
+index 575c11a6f9b6..f3d3f2e97add 100644
+--- a/arch/arm64/mm/fault.c
++++ b/arch/arm64/mm/fault.c
+@@ -319,7 +319,7 @@ static int __kprobes do_page_fault(unsigned long addr, 
unsigned int esr,
+       struct task_struct *tsk;
+       struct mm_struct *mm;
+       int fault, sig, code;
+-      unsigned long vm_flags = VM_READ | VM_WRITE;
++      unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC;
+       unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
+ 
+       if (notify_page_fault(regs, esr))
+diff --git a/arch/mips/include/asm/thread_info.h 
b/arch/mips/include/asm/thread_info.h
+index e309d8fcb516..da1cb0499d6c 100644
+--- a/arch/mips/include/asm/thread_info.h
++++ b/arch/mips/include/asm/thread_info.h
+@@ -52,8 +52,26 @@ struct thread_info {
+ #define init_thread_info      (init_thread_union.thread_info)
+ #define init_stack            (init_thread_union.stack)
+ 
+-/* How to get the thread information struct from C.  */
++/*
++ * A pointer to the struct thread_info for the currently executing thread is
++ * held in register $28/$gp.
++ *
++ * We declare __current_thread_info as a global register variable rather than 
a
++ * local register variable within current_thread_info() because clang doesn't
++ * support explicit local register variables.
++ *
++ * When building the VDSO we take care not to declare the global register
++ * variable because this causes GCC to not preserve the value of $28/$gp in
++ * functions that change its value (which is common in the PIC VDSO when
++ * accessing the GOT). Since the VDSO shouldn't be accessing
++ * __current_thread_info anyway we declare it extern in order to cause a link
++ * failure if it's referenced.
++ */
++#ifdef __VDSO__
++extern struct thread_info *__current_thread_info;
++#else
+ register struct thread_info *__current_thread_info __asm__("$28");
++#endif
+ 
+ static inline struct thread_info *current_thread_info(void)
+ {
+diff --git a/arch/parisc/include/asm/cmpxchg.h 
b/arch/parisc/include/asm/cmpxchg.h
+index 7ada30900807..90253bdc2ee5 100644
+--- a/arch/parisc/include/asm/cmpxchg.h
++++ b/arch/parisc/include/asm/cmpxchg.h
+@@ -43,8 +43,14 @@ __xchg(unsigned long x, __volatile__ void *ptr, int size)
+ **            if (((unsigned long)p & 0xf) == 0)
+ **                    return __ldcw(p);
+ */
+-#define xchg(ptr, x) \
+-      ((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
++#define xchg(ptr, x)                                                  \
++({                                                                    \
++      __typeof__(*(ptr)) __ret;                                       \
++      __typeof__(*(ptr)) _x_ = (x);                                   \
++      __ret = (__typeof__(*(ptr)))                                    \
++              __xchg((unsigned long)_x_, (ptr), sizeof(*(ptr)));      \
++      __ret;                                                          \
++})
+ 
+ /* bug catcher for when unsupported size is used - won't link */
+ extern void __cmpxchg_called_with_bad_pointer(void);
+diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
+index 1e93dbc88e80..34f70d36b16d 100644
+--- a/arch/powerpc/mm/mem.c
++++ b/arch/powerpc/mm/mem.c
+@@ -345,6 +345,14 @@ void __init mem_init(void)
+       BUILD_BUG_ON(MMU_PAGE_COUNT > 16);
+ 
+ #ifdef CONFIG_SWIOTLB
++      /*
++       * Some platforms (e.g. 85xx) limit DMA-able memory way below
++       * 4G. We force memblock to bottom-up mode to ensure that the
++       * memory allocated in swiotlb_init() is DMA-able.
++       * As it's the last memblock allocation, no need to reset it
++       * back to to-down.
++       */
++      memblock_set_bottom_up(true);
+       swiotlb_init(0);
+ #endif
+ 
+diff --git a/arch/powerpc/platforms/pseries/hvconsole.c 
b/arch/powerpc/platforms/pseries/hvconsole.c
+index 74da18de853a..73ec15cd2708 100644
+--- a/arch/powerpc/platforms/pseries/hvconsole.c
++++ b/arch/powerpc/platforms/pseries/hvconsole.c
+@@ -62,7 +62,7 @@ EXPORT_SYMBOL(hvc_get_chars);
+  * @vtermno: The vtermno or unit_address of the adapter from which the data
+  *    originated.
+  * @buf: The character buffer that contains the character data to send to
+- *    firmware.
++ *    firmware. Must be at least 16 bytes, even if count is less than 16.
+  * @count: Send this number of characters.
+  */
+ int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
+diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
+index 02476d2333df..c62eb09b2ba7 100644
+--- a/arch/s390/kernel/perf_cpum_sf.c
++++ b/arch/s390/kernel/perf_cpum_sf.c
+@@ -1295,18 +1295,28 @@ static void hw_perf_event_update(struct perf_event 
*event, int flush_all)
+                */
+               if (flush_all && done)
+                       break;
+-
+-              /* If an event overflow happened, discard samples by
+-               * processing any remaining sample-data-blocks.
+-               */
+-              if (event_overflow)
+-                      flush_all = 1;
+       }
+ 
+       /* Account sample overflows in the event hardware structure */
+       if (sampl_overflow)
+               OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) +
+                                                sampl_overflow, 1 + num_sdb);
++
++      /* Perf_event_overflow() and perf_event_account_interrupt() limit
++       * the interrupt rate to an upper limit. Roughly 1000 samples per
++       * task tick.
++       * Hitting this limit results in a large number
++       * of throttled REF_REPORT_THROTTLE entries and the samples
++       * are dropped.
++       * Slightly increase the interval to avoid hitting this limit.
++       */
++      if (event_overflow) {
++              SAMPL_RATE(hwc) += DIV_ROUND_UP(SAMPL_RATE(hwc), 10);
++              debug_sprintf_event(sfdbg, 1, "%s: rate adjustment %ld\n",
++                                  __func__,
++                                  DIV_ROUND_UP(SAMPL_RATE(hwc), 10));
++      }
++
+       if (sampl_overflow || event_overflow)
+               debug_sprintf_event(sfdbg, 4, "hw_perf_event_update: "
+                                   "overflow stats: sample=%llu event=%llu\n",
+diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
+index d52a94e9f57f..cba8e56cd63d 100644
+--- a/arch/s390/kernel/smp.c
++++ b/arch/s390/kernel/smp.c
+@@ -691,39 +691,67 @@ static struct sclp_core_info *smp_get_core_info(void)
+ 
+ static int smp_add_present_cpu(int cpu);
+ 
+-static int __smp_rescan_cpus(struct sclp_core_info *info, int sysfs_add)
++static int smp_add_core(struct sclp_core_entry *core, cpumask_t *avail,
++                      bool configured, bool early)
+ {
+       struct pcpu *pcpu;
+-      cpumask_t avail;
+-      int cpu, nr, i, j;
++      int cpu, nr, i;
+       u16 address;
+ 
+       nr = 0;
+-      cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
+-      cpu = cpumask_first(&avail);
+-      for (i = 0; (i < info->combined) && (cpu < nr_cpu_ids); i++) {
+-              if (sclp.has_core_type && info->core[i].type != boot_core_type)
++      if (sclp.has_core_type && core->type != boot_core_type)
++              return nr;
++      cpu = cpumask_first(avail);
++      address = core->core_id << smp_cpu_mt_shift;
++      for (i = 0; (i <= smp_cpu_mtid) && (cpu < nr_cpu_ids); i++) {
++              if (pcpu_find_address(cpu_present_mask, address + i))
+                       continue;
+-              address = info->core[i].core_id << smp_cpu_mt_shift;
+-              for (j = 0; j <= smp_cpu_mtid; j++) {
+-                      if (pcpu_find_address(cpu_present_mask, address + j))
+-                              continue;
+-                      pcpu = pcpu_devices + cpu;
+-                      pcpu->address = address + j;
+-                      pcpu->state =
+-                              (cpu >= info->configured*(smp_cpu_mtid + 1)) ?
+-                              CPU_STATE_STANDBY : CPU_STATE_CONFIGURED;
+-                      smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
+-                      set_cpu_present(cpu, true);
+-                      if (sysfs_add && smp_add_present_cpu(cpu) != 0)
+-                              set_cpu_present(cpu, false);
+-                      else
+-                              nr++;
+-                      cpu = cpumask_next(cpu, &avail);
+-                      if (cpu >= nr_cpu_ids)
++              pcpu = pcpu_devices + cpu;
++              pcpu->address = address + i;
++              if (configured)
++                      pcpu->state = CPU_STATE_CONFIGURED;
++              else
++                      pcpu->state = CPU_STATE_STANDBY;
++              smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
++              set_cpu_present(cpu, true);
++              if (!early && smp_add_present_cpu(cpu) != 0)
++                      set_cpu_present(cpu, false);
++              else
++                      nr++;
++              cpumask_clear_cpu(cpu, avail);
++              cpu = cpumask_next(cpu, avail);
++      }
++      return nr;
++}
++
++static int __smp_rescan_cpus(struct sclp_core_info *info, bool early)
++{
++      struct sclp_core_entry *core;
++      cpumask_t avail;
++      bool configured;
++      u16 core_id;
++      int nr, i;
++
++      nr = 0;
++      cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
++      /*
++       * Add IPL core first (which got logical CPU number 0) to make sure
++       * that all SMT threads get subsequent logical CPU numbers.
++       */
++      if (early) {
++              core_id = pcpu_devices[0].address >> smp_cpu_mt_shift;
++              for (i = 0; i < info->configured; i++) {
++                      core = &info->core[i];
++                      if (core->core_id == core_id) {
++                              nr += smp_add_core(core, &avail, true, early);
+                               break;
++                      }
+               }
+       }
++      for (i = 0; i < info->combined; i++) {
++              configured = i < info->configured;
++              nr += smp_add_core(&info->core[i], &avail, configured, early);
++      }
+       return nr;
+ }
+ 
+@@ -771,7 +799,7 @@ static void __init smp_detect_cpus(void)
+ 
+       /* Add CPUs present at boot */
+       get_online_cpus();
+-      __smp_rescan_cpus(info, 0);
++      __smp_rescan_cpus(info, true);
+       put_online_cpus();
+       kfree(info);
+ }
+@@ -1127,7 +1155,7 @@ int __ref smp_rescan_cpus(void)
+               return -ENOMEM;
+       get_online_cpus();
+       mutex_lock(&smp_cpu_state_mutex);
+-      nr = __smp_rescan_cpus(info, 1);
++      nr = __smp_rescan_cpus(info, false);
+       mutex_unlock(&smp_cpu_state_mutex);
+       put_online_cpus();
+       kfree(info);
+diff --git a/arch/tile/lib/atomic_asm_32.S b/arch/tile/lib/atomic_asm_32.S
+index 1a70e6c0f259..94709ab41ed8 100644
+--- a/arch/tile/lib/atomic_asm_32.S
++++ b/arch/tile/lib/atomic_asm_32.S
+@@ -24,8 +24,7 @@
+  * has an opportunity to return -EFAULT to the user if needed.
+  * The 64-bit routines just return a "long long" with the value,
+  * since they are only used from kernel space and don't expect to fault.
+- * Support for 16-bit ops is included in the framework but we don't provide
+- * any (x86_64 has an atomic_inc_short(), so we might want to some day).
++ * Support for 16-bit ops is included in the framework but we don't provide 
any.
+  *
+  * Note that the caller is advised to issue a suitable L1 or L2
+  * prefetch on the address being manipulated to avoid extra stalls.
+diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
+index 1e9f610d36a4..c26cca506f64 100644
+--- a/arch/x86/events/core.c
++++ b/arch/x86/events/core.c
+@@ -374,7 +374,7 @@ int x86_add_exclusive(unsigned int what)
+        * LBR and BTS are still mutually exclusive.
+        */
+       if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt)
+-              return 0;
++              goto out;
+ 
+       if (!atomic_inc_not_zero(&x86_pmu.lbr_exclusive[what])) {
+               mutex_lock(&pmc_reserve_mutex);
+@@ -386,6 +386,7 @@ int x86_add_exclusive(unsigned int what)
+               mutex_unlock(&pmc_reserve_mutex);
+       }
+ 
++out:
+       atomic_inc(&active_events);
+       return 0;
+ 
+@@ -396,11 +397,15 @@ fail_unlock:
+ 
+ void x86_del_exclusive(unsigned int what)
+ {
++      atomic_dec(&active_events);
++
++      /*
++       * See the comment in x86_add_exclusive().
++       */
+       if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt)
+               return;
+ 
+       atomic_dec(&x86_pmu.lbr_exclusive[what]);
+-      atomic_dec(&active_events);
+ }
+ 
+ int x86_setup_perfctr(struct perf_event *event)
+diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h
+index 76a35c1213d2..305c6eed9141 100644
+--- a/arch/x86/include/asm/atomic.h
++++ b/arch/x86/include/asm/atomic.h
+@@ -249,19 +249,6 @@ static __always_inline int __atomic_add_unless(atomic_t 
*v, int a, int u)
+       return c;
+ }
+ 
+-/**
+- * atomic_inc_short - increment of a short integer
+- * @v: pointer to type int
+- *
+- * Atomically adds 1 to @v
+- * Returns the new value of @u
+- */
+-static __always_inline short int atomic_inc_short(short int *v)
+-{
+-      asm(LOCK_PREFIX "addw $1, %0" : "+m" (*v));
+-      return *v;
+-}
+-
+ #ifdef CONFIG_X86_32
+ # include <asm/atomic64_32.h>
+ #else
+diff --git a/block/blk-map.c b/block/blk-map.c
+index a8b4f526d8bb..52edbe6b9380 100644
+--- a/block/blk-map.c
++++ b/block/blk-map.c
+@@ -142,7 +142,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct 
request *rq,
+       return 0;
+ 
+ unmap_rq:
+-      __blk_rq_unmap_user(bio);
++      blk_rq_unmap_user(bio);
+ fail:
+       rq->bio = NULL;
+       return ret;
+diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c
+index 3c9fdd6983aa..b6e5447d563e 100644
+--- a/block/compat_ioctl.c
++++ b/block/compat_ioctl.c
+@@ -5,6 +5,7 @@
+ #include <linux/compat.h>
+ #include <linux/elevator.h>
+ #include <linux/hdreg.h>
++#include <linux/pr.h>
+ #include <linux/slab.h>
+ #include <linux/syscalls.h>
+ #include <linux/types.h>
+@@ -406,6 +407,14 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, 
unsigned long arg)
+       case BLKTRACETEARDOWN: /* compatible */
+               ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg));
+               return ret;
++      case IOC_PR_REGISTER:
++      case IOC_PR_RESERVE:
++      case IOC_PR_RELEASE:
++      case IOC_PR_PREEMPT:
++      case IOC_PR_PREEMPT_ABORT:
++      case IOC_PR_CLEAR:
++              return blkdev_ioctl(bdev, mode, cmd,
++                              (unsigned long)compat_ptr(arg));
+       default:
+               if (disk->fops->compat_ioctl)
+                       ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg);
+diff --git a/drivers/ata/ahci_brcm.c b/drivers/ata/ahci_brcm.c
+index 6f8a7341fa08..f50a76ad63e4 100644
+--- a/drivers/ata/ahci_brcm.c
++++ b/drivers/ata/ahci_brcm.c
+@@ -25,6 +25,7 @@
+ #include <linux/module.h>
+ #include <linux/of.h>
+ #include <linux/platform_device.h>
++#include <linux/reset.h>
+ #include <linux/string.h>
+ 
+ #include "ahci.h"
+@@ -88,6 +89,7 @@ struct brcm_ahci_priv {
+       u32 port_mask;
+       u32 quirks;
+       enum brcm_ahci_version version;
++      struct reset_control *rcdev;
+ };
+ 
+ static const struct ata_port_info ahci_brcm_port_info = {
+@@ -226,19 +228,12 @@ static void brcm_sata_phys_disable(struct brcm_ahci_priv 
*priv)
+                       brcm_sata_phy_disable(priv, i);
+ }
+ 
+-static u32 brcm_ahci_get_portmask(struct platform_device *pdev,
++static u32 brcm_ahci_get_portmask(struct ahci_host_priv *hpriv,
+                                 struct brcm_ahci_priv *priv)
+ {
+-      void __iomem *ahci;
+-      struct resource *res;
+       u32 impl;
+ 
+-      res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ahci");
+-      ahci = devm_ioremap_resource(&pdev->dev, res);
+-      if (IS_ERR(ahci))
+-              return 0;
+-
+-      impl = readl(ahci + HOST_PORTS_IMPL);
++      impl = readl(hpriv->mmio + HOST_PORTS_IMPL);
+ 
+       if (fls(impl) > SATA_TOP_MAX_PHYS)
+               dev_warn(priv->dev, "warning: more ports than PHYs (%#x)\n",
+@@ -246,9 +241,6 @@ static u32 brcm_ahci_get_portmask(struct platform_device 
*pdev,
+       else if (!impl)
+               dev_info(priv->dev, "no ports found\n");
+ 
+-      devm_iounmap(&pdev->dev, ahci);
+-      devm_release_mem_region(&pdev->dev, res->start, resource_size(res));
+-
+       return impl;
+ }
+ 
+@@ -275,11 +267,10 @@ static int brcm_ahci_suspend(struct device *dev)
+       struct ata_host *host = dev_get_drvdata(dev);
+       struct ahci_host_priv *hpriv = host->private_data;
+       struct brcm_ahci_priv *priv = hpriv->plat_data;
+-      int ret;
+ 
+-      ret = ahci_platform_suspend(dev);
+       brcm_sata_phys_disable(priv);
+-      return ret;
++
++      return ahci_platform_suspend(dev);
+ }
+ 
+ static int brcm_ahci_resume(struct device *dev)
+@@ -287,11 +278,44 @@ static int brcm_ahci_resume(struct device *dev)
+       struct ata_host *host = dev_get_drvdata(dev);
+       struct ahci_host_priv *hpriv = host->private_data;
+       struct brcm_ahci_priv *priv = hpriv->plat_data;
++      int ret;
++
++      /* Make sure clocks are turned on before re-configuration */
++      ret = ahci_platform_enable_clks(hpriv);
++      if (ret)
++              return ret;
+ 
+       brcm_sata_init(priv);
+       brcm_sata_phys_enable(priv);
+       brcm_sata_alpm_init(hpriv);
+-      return ahci_platform_resume(dev);
++
++      /* Since we had to enable clocks earlier on, we cannot use
++       * ahci_platform_resume() as-is since a second call to
++       * ahci_platform_enable_resources() would bump up the resources
++       * (regulators, clocks, PHYs) count artificially so we copy the part
++       * after ahci_platform_enable_resources().
++       */
++      ret = ahci_platform_enable_phys(hpriv);
++      if (ret)
++              goto out_disable_phys;
++
++      ret = ahci_platform_resume_host(dev);
++      if (ret)
++              goto out_disable_platform_phys;
++
++      /* We resumed so update PM runtime state */
++      pm_runtime_disable(dev);
++      pm_runtime_set_active(dev);
++      pm_runtime_enable(dev);
++
++      return 0;
++
++out_disable_platform_phys:
++      ahci_platform_disable_phys(hpriv);
++out_disable_phys:
++      brcm_sata_phys_disable(priv);
++      ahci_platform_disable_clks(hpriv);
++      return ret;
+ }
+ #endif
+ 
+@@ -332,43 +356,73 @@ static int brcm_ahci_probe(struct platform_device *pdev)
+       if (IS_ERR(priv->top_ctrl))
+               return PTR_ERR(priv->top_ctrl);
+ 
++      /* Reset is optional depending on platform */
++      priv->rcdev = devm_reset_control_get(&pdev->dev, "ahci");
++      if (!IS_ERR_OR_NULL(priv->rcdev))
++              reset_control_deassert(priv->rcdev);
++
+       if ((priv->version == BRCM_SATA_BCM7425) ||
+               (priv->version == BRCM_SATA_NSP)) {
+               priv->quirks |= BRCM_AHCI_QUIRK_NO_NCQ;
+               priv->quirks |= BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE;
+       }
+ 
++      hpriv = ahci_platform_get_resources(pdev);
++      if (IS_ERR(hpriv)) {
++              ret = PTR_ERR(hpriv);
++              goto out_reset;
++      }
++
++      ret = ahci_platform_enable_clks(hpriv);
++      if (ret)
++              goto out_reset;
++
++      /* Must be first so as to configure endianness including that
++       * of the standard AHCI register space.
++       */
+       brcm_sata_init(priv);
+ 
+-      priv->port_mask = brcm_ahci_get_portmask(pdev, priv);
+-      if (!priv->port_mask)
+-              return -ENODEV;
++      /* Initializes priv->port_mask which is used below */
++      priv->port_mask = brcm_ahci_get_portmask(hpriv, priv);
++      if (!priv->port_mask) {
++              ret = -ENODEV;
++              goto out_disable_clks;
++      }
+ 
++      /* Must be done before ahci_platform_enable_phys() */
+       brcm_sata_phys_enable(priv);
+ 
+-      hpriv = ahci_platform_get_resources(pdev);
+-      if (IS_ERR(hpriv))
+-              return PTR_ERR(hpriv);
+       hpriv->plat_data = priv;
+       hpriv->flags = AHCI_HFLAG_WAKE_BEFORE_STOP;
+ 
+       brcm_sata_alpm_init(hpriv);
+ 
+-      ret = ahci_platform_enable_resources(hpriv);
+-      if (ret)
+-              return ret;
+-
+       if (priv->quirks & BRCM_AHCI_QUIRK_NO_NCQ)
+               hpriv->flags |= AHCI_HFLAG_NO_NCQ;
+ 
++      ret = ahci_platform_enable_phys(hpriv);
++      if (ret)
++              goto out_disable_phys;
++
+       ret = ahci_platform_init_host(pdev, hpriv, &ahci_brcm_port_info,
+                                     &ahci_platform_sht);
+       if (ret)
+-              return ret;
++              goto out_disable_platform_phys;
+ 
+       dev_info(dev, "Broadcom AHCI SATA3 registered\n");
+ 
+       return 0;
++
++out_disable_platform_phys:
++      ahci_platform_disable_phys(hpriv);
++out_disable_phys:
++      brcm_sata_phys_disable(priv);
++out_disable_clks:
++      ahci_platform_disable_clks(hpriv);
++out_reset:
++      if (!IS_ERR_OR_NULL(priv->rcdev))
++              reset_control_assert(priv->rcdev);
++      return ret;
+ }
+ 
+ static int brcm_ahci_remove(struct platform_device *pdev)
+@@ -378,12 +432,12 @@ static int brcm_ahci_remove(struct platform_device *pdev)
+       struct brcm_ahci_priv *priv = hpriv->plat_data;
+       int ret;
+ 
++      brcm_sata_phys_disable(priv);
++
+       ret = ata_platform_remove_one(pdev);
+       if (ret)
+               return ret;
+ 
+-      brcm_sata_phys_disable(priv);
+-
+       return 0;
+ }
+ 
+diff --git a/drivers/ata/libahci_platform.c b/drivers/ata/libahci_platform.c
+index 65371e1befe8..0b80502bc1c5 100644
+--- a/drivers/ata/libahci_platform.c
++++ b/drivers/ata/libahci_platform.c
+@@ -46,7 +46,7 @@ EXPORT_SYMBOL_GPL(ahci_platform_ops);
+  * RETURNS:
+  * 0 on success otherwise a negative error code
+  */
+-static int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
++int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
+ {
+       int rc, i;
+ 
+@@ -71,6 +71,7 @@ disable_phys:
+       }
+       return rc;
+ }
++EXPORT_SYMBOL_GPL(ahci_platform_enable_phys);
+ 
+ /**
+  * ahci_platform_disable_phys - Disable PHYs
+@@ -78,7 +79,7 @@ disable_phys:
+  *
+  * This function disables all PHYs found in hpriv->phys.
+  */
+-static void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
++void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
+ {
+       int i;
+ 
+@@ -87,6 +88,7 @@ static void ahci_platform_disable_phys(struct ahci_host_priv 
*hpriv)
+               phy_exit(hpriv->phys[i]);
+       }
+ }
++EXPORT_SYMBOL_GPL(ahci_platform_disable_phys);
+ 
+ /**
+  * ahci_platform_enable_clks - Enable platform clocks
+diff --git a/drivers/block/xen-blkback/blkback.c 
b/drivers/block/xen-blkback/blkback.c
+index d6eaaa25d1cc..a700e525535c 100644
+--- a/drivers/block/xen-blkback/blkback.c
++++ b/drivers/block/xen-blkback/blkback.c
+@@ -929,6 +929,8 @@ next:
+ out_of_memory:
+       pr_alert("%s: out of memory\n", __func__);
+       put_free_pages(ring, pages_to_gnt, segs_to_map);
++      for (i = last_map; i < num; i++)
++              pages[i]->handle = BLKBACK_INVALID_HANDLE;
+       return -ENOMEM;
+ }
+ 
+diff --git a/drivers/block/xen-blkback/xenbus.c 
b/drivers/block/xen-blkback/xenbus.c
+index ad736d7de838..1d1f86657967 100644
+--- a/drivers/block/xen-blkback/xenbus.c
++++ b/drivers/block/xen-blkback/xenbus.c
+@@ -178,6 +178,15 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
+       blkif->domid = domid;
+       atomic_set(&blkif->refcnt, 1);
+       init_completion(&blkif->drain_complete);
++
++      /*
++       * Because freeing back to the cache may be deferred, it is not
++       * safe to unload the module (and hence destroy the cache) until
++       * this has completed. To prevent premature unloading, take an
++       * extra module reference here and release only when the object
++       * has been freed back to the cache.
++       */
++      __module_get(THIS_MODULE);
+       INIT_WORK(&blkif->free_work, xen_blkif_deferred_free);
+ 
+       return blkif;
+@@ -322,6 +331,7 @@ static void xen_blkif_free(struct xen_blkif *blkif)
+ 
+       /* Make sure everything is drained before shutting down */
+       kmem_cache_free(xen_blkif_cachep, blkif);
++      module_put(THIS_MODULE);
+ }
+ 
+ int __init xen_blkif_interface_init(void)
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 1d1c0d7aec88..4e3b24a0511f 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -1069,7 +1069,7 @@ static int btusb_open(struct hci_dev *hdev)
+       if (data->setup_on_usb) {
+               err = data->setup_on_usb(hdev);
+               if (err < 0)
+-                      return err;
++                      goto setup_fail;
+       }
+ 
+       data->intf->needs_remote_wakeup = 1;
+@@ -1101,6 +1101,7 @@ done:
+ 
+ failed:
+       clear_bit(BTUSB_INTR_RUNNING, &data->flags);
++setup_fail:
+       usb_autopm_put_interface(data->intf);
+       return err;
+ }
+diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
+index df62e38de5f5..1ba9d02381e8 100644
+--- a/drivers/devfreq/devfreq.c
++++ b/drivers/devfreq/devfreq.c
+@@ -482,11 +482,6 @@ static int devfreq_notifier_call(struct notifier_block 
*nb, unsigned long type,
+ static void _remove_devfreq(struct devfreq *devfreq)
+ {
+       mutex_lock(&devfreq_list_lock);
+-      if (IS_ERR(find_device_devfreq(devfreq->dev.parent))) {
+-              mutex_unlock(&devfreq_list_lock);
+-              dev_warn(&devfreq->dev, "releasing devfreq which doesn't 
exist\n");
+-              return;
+-      }
+       list_del(&devfreq->node);
+       mutex_unlock(&devfreq_list_lock);
+ 
+@@ -558,6 +553,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
+       devfreq->dev.parent = dev;
+       devfreq->dev.class = devfreq_class;
+       devfreq->dev.release = devfreq_dev_release;
++      INIT_LIST_HEAD(&devfreq->node);
+       devfreq->profile = profile;
+       strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN);
+       devfreq->previous_freq = profile->initial_freq;
+@@ -986,7 +982,7 @@ static ssize_t available_governors_show(struct device *d,
+        * The devfreq with immutable governor (e.g., passive) shows
+        * only own governor.
+        */
+-      if (df->governor->immutable) {
++      if (df->governor && df->governor->immutable) {
+               count = scnprintf(&buf[count], DEVFREQ_NAME_LEN,
+                                  "%s ", df->governor_name);
+       /*
+diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c
+index 15475892af0c..bc19ac0e662e 100644
+--- a/drivers/firewire/net.c
++++ b/drivers/firewire/net.c
+@@ -249,7 +249,11 @@ static int fwnet_header_cache(const struct neighbour 
*neigh,
+       h = (struct fwnet_header *)((u8 *)hh->hh_data + 
HH_DATA_OFF(sizeof(*h)));
+       h->h_proto = type;
+       memcpy(h->h_dest, neigh->ha, net->addr_len);
+-      hh->hh_len = FWNET_HLEN;
++
++      /* Pairs with the READ_ONCE() in neigh_resolve_output(),
++       * neigh_hh_output() and neigh_update_hhs().
++       */
++      smp_store_release(&hh->hh_len, FWNET_HLEN);
+ 
+       return 0;
+ }
+diff --git a/drivers/firmware/efi/libstub/gop.c 
b/drivers/firmware/efi/libstub/gop.c
+index 24c461dea7af..fd8053f9556e 100644
+--- a/drivers/firmware/efi/libstub/gop.c
++++ b/drivers/firmware/efi/libstub/gop.c
+@@ -85,30 +85,6 @@ setup_pixel_info(struct screen_info *si, u32 
pixels_per_scan_line,
+       }
+ }
+ 
+-static efi_status_t
+-__gop_query32(efi_system_table_t *sys_table_arg,
+-            struct efi_graphics_output_protocol_32 *gop32,
+-            struct efi_graphics_output_mode_info **info,
+-            unsigned long *size, u64 *fb_base)
+-{
+-      struct efi_graphics_output_protocol_mode_32 *mode;
+-      efi_graphics_output_protocol_query_mode query_mode;
+-      efi_status_t status;
+-      unsigned long m;
+-
+-      m = gop32->mode;
+-      mode = (struct efi_graphics_output_protocol_mode_32 *)m;
+-      query_mode = (void *)(unsigned long)gop32->query_mode;
+-
+-      status = __efi_call_early(query_mode, (void *)gop32, mode->mode, size,
+-                                info);
+-      if (status != EFI_SUCCESS)
+-              return status;
+-
+-      *fb_base = mode->frame_buffer_base;
+-      return status;
+-}
+-
+ static efi_status_t
+ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si,
+             efi_guid_t *proto, unsigned long size, void **gop_handle)
+@@ -121,7 +97,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+       u64 fb_base;
+       struct efi_pixel_bitmask pixel_info;
+       int pixel_format;
+-      efi_status_t status = EFI_NOT_FOUND;
++      efi_status_t status;
+       u32 *handles = (u32 *)(unsigned long)gop_handle;
+       int i;
+ 
+@@ -130,6 +106,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+ 
+       nr_gops = size / sizeof(u32);
+       for (i = 0; i < nr_gops; i++) {
++              struct efi_graphics_output_protocol_mode_32 *mode;
+               struct efi_graphics_output_mode_info *info = NULL;
+               efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID;
+               bool conout_found = false;
+@@ -147,9 +124,11 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+               if (status == EFI_SUCCESS)
+                       conout_found = true;
+ 
+-              status = __gop_query32(sys_table_arg, gop32, &info, &size,
+-                                     &current_fb_base);
+-              if (status == EFI_SUCCESS && (!first_gop || conout_found) &&
++              mode = (void *)(unsigned long)gop32->mode;
++              info = (void *)(unsigned long)mode->info;
++              current_fb_base = mode->frame_buffer_base;
++
++              if ((!first_gop || conout_found) &&
+                   info->pixel_format != PIXEL_BLT_ONLY) {
+                       /*
+                        * Systems that use the UEFI Console Splitter may
+@@ -177,7 +156,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+ 
+       /* Did we find any GOPs? */
+       if (!first_gop)
+-              goto out;
++              return EFI_NOT_FOUND;
+ 
+       /* EFI framebuffer */
+       si->orig_video_isVGA = VIDEO_TYPE_EFI;
+@@ -199,32 +178,8 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+       si->lfb_size = si->lfb_linelength * si->lfb_height;
+ 
+       si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS;
+-out:
+-      return status;
+-}
+-
+-static efi_status_t
+-__gop_query64(efi_system_table_t *sys_table_arg,
+-            struct efi_graphics_output_protocol_64 *gop64,
+-            struct efi_graphics_output_mode_info **info,
+-            unsigned long *size, u64 *fb_base)
+-{
+-      struct efi_graphics_output_protocol_mode_64 *mode;
+-      efi_graphics_output_protocol_query_mode query_mode;
+-      efi_status_t status;
+-      unsigned long m;
+-
+-      m = gop64->mode;
+-      mode = (struct efi_graphics_output_protocol_mode_64 *)m;
+-      query_mode = (void *)(unsigned long)gop64->query_mode;
+-
+-      status = __efi_call_early(query_mode, (void *)gop64, mode->mode, size,
+-                                info);
+-      if (status != EFI_SUCCESS)
+-              return status;
+ 
+-      *fb_base = mode->frame_buffer_base;
+-      return status;
++      return EFI_SUCCESS;
+ }
+ 
+ static efi_status_t
+@@ -239,7 +194,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+       u64 fb_base;
+       struct efi_pixel_bitmask pixel_info;
+       int pixel_format;
+-      efi_status_t status = EFI_NOT_FOUND;
++      efi_status_t status;
+       u64 *handles = (u64 *)(unsigned long)gop_handle;
+       int i;
+ 
+@@ -248,6 +203,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+ 
+       nr_gops = size / sizeof(u64);
+       for (i = 0; i < nr_gops; i++) {
++              struct efi_graphics_output_protocol_mode_64 *mode;
+               struct efi_graphics_output_mode_info *info = NULL;
+               efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID;
+               bool conout_found = false;
+@@ -265,9 +221,11 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+               if (status == EFI_SUCCESS)
+                       conout_found = true;
+ 
+-              status = __gop_query64(sys_table_arg, gop64, &info, &size,
+-                                     &current_fb_base);
+-              if (status == EFI_SUCCESS && (!first_gop || conout_found) &&
++              mode = (void *)(unsigned long)gop64->mode;
++              info = (void *)(unsigned long)mode->info;
++              current_fb_base = mode->frame_buffer_base;
++
++              if ((!first_gop || conout_found) &&
+                   info->pixel_format != PIXEL_BLT_ONLY) {
+                       /*
+                        * Systems that use the UEFI Console Splitter may
+@@ -295,7 +253,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+ 
+       /* Did we find any GOPs? */
+       if (!first_gop)
+-              goto out;
++              return EFI_NOT_FOUND;
+ 
+       /* EFI framebuffer */
+       si->orig_video_isVGA = VIDEO_TYPE_EFI;
+@@ -317,8 +275,8 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct 
screen_info *si,
+       si->lfb_size = si->lfb_linelength * si->lfb_height;
+ 
+       si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS;
+-out:
+-      return status;
++
++      return EFI_SUCCESS;
+ }
+ 
+ /*
+diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
+index 6008a30a17d0..58193c939691 100644
+--- a/drivers/gpio/gpiolib.c
++++ b/drivers/gpio/gpiolib.c
+@@ -188,6 +188,14 @@ int gpiod_get_direction(struct gpio_desc *desc)
+       chip = gpiod_to_chip(desc);
+       offset = gpio_chip_hwgpio(desc);
+ 
++      /*
++       * Open drain emulation using input mode may incorrectly report
++       * input here, fix that up.
++       */
++      if (test_bit(FLAG_OPEN_DRAIN, &desc->flags) &&
++          test_bit(FLAG_IS_OUT, &desc->flags))
++              return 0;
++
+       if (!chip->get_direction)
+               return status;
+ 
+diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
+index 4a959740058e..f68dcf5790ad 100644
+--- a/drivers/gpu/drm/drm_dp_mst_topology.c
++++ b/drivers/gpu/drm/drm_dp_mst_topology.c
+@@ -1536,7 +1536,11 @@ static void process_single_up_tx_qlock(struct 
drm_dp_mst_topology_mgr *mgr,
+       if (ret != 1)
+               DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
+ 
+-      txmsg->dst->tx_slots[txmsg->seqno] = NULL;
++      if (txmsg->seqno != -1) {
++              WARN_ON((unsigned int)txmsg->seqno >
++                      ARRAY_SIZE(txmsg->dst->tx_slots));
++              txmsg->dst->tx_slots[txmsg->seqno] = NULL;
++      }
+ }
+ 
+ static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
+diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c
+index a4d81cf4ffa0..16c72d2ddc2e 100644
+--- a/drivers/gpu/drm/drm_property.c
++++ b/drivers/gpu/drm/drm_property.c
+@@ -554,7 +554,7 @@ drm_property_create_blob(struct drm_device *dev, size_t 
length,
+       struct drm_property_blob *blob;
+       int ret;
+ 
+-      if (!length || length > ULONG_MAX - sizeof(struct drm_property_blob))
++      if (!length || length > INT_MAX - sizeof(struct drm_property_blob))
+               return ERR_PTR(-EINVAL);
+ 
+       blob = kzalloc(sizeof(struct drm_property_blob)+length, GFP_KERNEL);
+diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
+index dcfbf326f45c..27653aad8f21 100644
+--- a/drivers/infiniband/core/cma.c
++++ b/drivers/infiniband/core/cma.c
+@@ -4440,6 +4440,7 @@ err:
+       unregister_netdevice_notifier(&cma_nb);
+       rdma_addr_unregister_client(&addr_client);
+       ib_sa_unregister_client(&sa_client);
++      unregister_pernet_subsys(&cma_pernet_operations);
+ err_wq:
+       destroy_workqueue(cma_wq);
+       return ret;
+diff --git a/drivers/infiniband/hw/mlx4/main.c 
b/drivers/infiniband/hw/mlx4/main.c
+index 7ccf7225f75a..adc46b809ef2 100644
+--- a/drivers/infiniband/hw/mlx4/main.c
++++ b/drivers/infiniband/hw/mlx4/main.c
+@@ -3031,16 +3031,17 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void 
*ibdev_ptr)
+       ibdev->ib_active = false;
+       flush_workqueue(wq);
+ 
+-      mlx4_ib_close_sriov(ibdev);
+-      mlx4_ib_mad_cleanup(ibdev);
+-      ib_unregister_device(&ibdev->ib_dev);
+-      mlx4_ib_diag_cleanup(ibdev);
+       if (ibdev->iboe.nb.notifier_call) {
+               if (unregister_netdevice_notifier(&ibdev->iboe.nb))
+                       pr_warn("failure unregistering notifier\n");
+               ibdev->iboe.nb.notifier_call = NULL;
+       }
+ 
++      mlx4_ib_close_sriov(ibdev);
++      mlx4_ib_mad_cleanup(ibdev);
++      ib_unregister_device(&ibdev->ib_dev);
++      mlx4_ib_diag_cleanup(ibdev);
++
+       mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
+                             ibdev->steer_qpn_count);
+       kfree(ibdev->ib_uc_qpns_bitmap);
+diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
+index 9892c41de441..8a50da4f148f 100644
+--- a/drivers/md/raid1.c
++++ b/drivers/md/raid1.c
+@@ -2633,7 +2633,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, 
sector_t sector_nr,
+                               write_targets++;
+                       }
+               }
+-              if (bio->bi_end_io) {
++              if (rdev && bio->bi_end_io) {
+                       atomic_inc(&rdev->nr_pending);
+                       bio->bi_iter.bi_sector = sector_nr + rdev->data_offset;
+                       bio->bi_bdev = rdev->bdev;
+diff --git a/drivers/media/usb/b2c2/flexcop-usb.c 
b/drivers/media/usb/b2c2/flexcop-usb.c
+index 2594d6a7393f..78809bb5e69e 100644
+--- a/drivers/media/usb/b2c2/flexcop-usb.c
++++ b/drivers/media/usb/b2c2/flexcop-usb.c
+@@ -295,7 +295,7 @@ static int flexcop_usb_i2c_req(struct flexcop_i2c_adapter 
*i2c,
+ 
+       mutex_unlock(&fc_usb->data_mutex);
+ 
+-      return 0;
++      return ret;
+ }
+ 
+ /* actual bus specific access functions,
+diff --git a/drivers/media/usb/dvb-usb/af9005.c 
b/drivers/media/usb/dvb-usb/af9005.c
+index 7853261906b1..e5d411007ae4 100644
+--- a/drivers/media/usb/dvb-usb/af9005.c
++++ b/drivers/media/usb/dvb-usb/af9005.c
+@@ -990,8 +990,9 @@ static int af9005_identify_state(struct usb_device *udev,
+       else if (reply == 0x02)
+               *cold = 0;
+       else
+-              return -EIO;
+-      deb_info("Identify state cold = %d\n", *cold);
++              ret = -EIO;
++      if (!ret)
++              deb_info("Identify state cold = %d\n", *cold);
+ 
+ err:
+       kfree(buf);
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
+index 2ec1c43270b7..bb36312c9696 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
+@@ -1112,7 +1112,7 @@ static inline u8 bnx2x_get_path_func_num(struct bnx2x 
*bp)
+               for (i = 0; i < E1H_FUNC_MAX / 2; i++) {
+                       u32 func_config =
+                               MF_CFG_RD(bp,
+-                                        func_mf_config[BP_PORT(bp) + 2 * i].
++                                        func_mf_config[BP_PATH(bp) + 2 * i].
+                                         config);
+                       func_num +=
+                               ((func_config & FUNC_MF_CFG_FUNC_HIDE) ? 0 : 1);
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+index ce8a777b1e97..8d17d464c067 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+@@ -9995,10 +9995,18 @@ static void bnx2x_recovery_failed(struct bnx2x *bp)
+  */
+ static void bnx2x_parity_recover(struct bnx2x *bp)
+ {
+-      bool global = false;
+       u32 error_recovered, error_unrecovered;
+-      bool is_parity;
++      bool is_parity, global = false;
++#ifdef CONFIG_BNX2X_SRIOV
++      int vf_idx;
++
++      for (vf_idx = 0; vf_idx < bp->requested_nr_virtfn; vf_idx++) {
++              struct bnx2x_virtf *vf = BP_VF(bp, vf_idx);
+ 
++              if (vf)
++                      vf->state = VF_LOST;
++      }
++#endif
+       DP(NETIF_MSG_HW, "Handling parity\n");
+       while (1) {
+               switch (bp->recovery_state) {
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h
+index 888d0b6632e8..7152a03e3607 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h
+@@ -139,6 +139,7 @@ struct bnx2x_virtf {
+ #define VF_ACQUIRED   1       /* VF acquired, but not initialized */
+ #define VF_ENABLED    2       /* VF Enabled */
+ #define VF_RESET      3       /* VF FLR'd, pending cleanup */
++#define VF_LOST               4       /* Recovery while VFs are loaded */
+ 
+       bool flr_clnup_stage;   /* true during flr cleanup */
+ 
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c
+index c2d327d9dff0..27142fb195b6 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c
+@@ -2095,6 +2095,18 @@ static void bnx2x_vf_mbx_request(struct bnx2x *bp, 
struct bnx2x_virtf *vf,
+ {
+       int i;
+ 
++      if (vf->state == VF_LOST) {
++              /* Just ack the FW and return if VFs are lost
++               * in case of parity error. VFs are supposed to be timedout
++               * on waiting for PF response.
++               */
++              DP(BNX2X_MSG_IOV,
++                 "VF 0x%x lost, not handling the request\n", vf->abs_vfid);
++
++              storm_memset_vf_mbx_ack(bp, vf->abs_vfid);
++              return;
++      }
++
+       /* check if tlv type is known */
+       if (bnx2x_tlv_supported(mbx->first_tlv.tl.type)) {
+               /* Lock the per vf op mutex and note the locker's identity.
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c 
b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+index 62ccbd47c1db..fc1fa0f9f338 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+@@ -53,7 +53,7 @@ static int sun7i_gmac_init(struct platform_device *pdev, 
void *priv)
+        * rate, which then uses the auto-reparenting feature of the
+        * clock driver, and enabling/disabling the clock.
+        */
+-      if (gmac->interface == PHY_INTERFACE_MODE_RGMII) {
++      if (phy_interface_mode_is_rgmii(gmac->interface)) {
+               clk_set_rate(gmac->tx_clk, SUN7I_GMAC_GMII_RGMII_RATE);
+               clk_prepare_enable(gmac->tx_clk);
+               gmac->clk_enabled = 1;
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+index 5ac48a594951..a2b7c685cbf1 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -55,7 +55,7 @@
+ #include <linux/of_mdio.h>
+ #include "dwmac1000.h"
+ 
+-#define       STMMAC_ALIGN(x)         __ALIGN_KERNEL(x, SMP_CACHE_BYTES)
++#define       STMMAC_ALIGN(x)         ALIGN(ALIGN(x, SMP_CACHE_BYTES), 16)
+ #define       TSO_MAX_BUFF_SIZE       (SZ_16K - 1)
+ 
+ /* Module parameters */
+diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
+index b1dcc7448b4f..854947b9db4e 100644
+--- a/drivers/net/macvlan.c
++++ b/drivers/net/macvlan.c
+@@ -234,7 +234,7 @@ static void macvlan_broadcast(struct sk_buff *skb,
+                             struct net_device *src,
+                             enum macvlan_mode mode)
+ {
+-      const struct ethhdr *eth = eth_hdr(skb);
++      const struct ethhdr *eth = skb_eth_hdr(skb);
+       const struct macvlan_dev *vlan;
+       struct sk_buff *nskb;
+       unsigned int i;
+diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
+index 96258e6a1920..8045cc401009 100644
+--- a/drivers/net/usb/lan78xx.c
++++ b/drivers/net/usb/lan78xx.c
+@@ -442,7 +442,7 @@ static int lan78xx_read_stats(struct lan78xx_net *dev,
+               }
+       } else {
+               netdev_warn(dev->net,
+-                          "Failed to read stat ret = 0x%x", ret);
++                          "Failed to read stat ret = %d", ret);
+       }
+ 
+       kfree(stats);
+@@ -2407,11 +2407,6 @@ static int lan78xx_stop(struct net_device *net)
+       return 0;
+ }
+ 
+-static int lan78xx_linearize(struct sk_buff *skb)
+-{
+-      return skb_linearize(skb);
+-}
+-
+ static struct sk_buff *lan78xx_tx_prep(struct lan78xx_net *dev,
+                                      struct sk_buff *skb, gfp_t flags)
+ {
+@@ -2422,8 +2417,10 @@ static struct sk_buff *lan78xx_tx_prep(struct 
lan78xx_net *dev,
+               return NULL;
+       }
+ 
+-      if (lan78xx_linearize(skb) < 0)
++      if (skb_linearize(skb)) {
++              dev_kfree_skb_any(skb);
+               return NULL;
++      }
+ 
+       tx_cmd_a = (u32)(skb->len & TX_CMD_A_LEN_MASK_) | TX_CMD_A_FCS_;
+ 
+diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
+index 340bd98b8dbd..987bb1db8265 100644
+--- a/drivers/net/vxlan.c
++++ b/drivers/net/vxlan.c
+@@ -2104,7 +2104,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct 
net_device *dev,
+               else if (info->key.tun_flags & TUNNEL_DONT_FRAGMENT)
+                       df = htons(IP_DF);
+ 
+-              tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
++              tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb);
+               ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
+               err = vxlan_build_skb(skb, &rt->dst, sizeof(struct iphdr),
+                                     vni, md, flags, udp_sum);
+@@ -2163,7 +2163,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct 
net_device *dev,
+               if (!info)
+                       udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
+ 
+-              tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
++              tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb);
+               ttl = ttl ? : ip6_dst_hoplimit(ndst);
+               skb_scrub_packet(skb, xnet);
+               err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
+diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 
b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+index f333ef1e3e7b..52b42ecee621 100644
+--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
++++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+@@ -972,6 +972,8 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
+       struct ath_htc_rx_status *rxstatus;
+       struct ath_rx_status rx_stats;
+       bool decrypt_error = false;
++      __be16 rs_datalen;
++      bool is_phyerr;
+ 
+       if (skb->len < HTC_RX_FRAME_HEADER_SIZE) {
+               ath_err(common, "Corrupted RX frame, dropping (len: %d)\n",
+@@ -981,11 +983,24 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
+ 
+       rxstatus = (struct ath_htc_rx_status *)skb->data;
+ 
+-      if (be16_to_cpu(rxstatus->rs_datalen) -
+-          (skb->len - HTC_RX_FRAME_HEADER_SIZE) != 0) {
++      rs_datalen = be16_to_cpu(rxstatus->rs_datalen);
++      if (unlikely(rs_datalen -
++          (skb->len - HTC_RX_FRAME_HEADER_SIZE) != 0)) {
+               ath_err(common,
+                       "Corrupted RX data len, dropping (dlen: %d, skblen: 
%d)\n",
+-                      rxstatus->rs_datalen, skb->len);
++                      rs_datalen, skb->len);
++              goto rx_next;
++      }
++
++      is_phyerr = rxstatus->rs_status & ATH9K_RXERR_PHY;
++      /*
++       * Discard zero-length packets and packets smaller than an ACK
++       * which are not PHY_ERROR (short radar pulses have a length of 3)
++       */
++      if (unlikely(!rs_datalen || (rs_datalen < 10 && !is_phyerr))) {
++              ath_warn(common,
++                       "Short RX data len, dropping (dlen: %d)\n",
++                       rs_datalen);
+               goto rx_next;
+       }
+ 
+@@ -1010,7 +1025,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
+        * Process PHY errors and return so that the packet
+        * can be dropped.
+        */
+-      if (rx_stats.rs_status & ATH9K_RXERR_PHY) {
++      if (unlikely(is_phyerr)) {
+               /* TODO: Not using DFS processing now. */
+               if (ath_cmn_process_fft(&priv->spec_priv, hdr,
+                                   &rx_stats, rx_status->mactime)) {
+diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c
+index 0f97514e3474..c9f20e1394e3 100644
+--- a/drivers/regulator/ab8500.c
++++ b/drivers/regulator/ab8500.c
+@@ -1099,23 +1099,6 @@ static struct ab8500_regulator_info
+               .update_val_idle        = 0x82,
+               .update_val_normal      = 0x02,
+       },
+-      [AB8505_LDO_USB] = {
+-              .desc = {
+-                      .name           = "LDO-USB",
+-                      .ops            = &ab8500_regulator_mode_ops,
+-                      .type           = REGULATOR_VOLTAGE,
+-                      .id             = AB8505_LDO_USB,
+-                      .owner          = THIS_MODULE,
+-                      .n_voltages     = 1,
+-                      .volt_table     = fixed_3300000_voltage,
+-              },
+-              .update_bank            = 0x03,
+-              .update_reg             = 0x82,
+-              .update_mask            = 0x03,
+-              .update_val             = 0x01,
+-              .update_val_idle        = 0x03,
+-              .update_val_normal      = 0x01,
+-      },
+       [AB8505_LDO_AUDIO] = {
+               .desc = {
+                       .name           = "LDO-AUDIO",
+diff --git a/drivers/regulator/rn5t618-regulator.c 
b/drivers/regulator/rn5t618-regulator.c
+index 9c930eb68cda..ffc34e1ee35d 100644
+--- a/drivers/regulator/rn5t618-regulator.c
++++ b/drivers/regulator/rn5t618-regulator.c
+@@ -127,6 +127,7 @@ static struct platform_driver rn5t618_regulator_driver = {
+ 
+ module_platform_driver(rn5t618_regulator_driver);
+ 
++MODULE_ALIAS("platform:rn5t618-regulator");
+ MODULE_AUTHOR("Beniamino Galvani <[email protected]>");
+ MODULE_DESCRIPTION("RN5T618 regulator driver");
+ MODULE_LICENSE("GPL v2");
+diff --git a/drivers/scsi/libsas/sas_discover.c 
b/drivers/scsi/libsas/sas_discover.c
+index 60de66252fa2..b200edc665a5 100644
+--- a/drivers/scsi/libsas/sas_discover.c
++++ b/drivers/scsi/libsas/sas_discover.c
+@@ -97,12 +97,21 @@ static int sas_get_port_device(struct asd_sas_port *port)
+               else
+                       dev->dev_type = SAS_SATA_DEV;
+               dev->tproto = SAS_PROTOCOL_SATA;
+-      } else {
++      } else if (port->oob_mode == SAS_OOB_MODE) {
+               struct sas_identify_frame *id =
+                       (struct sas_identify_frame *) dev->frame_rcvd;
+               dev->dev_type = id->dev_type;
+               dev->iproto = id->initiator_bits;
+               dev->tproto = id->target_bits;
++      } else {
++              /* If the oob mode is OOB_NOT_CONNECTED, the port is
++               * disconnected due to race with PHY down. We cannot
++               * continue to discover this port
++               */
++              sas_put_device(dev);
++              pr_warn("Port %016llx is disconnected when discovering\n",
++                      SAS_ADDR(port->attached_sas_addr));
++              return -ENODEV;
+       }
+ 
+       sas_init_dev(dev);
+diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c
+index 05dcc2abd541..99f06ac7bf4c 100644
+--- a/drivers/scsi/lpfc/lpfc_bsg.c
++++ b/drivers/scsi/lpfc/lpfc_bsg.c
+@@ -4352,12 +4352,6 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct 
fc_bsg_job *job,
+       phba->mbox_ext_buf_ctx.seqNum++;
+       nemb_tp = phba->mbox_ext_buf_ctx.nembType;
+ 
+-      dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
+-      if (!dd_data) {
+-              rc = -ENOMEM;
+-              goto job_error;
+-      }
+-
+       pbuf = (uint8_t *)dmabuf->virt;
+       size = job->request_payload.payload_len;
+       sg_copy_to_buffer(job->request_payload.sg_list,
+@@ -4394,6 +4388,13 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct 
fc_bsg_job *job,
+                               "2968 SLI_CONFIG ext-buffer wr all %d "
+                               "ebuffers received\n",
+                               phba->mbox_ext_buf_ctx.numBuf);
++
++              dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
++              if (!dd_data) {
++                      rc = -ENOMEM;
++                      goto job_error;
++              }
++
+               /* mailbox command structure for base driver */
+               pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
+               if (!pmboxq) {
+@@ -4441,6 +4442,8 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct 
fc_bsg_job *job,
+       return SLI_CONFIG_HANDLED;
+ 
+ job_error:
++      if (pmboxq)
++              mempool_free(pmboxq, phba->mbox_mem_pool);
+       lpfc_bsg_dma_page_free(phba, dmabuf);
+       kfree(dd_data);
+ 
+diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
+index f0fcff032f8a..17b1525d492b 100644
+--- a/drivers/scsi/qla2xxx/qla_isr.c
++++ b/drivers/scsi/qla2xxx/qla_isr.c
+@@ -973,8 +973,6 @@ global_port_update:
+                       ql_dbg(ql_dbg_async, vha, 0x5011,
+                           "Asynchronous PORT UPDATE ignored 
%04x/%04x/%04x.\n",
+                           mb[1], mb[2], mb[3]);
+-
+-                      qlt_async_event(mb[0], vha, mb);
+                       break;
+               }
+ 
+@@ -995,8 +993,6 @@ global_port_update:
+               set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
+               set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
+               set_bit(VP_CONFIG_OK, &vha->vp_flags);
+-
+-              qlt_async_event(mb[0], vha, mb);
+               break;
+ 
+       case MBA_RSCN_UPDATE:           /* State Change Registration */
+diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
+index d220b4f691c7..f714d5f917d1 100644
+--- a/drivers/scsi/qla4xxx/ql4_os.c
++++ b/drivers/scsi/qla4xxx/ql4_os.c
+@@ -4285,7 +4285,6 @@ static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
+       return QLA_SUCCESS;
+ 
+ mem_alloc_error_exit:
+-      qla4xxx_mem_free(ha);
+       return QLA_ERROR;
+ }
+ 
+diff --git a/drivers/spi/spi-cavium-thunderx.c 
b/drivers/spi/spi-cavium-thunderx.c
+index 877937706240..828fbbebc3c4 100644
+--- a/drivers/spi/spi-cavium-thunderx.c
++++ b/drivers/spi/spi-cavium-thunderx.c
+@@ -81,6 +81,7 @@ static int thunderx_spi_probe(struct pci_dev *pdev,
+ 
+ error:
+       clk_disable_unprepare(p->clk);
++      pci_release_regions(pdev);
+       spi_master_put(master);
+       return ret;
+ }
+@@ -95,6 +96,7 @@ static void thunderx_spi_remove(struct pci_dev *pdev)
+               return;
+ 
+       clk_disable_unprepare(p->clk);
++      pci_release_regions(pdev);
+       /* Put everything in a known state. */
+       writeq(0, p->register_base + OCTEON_SPI_CFG(p));
+ }
+diff --git a/drivers/tty/hvc/hvc_vio.c b/drivers/tty/hvc/hvc_vio.c
+index b05dc5086627..8bab8b00d47d 100644
+--- a/drivers/tty/hvc/hvc_vio.c
++++ b/drivers/tty/hvc/hvc_vio.c
+@@ -120,6 +120,14 @@ static int hvterm_raw_get_chars(uint32_t vtermno, char 
*buf, int count)
+       return got;
+ }
+ 
++/**
++ * hvterm_raw_put_chars: send characters to firmware for given vterm adapter
++ * @vtermno: The virtual terminal number.
++ * @buf: The characters to send. Because of the underlying hypercall in
++ *       hvc_put_chars(), this buffer must be at least 16 bytes long, even if
++ *       you are sending fewer chars.
++ * @count: number of chars to send.
++ */
+ static int hvterm_raw_put_chars(uint32_t vtermno, const char *buf, int count)
+ {
+       struct hvterm_priv *pv = hvterm_privs[vtermno];
+@@ -232,6 +240,7 @@ static const struct hv_ops hvterm_hvsi_ops = {
+ static void udbg_hvc_putc(char c)
+ {
+       int count = -1;
++      unsigned char bounce_buffer[16];
+ 
+       if (!hvterm_privs[0])
+               return;
+@@ -242,7 +251,12 @@ static void udbg_hvc_putc(char c)
+       do {
+               switch(hvterm_privs[0]->proto) {
+               case HV_PROTOCOL_RAW:
+-                      count = hvterm_raw_put_chars(0, &c, 1);
++                      /*
++                       * hvterm_raw_put_chars requires at least a 16-byte
++                       * buffer, so go via the bounce buffer
++                       */
++                      bounce_buffer[0] = c;
++                      count = hvterm_raw_put_chars(0, bounce_buffer, 1);
+                       break;
+               case HV_PROTOCOL_HVSI:
+                       count = hvterm_hvsi_put_chars(0, &c, 1);
+diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
+index 2ed219c837c9..9e6d44df3fab 100644
+--- a/drivers/tty/serial/msm_serial.c
++++ b/drivers/tty/serial/msm_serial.c
+@@ -1579,6 +1579,7 @@ static void __msm_console_write(struct uart_port *port, 
const char *s,
+       int num_newlines = 0;
+       bool replaced = false;
+       void __iomem *tf;
++      int locked = 1;
+ 
+       if (is_uartdm)
+               tf = port->membase + UARTDM_TF;
+@@ -1591,7 +1592,13 @@ static void __msm_console_write(struct uart_port *port, 
const char *s,
+                       num_newlines++;
+       count += num_newlines;
+ 
+-      spin_lock(&port->lock);
++      if (port->sysrq)
++              locked = 0;
++      else if (oops_in_progress)
++              locked = spin_trylock(&port->lock);
++      else
++              spin_lock(&port->lock);
++
+       if (is_uartdm)
+               msm_reset_dm_count(port, count);
+ 
+@@ -1627,7 +1634,9 @@ static void __msm_console_write(struct uart_port *port, 
const char *s,
+               iowrite32_rep(tf, buf, 1);
+               i += num_chars;
+       }
+-      spin_unlock(&port->lock);
++
++      if (locked)
++              spin_unlock(&port->lock);
+ }
+ 
+ static void msm_console_write(struct console *co, const char *s,
+diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
+index e8061b02b7e3..32f5ccd5f2c7 100644
+--- a/drivers/usb/core/config.c
++++ b/drivers/usb/core/config.c
+@@ -198,9 +198,58 @@ static const unsigned short 
super_speed_maxpacket_maxes[4] = {
+       [USB_ENDPOINT_XFER_INT] = 1024,
+ };
+ 
+-static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
+-    int asnum, struct usb_host_interface *ifp, int num_ep,
+-    unsigned char *buffer, int size)
++static bool endpoint_is_duplicate(struct usb_endpoint_descriptor *e1,
++              struct usb_endpoint_descriptor *e2)
++{
++      if (e1->bEndpointAddress == e2->bEndpointAddress)
++              return true;
++
++      if (usb_endpoint_xfer_control(e1) || usb_endpoint_xfer_control(e2)) {
++              if (usb_endpoint_num(e1) == usb_endpoint_num(e2))
++                      return true;
++      }
++
++      return false;
++}
++
++/*
++ * Check for duplicate endpoint addresses in other interfaces and in the
++ * altsetting currently being parsed.
++ */
++static bool config_endpoint_is_duplicate(struct usb_host_config *config,
++              int inum, int asnum, struct usb_endpoint_descriptor *d)
++{
++      struct usb_endpoint_descriptor *epd;
++      struct usb_interface_cache *intfc;
++      struct usb_host_interface *alt;
++      int i, j, k;
++
++      for (i = 0; i < config->desc.bNumInterfaces; ++i) {
++              intfc = config->intf_cache[i];
++
++              for (j = 0; j < intfc->num_altsetting; ++j) {
++                      alt = &intfc->altsetting[j];
++
++                      if (alt->desc.bInterfaceNumber == inum &&
++                                      alt->desc.bAlternateSetting != asnum)
++                              continue;
++
++                      for (k = 0; k < alt->desc.bNumEndpoints; ++k) {
++                              epd = &alt->endpoint[k].desc;
++
++                              if (endpoint_is_duplicate(epd, d))
++                                      return true;
++                      }
++              }
++      }
++
++      return false;
++}
++
++static int usb_parse_endpoint(struct device *ddev, int cfgno,
++              struct usb_host_config *config, int inum, int asnum,
++              struct usb_host_interface *ifp, int num_ep,
++              unsigned char *buffer, int size)
+ {
+       unsigned char *buffer0 = buffer;
+       struct usb_endpoint_descriptor *d;
+@@ -237,13 +286,10 @@ static int usb_parse_endpoint(struct device *ddev, int 
cfgno, int inum,
+               goto skip_to_next_endpoint_or_interface_descriptor;
+ 
+       /* Check for duplicate endpoint addresses */
+-      for (i = 0; i < ifp->desc.bNumEndpoints; ++i) {
+-              if (ifp->endpoint[i].desc.bEndpointAddress ==
+-                  d->bEndpointAddress) {
+-                      dev_warn(ddev, "config %d interface %d altsetting %d 
has a duplicate endpoint with address 0x%X, skipping\n",
+-                          cfgno, inum, asnum, d->bEndpointAddress);
+-                      goto skip_to_next_endpoint_or_interface_descriptor;
+-              }
++      if (config_endpoint_is_duplicate(config, inum, asnum, d)) {
++              dev_warn(ddev, "config %d interface %d altsetting %d has a 
duplicate endpoint with address 0x%X, skipping\n",
++                              cfgno, inum, asnum, d->bEndpointAddress);
++              goto skip_to_next_endpoint_or_interface_descriptor;
+       }
+ 
+       endpoint = &ifp->endpoint[ifp->desc.bNumEndpoints];
+@@ -517,8 +563,8 @@ static int usb_parse_interface(struct device *ddev, int 
cfgno,
+               if (((struct usb_descriptor_header *) buffer)->bDescriptorType
+                    == USB_DT_INTERFACE)
+                       break;
+-              retval = usb_parse_endpoint(ddev, cfgno, inum, asnum, alt,
+-                  num_ep, buffer, size);
++              retval = usb_parse_endpoint(ddev, cfgno, config, inum, asnum,
++                              alt, num_ep, buffer, size);
+               if (retval < 0)
+                       return retval;
+               ++n;
+diff --git a/drivers/usb/gadget/function/f_ecm.c 
b/drivers/usb/gadget/function/f_ecm.c
+index 4c488d15b6f6..dc99ed94f03d 100644
+--- a/drivers/usb/gadget/function/f_ecm.c
++++ b/drivers/usb/gadget/function/f_ecm.c
+@@ -625,8 +625,12 @@ static void ecm_disable(struct usb_function *f)
+ 
+       DBG(cdev, "ecm deactivated\n");
+ 
+-      if (ecm->port.in_ep->enabled)
++      if (ecm->port.in_ep->enabled) {
+               gether_disconnect(&ecm->port);
++      } else {
++              ecm->port.in_ep->desc = NULL;
++              ecm->port.out_ep->desc = NULL;
++      }
+ 
+       usb_ep_disable(ecm->notify);
+       ecm->notify->desc = NULL;
+diff --git a/drivers/usb/gadget/function/f_rndis.c 
b/drivers/usb/gadget/function/f_rndis.c
+index ba00cdb809d6..865cb070bf8b 100644
+--- a/drivers/usb/gadget/function/f_rndis.c
++++ b/drivers/usb/gadget/function/f_rndis.c
+@@ -622,6 +622,7 @@ static void rndis_disable(struct usb_function *f)
+       gether_disconnect(&rndis->port);
+ 
+       usb_ep_disable(rndis->notify);
++      rndis->notify->desc = NULL;
+ }
+ 
+ /*-------------------------------------------------------------------------*/
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 084332a5855e..2d302ff62cc1 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -1167,6 +1167,8 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = NCTRL(0) | RSVD(3) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1102, 0xff),    /* 
Telit ME910 (ECM) */
+         .driver_info = NCTRL(0) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff),    /* 
Telit ME910G1 */
++        .driver_info = NCTRL(0) | RSVD(3) },
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910),
+         .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4),
+diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
+index 731cf54f75c6..05f9f5983ee1 100644
+--- a/drivers/xen/balloon.c
++++ b/drivers/xen/balloon.c
+@@ -403,7 +403,8 @@ static struct notifier_block xen_memory_nb = {
+ #else
+ static enum bp_state reserve_additional_memory(void)
+ {
+-      balloon_stats.target_pages = balloon_stats.current_pages;
++      balloon_stats.target_pages = balloon_stats.current_pages +
++                                   balloon_stats.target_unpopulated;
+       return BP_ECANCELED;
+ }
+ #endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
+diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
+index 5b832e83772a..02ac9067a354 100644
+--- a/fs/compat_ioctl.c
++++ b/fs/compat_ioctl.c
+@@ -1585,9 +1585,10 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, 
unsigned int, cmd,
+ #endif
+ 
+       case FICLONE:
++              goto do_ioctl;
+       case FICLONERANGE:
+       case FIDEDUPERANGE:
+-              goto do_ioctl;
++              goto found_handler;
+ 
+       case FIBMAP:
+       case FIGETBSZ:
+diff --git a/fs/locks.c b/fs/locks.c
+index 22c5b4aa4961..8252647c6084 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -2681,7 +2681,7 @@ static void lock_get_status(struct seq_file *f, struct 
file_lock *fl,
+       }
+       if (inode) {
+               /* userspace relies on this representation of dev_t */
+-              seq_printf(f, "%d %02x:%02x:%ld ", fl_pid,
++              seq_printf(f, "%d %02x:%02x:%lu ", fl_pid,
+                               MAJOR(inode->i_sb->s_dev),
+                               MINOR(inode->i_sb->s_dev), inode->i_ino);
+       } else {
+diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
+index 032fcae3a94f..db4bd70b62d0 100644
+--- a/fs/nfsd/nfs4state.c
++++ b/fs/nfsd/nfs4state.c
+@@ -3067,12 +3067,17 @@ static bool replay_matches_cache(struct svc_rqst 
*rqstp,
+           (bool)seq->cachethis)
+               return false;
+       /*
+-       * If there's an error than the reply can have fewer ops than
+-       * the call.  But if we cached a reply with *more* ops than the
+-       * call you're sending us now, then this new call is clearly not
+-       * really a replay of the old one:
++       * If there's an error then the reply can have fewer ops than
++       * the call.
+        */
+-      if (slot->sl_opcnt < argp->opcnt)
++      if (slot->sl_opcnt < argp->opcnt && !slot->sl_status)
++              return false;
++      /*
++       * But if we cached a reply with *more* ops than the call you're
++       * sending us now, then this new call is clearly not really a
++       * replay of the old one:
++       */
++      if (slot->sl_opcnt > argp->opcnt)
+               return false;
+       /* This is the only check explicitly called by spec: */
+       if (!same_creds(&rqstp->rq_cred, &slot->sl_cred))
+diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
+index 8b09271e5d66..a73959e6ae32 100644
+--- a/fs/pstore/ram.c
++++ b/fs/pstore/ram.c
+@@ -321,6 +321,17 @@ static int notrace ramoops_pstore_write_buf(enum 
pstore_type_id type,
+ 
+       prz = cxt->przs[cxt->dump_write_cnt];
+ 
++      /*
++       * Since this is a new crash dump, we need to reset the buffer in
++       * case it still has an old dump present. Without this, the new dump
++       * will get appended, which would seriously confuse anything trying
++       * to check dump file contents. Specifically, ramoops_read_kmsg_hdr()
++       * expects to find a dump header in the beginning of buffer data, so
++       * we must to reset the buffer values, in order to ensure that the
++       * header will be written to the beginning of the buffer.
++       */
++      persistent_ram_zap(prz);
++
+       hlen = ramoops_write_kmsg_hdr(prz, compressed);
+       if (size + hlen > prz->buffer_size)
+               size = prz->buffer_size - hlen;
+diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
+index d34085bf4a40..9ca8809ee3d0 100644
+--- a/fs/xfs/libxfs/xfs_bmap.c
++++ b/fs/xfs/libxfs/xfs_bmap.c
+@@ -5688,7 +5688,7 @@ __xfs_bunmapi(
+                * Make sure we don't touch multiple AGF headers out of order
+                * in a single transaction, as that could cause AB-BA deadlocks.
+                */
+-              if (!wasdel) {
++              if (!wasdel && !isrt) {
+                       agno = XFS_FSB_TO_AGNO(mp, del.br_startblock);
+                       if (prev_agno != NULLAGNUMBER && prev_agno > agno)
+                               break;
+diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
+index 33c9a3aae948..7bfcd09d446b 100644
+--- a/fs/xfs/xfs_log.c
++++ b/fs/xfs/xfs_log.c
+@@ -1540,6 +1540,8 @@ out_free_iclog:
+               if (iclog->ic_bp)
+                       xfs_buf_free(iclog->ic_bp);
+               kmem_free(iclog);
++              if (prev_iclog == log->l_iclog)
++                      break;
+       }
+       spinlock_destroy(&log->l_icloglock);
+       xfs_buf_free(log->l_xbuf);
+diff --git a/include/linux/ahci_platform.h b/include/linux/ahci_platform.h
+index a270f25ee7c7..1a527e40d601 100644
+--- a/include/linux/ahci_platform.h
++++ b/include/linux/ahci_platform.h
+@@ -23,6 +23,8 @@ struct ahci_host_priv;
+ struct platform_device;
+ struct scsi_host_template;
+ 
++int ahci_platform_enable_phys(struct ahci_host_priv *hpriv);
++void ahci_platform_disable_phys(struct ahci_host_priv *hpriv);
+ int ahci_platform_enable_clks(struct ahci_host_priv *hpriv);
+ void ahci_platform_disable_clks(struct ahci_host_priv *hpriv);
+ int ahci_platform_enable_regulators(struct ahci_host_priv *hpriv);
+diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
+index cc535a478bae..710f269764dc 100644
+--- a/include/linux/dmaengine.h
++++ b/include/linux/dmaengine.h
+@@ -1358,8 +1358,11 @@ static inline int dma_get_slave_caps(struct dma_chan 
*chan,
+ static inline int dmaengine_desc_set_reuse(struct dma_async_tx_descriptor *tx)
+ {
+       struct dma_slave_caps caps;
++      int ret;
+ 
+-      dma_get_slave_caps(tx->chan, &caps);
++      ret = dma_get_slave_caps(tx->chan, &caps);
++      if (ret)
++              return ret;
+ 
+       if (caps.descriptor_reuse) {
+               tx->flags |= DMA_CTRL_REUSE;
+diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h
+index 548fd535fd02..d433f5e292c9 100644
+--- a/include/linux/if_ether.h
++++ b/include/linux/if_ether.h
+@@ -28,6 +28,14 @@ static inline struct ethhdr *eth_hdr(const struct sk_buff 
*skb)
+       return (struct ethhdr *)skb_mac_header(skb);
+ }
+ 
++/* Prefer this version in TX path, instead of
++ * skb_reset_mac_header() + eth_hdr()
++ */
++static inline struct ethhdr *skb_eth_hdr(const struct sk_buff *skb)
++{
++      return (struct ethhdr *)skb->data;
++}
++
+ static inline struct ethhdr *inner_eth_hdr(const struct sk_buff *skb)
+ {
+       return (struct ethhdr *)skb_inner_mac_header(skb);
+diff --git a/include/linux/regulator/ab8500.h 
b/include/linux/regulator/ab8500.h
+index d8ecefaf63ca..260c4aa1d976 100644
+--- a/include/linux/regulator/ab8500.h
++++ b/include/linux/regulator/ab8500.h
+@@ -38,7 +38,6 @@ enum ab8505_regulator_id {
+       AB8505_LDO_AUX6,
+       AB8505_LDO_INTCORE,
+       AB8505_LDO_ADC,
+-      AB8505_LDO_USB,
+       AB8505_LDO_AUDIO,
+       AB8505_LDO_ANAMIC1,
+       AB8505_LDO_ANAMIC2,
+diff --git a/include/net/neighbour.h b/include/net/neighbour.h
+index 1c0d07376125..a68a460fa4f3 100644
+--- a/include/net/neighbour.h
++++ b/include/net/neighbour.h
+@@ -454,7 +454,7 @@ static inline int neigh_hh_output(const struct hh_cache 
*hh, struct sk_buff *skb
+ 
+       do {
+               seq = read_seqbegin(&hh->hh_lock);
+-              hh_len = hh->hh_len;
++              hh_len = READ_ONCE(hh->hh_len);
+               if (likely(hh_len <= HH_DATA_MOD)) {
+                       hh_alen = HH_DATA_MOD;
+ 
+diff --git a/include/uapi/linux/netfilter/xt_sctp.h 
b/include/uapi/linux/netfilter/xt_sctp.h
+index 58ffcfb7978e..c2b0886c7c25 100644
+--- a/include/uapi/linux/netfilter/xt_sctp.h
++++ b/include/uapi/linux/netfilter/xt_sctp.h
+@@ -40,19 +40,19 @@ struct xt_sctp_info {
+ #define SCTP_CHUNKMAP_SET(chunkmap, type)             \
+       do {                                            \
+               (chunkmap)[type / bytes(__u32)] |=      \
+-                      1 << (type % bytes(__u32));     \
++                      1u << (type % bytes(__u32));    \
+       } while (0)
+ 
+ #define SCTP_CHUNKMAP_CLEAR(chunkmap, type)                   \
+       do {                                                    \
+               (chunkmap)[type / bytes(__u32)] &=              \
+-                      ~(1 << (type % bytes(__u32)));  \
++                      ~(1u << (type % bytes(__u32))); \
+       } while (0)
+ 
+ #define SCTP_CHUNKMAP_IS_SET(chunkmap, type)                  \
+ ({                                                            \
+       ((chunkmap)[type / bytes (__u32)] &             \
+-              (1 << (type % bytes (__u32)))) ? 1: 0;  \
++              (1u << (type % bytes (__u32)))) ? 1: 0; \
+ })
+ 
+ #define SCTP_CHUNKMAP_RESET(chunkmap) \
+diff --git a/kernel/cred.c b/kernel/cred.c
+index 0966fab0f48b..d63a2d861ac2 100644
+--- a/kernel/cred.c
++++ b/kernel/cred.c
+@@ -219,7 +219,7 @@ struct cred *cred_alloc_blank(void)
+       new->magic = CRED_MAGIC;
+ #endif
+ 
+-      if (security_cred_alloc_blank(new, GFP_KERNEL) < 0)
++      if (security_cred_alloc_blank(new, GFP_KERNEL_ACCOUNT) < 0)
+               goto error;
+ 
+       return new;
+@@ -278,7 +278,7 @@ struct cred *prepare_creds(void)
+       new->security = NULL;
+ #endif
+ 
+-      if (security_prepare_creds(new, old, GFP_KERNEL) < 0)
++      if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
+               goto error;
+       validate_creds(new);
+       return new;
+@@ -653,7 +653,7 @@ struct cred *prepare_kernel_cred(struct task_struct 
*daemon)
+ #ifdef CONFIG_SECURITY
+       new->security = NULL;
+ #endif
+-      if (security_prepare_creds(new, old, GFP_KERNEL) < 0)
++      if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
+               goto error;
+ 
+       put_cred(old);
+diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c
+index 9aa0fccd5d43..03595c29c566 100644
+--- a/kernel/locking/spinlock_debug.c
++++ b/kernel/locking/spinlock_debug.c
+@@ -51,19 +51,19 @@ EXPORT_SYMBOL(__rwlock_init);
+ 
+ static void spin_dump(raw_spinlock_t *lock, const char *msg)
+ {
+-      struct task_struct *owner = NULL;
++      struct task_struct *owner = READ_ONCE(lock->owner);
+ 
+-      if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT)
+-              owner = lock->owner;
++      if (owner == SPINLOCK_OWNER_INIT)
++              owner = NULL;
+       printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d\n",
+               msg, raw_smp_processor_id(),
+               current->comm, task_pid_nr(current));
+       printk(KERN_EMERG " lock: %pS, .magic: %08x, .owner: %s/%d, "
+                       ".owner_cpu: %d\n",
+-              lock, lock->magic,
++              lock, READ_ONCE(lock->magic),
+               owner ? owner->comm : "<none>",
+               owner ? task_pid_nr(owner) : -1,
+-              lock->owner_cpu);
++              READ_ONCE(lock->owner_cpu));
+       dump_stack();
+ }
+ 
+@@ -80,16 +80,16 @@ static void spin_bug(raw_spinlock_t *lock, const char *msg)
+ static inline void
+ debug_spin_lock_before(raw_spinlock_t *lock)
+ {
+-      SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic");
+-      SPIN_BUG_ON(lock->owner == current, lock, "recursion");
+-      SPIN_BUG_ON(lock->owner_cpu == raw_smp_processor_id(),
++      SPIN_BUG_ON(READ_ONCE(lock->magic) != SPINLOCK_MAGIC, lock, "bad 
magic");
++      SPIN_BUG_ON(READ_ONCE(lock->owner) == current, lock, "recursion");
++      SPIN_BUG_ON(READ_ONCE(lock->owner_cpu) == raw_smp_processor_id(),
+                                                       lock, "cpu recursion");
+ }
+ 
+ static inline void debug_spin_lock_after(raw_spinlock_t *lock)
+ {
+-      lock->owner_cpu = raw_smp_processor_id();
+-      lock->owner = current;
++      WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id());
++      WRITE_ONCE(lock->owner, current);
+ }
+ 
+ static inline void debug_spin_unlock(raw_spinlock_t *lock)
+@@ -99,8 +99,8 @@ static inline void debug_spin_unlock(raw_spinlock_t *lock)
+       SPIN_BUG_ON(lock->owner != current, lock, "wrong owner");
+       SPIN_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),
+                                                       lock, "wrong CPU");
+-      lock->owner = SPINLOCK_OWNER_INIT;
+-      lock->owner_cpu = -1;
++      WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT);
++      WRITE_ONCE(lock->owner_cpu, -1);
+ }
+ 
+ /*
+@@ -183,8 +183,8 @@ static inline void debug_write_lock_before(rwlock_t *lock)
+ 
+ static inline void debug_write_lock_after(rwlock_t *lock)
+ {
+-      lock->owner_cpu = raw_smp_processor_id();
+-      lock->owner = current;
++      WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id());
++      WRITE_ONCE(lock->owner, current);
+ }
+ 
+ static inline void debug_write_unlock(rwlock_t *lock)
+@@ -193,8 +193,8 @@ static inline void debug_write_unlock(rwlock_t *lock)
+       RWLOCK_BUG_ON(lock->owner != current, lock, "wrong owner");
+       RWLOCK_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),
+                                                       lock, "wrong CPU");
+-      lock->owner = SPINLOCK_OWNER_INIT;
+-      lock->owner_cpu = -1;
++      WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT);
++      WRITE_ONCE(lock->owner_cpu, -1);
+ }
+ 
+ void do_raw_write_lock(rwlock_t *lock)
+diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
+index 4f0f0604f1c4..5dfac92521fa 100644
+--- a/kernel/power/snapshot.c
++++ b/kernel/power/snapshot.c
+@@ -732,8 +732,15 @@ zone_found:
+        * We have found the zone. Now walk the radix tree to find the leaf node
+        * for our PFN.
+        */
++
++      /*
++       * If the zone we wish to scan is the the current zone and the
++       * pfn falls into the current node then we do not need to walk
++       * the tree.
++       */
+       node = bm->cur.node;
+-      if (((pfn - zone->start_pfn) & ~BM_BLOCK_MASK) == bm->cur.node_pfn)
++      if (zone == bm->cur.zone &&
++          ((pfn - zone->start_pfn) & ~BM_BLOCK_MASK) == bm->cur.node_pfn)
+               goto node_found;
+ 
+       node      = zone->rtree;
+diff --git a/kernel/taskstats.c b/kernel/taskstats.c
+index cbb387a265db..23df1fbad4b4 100644
+--- a/kernel/taskstats.c
++++ b/kernel/taskstats.c
+@@ -559,25 +559,33 @@ static int taskstats_user_cmd(struct sk_buff *skb, 
struct genl_info *info)
+ static struct taskstats *taskstats_tgid_alloc(struct task_struct *tsk)
+ {
+       struct signal_struct *sig = tsk->signal;
+-      struct taskstats *stats;
++      struct taskstats *stats_new, *stats;
+ 
+-      if (sig->stats || thread_group_empty(tsk))
+-              goto ret;
++      /* Pairs with smp_store_release() below. */
++      stats = smp_load_acquire(&sig->stats);
++      if (stats || thread_group_empty(tsk))
++              return stats;
+ 
+       /* No problem if kmem_cache_zalloc() fails */
+-      stats = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
++      stats_new = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
+ 
+       spin_lock_irq(&tsk->sighand->siglock);
+-      if (!sig->stats) {
+-              sig->stats = stats;
+-              stats = NULL;
++      stats = sig->stats;
++      if (!stats) {
++              /*
++               * Pairs with smp_store_release() above and order the
++               * kmem_cache_zalloc().
++               */
++              smp_store_release(&sig->stats, stats_new);
++              stats = stats_new;
++              stats_new = NULL;
+       }
+       spin_unlock_irq(&tsk->sighand->siglock);
+ 
+-      if (stats)
+-              kmem_cache_free(taskstats_cache, stats);
+-ret:
+-      return sig->stats;
++      if (stats_new)
++              kmem_cache_free(taskstats_cache, stats_new);
++
++      return stats;
+ }
+ 
+ /* Send pid data out on exit */
+diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
+index 77109b9cf733..71a40e5c3a9f 100644
+--- a/kernel/trace/ftrace.c
++++ b/kernel/trace/ftrace.c
+@@ -609,8 +609,7 @@ static int function_stat_show(struct seq_file *m, void *v)
+       }
+ 
+ #ifdef CONFIG_FUNCTION_GRAPH_TRACER
+-      avg = rec->time;
+-      do_div(avg, rec->counter);
++      avg = div64_ul(rec->time, rec->counter);
+       if (tracing_thresh && (avg < tracing_thresh))
+               goto out;
+ #endif
+@@ -636,7 +635,8 @@ static int function_stat_show(struct seq_file *m, void *v)
+                * Divide only 1000 for ns^2 -> us^2 conversion.
+                * trace_print_graph_duration will divide 1000 again.
+                */
+-              do_div(stddev, rec->counter * (rec->counter - 1) * 1000);
++              stddev = div64_ul(stddev,
++                                rec->counter * (rec->counter - 1) * 1000);
+       }
+ 
+       trace_seq_init(&s);
+diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c
+index 305039b122fa..35b2ba07f3c6 100644
+--- a/kernel/trace/tracing_map.c
++++ b/kernel/trace/tracing_map.c
+@@ -90,8 +90,8 @@ static int tracing_map_cmp_atomic64(void *val_a, void *val_b)
+ #define DEFINE_TRACING_MAP_CMP_FN(type)                                       
\
+ static int tracing_map_cmp_##type(void *val_a, void *val_b)           \
+ {                                                                     \
+-      type a = *(type *)val_a;                                        \
+-      type b = *(type *)val_b;                                        \
++      type a = (type)(*(u64 *)val_a);                                 \
++      type b = (type)(*(u64 *)val_b);                                 \
+                                                                       \
+       return (a > b) ? 1 : ((a < b) ? -1 : 0);                        \
+ }
+diff --git a/mm/mmap.c b/mm/mmap.c
+index 19368fbba42a..d221266d100f 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -87,12 +87,6 @@ static void unmap_region(struct mm_struct *mm,
+  * MAP_PRIVATE        r: (no) no      r: (yes) yes    r: (no) yes     r: (no) 
yes
+  *            w: (no) no      w: (no) no      w: (copy) copy  w: (no) no
+  *            x: (no) no      x: (no) yes     x: (no) yes     x: (yes) yes
+- *
+- * On arm64, PROT_EXEC has the following behaviour for both MAP_SHARED and
+- * MAP_PRIVATE:
+- *                                                            r: (no) no
+- *                                                            w: (no) no
+- *                                                            x: (yes) yes
+  */
+ pgprot_t protection_map[16] = {
+       __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
+diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
+index 5a50ad517f0f..e4cca3f5331e 100644
+--- a/mm/zsmalloc.c
++++ b/mm/zsmalloc.c
+@@ -2138,6 +2138,11 @@ int zs_page_migrate(struct address_space *mapping, 
struct page *newpage,
+               zs_pool_dec_isolated(pool);
+       }
+ 
++      if (page_zone(newpage) != page_zone(page)) {
++              dec_zone_page_state(page, NR_ZSPAGES);
++              inc_zone_page_state(newpage, NR_ZSPAGES);
++      }
++
+       reset_page(page);
+       put_page(page);
+       page = newpage;
+diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h
+index cc1557978066..ecdfeaafba9c 100644
+--- a/net/8021q/vlan.h
++++ b/net/8021q/vlan.h
+@@ -109,6 +109,7 @@ int vlan_check_real_dev(struct net_device *real_dev,
+ void vlan_setup(struct net_device *dev);
+ int register_vlan_dev(struct net_device *dev);
+ void unregister_vlan_dev(struct net_device *dev, struct list_head *head);
++void vlan_dev_uninit(struct net_device *dev);
+ bool vlan_dev_inherit_address(struct net_device *dev,
+                             struct net_device *real_dev);
+ 
+diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
+index d06d15db3232..892929d43898 100644
+--- a/net/8021q/vlan_dev.c
++++ b/net/8021q/vlan_dev.c
+@@ -610,7 +610,8 @@ static int vlan_dev_init(struct net_device *dev)
+       return 0;
+ }
+ 
+-static void vlan_dev_uninit(struct net_device *dev)
++/* Note: this function might be called multiple times for the same device. */
++void vlan_dev_uninit(struct net_device *dev)
+ {
+       struct vlan_priority_tci_mapping *pm;
+       struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
+diff --git a/net/8021q/vlan_netlink.c b/net/8021q/vlan_netlink.c
+index 1270207f3d7c..214cc068ffc2 100644
+--- a/net/8021q/vlan_netlink.c
++++ b/net/8021q/vlan_netlink.c
+@@ -92,11 +92,13 @@ static int vlan_changelink(struct net_device *dev,
+       struct ifla_vlan_flags *flags;
+       struct ifla_vlan_qos_mapping *m;
+       struct nlattr *attr;
+-      int rem;
++      int rem, err;
+ 
+       if (data[IFLA_VLAN_FLAGS]) {
+               flags = nla_data(data[IFLA_VLAN_FLAGS]);
+-              vlan_dev_change_flags(dev, flags->flags, flags->mask);
++              err = vlan_dev_change_flags(dev, flags->flags, flags->mask);
++              if (err)
++                      return err;
+       }
+       if (data[IFLA_VLAN_INGRESS_QOS]) {
+               nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) {
+@@ -107,7 +109,9 @@ static int vlan_changelink(struct net_device *dev,
+       if (data[IFLA_VLAN_EGRESS_QOS]) {
+               nla_for_each_nested(attr, data[IFLA_VLAN_EGRESS_QOS], rem) {
+                       m = nla_data(attr);
+-                      vlan_dev_set_egress_priority(dev, m->from, m->to);
++                      err = vlan_dev_set_egress_priority(dev, m->from, m->to);
++                      if (err)
++                              return err;
+               }
+       }
+       return 0;
+@@ -153,10 +157,11 @@ static int vlan_newlink(struct net *src_net, struct 
net_device *dev,
+               return -EINVAL;
+ 
+       err = vlan_changelink(dev, tb, data);
+-      if (err < 0)
+-              return err;
+-
+-      return register_vlan_dev(dev);
++      if (!err)
++              err = register_vlan_dev(dev);
++      if (err)
++              vlan_dev_uninit(dev);
++      return err;
+ }
+ 
+ static inline size_t vlan_qos_map_size(unsigned int n)
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index bd41b78d131d..1d085eed72d0 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -1054,8 +1054,10 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev 
*hdev, bdaddr_t *dst,
+       if (!conn)
+               return ERR_PTR(-ENOMEM);
+ 
+-      if (hci_explicit_conn_params_set(hdev, dst, dst_type) < 0)
++      if (hci_explicit_conn_params_set(hdev, dst, dst_type) < 0) {
++              hci_conn_del(conn);
+               return ERR_PTR(-EBUSY);
++      }
+ 
+       conn->state = BT_CONNECT;
+       set_bit(HCI_CONN_SCANNING, &conn->flags);
+diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
+index 1306962a792a..11012a509070 100644
+--- a/net/bluetooth/l2cap_core.c
++++ b/net/bluetooth/l2cap_core.c
+@@ -4908,10 +4908,8 @@ void __l2cap_physical_cfm(struct l2cap_chan *chan, int 
result)
+       BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
+              chan, result, local_amp_id, remote_amp_id);
+ 
+-      if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
+-              l2cap_chan_unlock(chan);
++      if (chan->state == BT_DISCONN || chan->state == BT_CLOSED)
+               return;
+-      }
+ 
+       if (chan->state != BT_CONNECTED) {
+               l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
+diff --git a/net/core/neighbour.c b/net/core/neighbour.c
+index 44a29be7bfff..cd85cee14bd0 100644
+--- a/net/core/neighbour.c
++++ b/net/core/neighbour.c
+@@ -1058,7 +1058,7 @@ static void neigh_update_hhs(struct neighbour *neigh)
+ 
+       if (update) {
+               hh = &neigh->hh;
+-              if (hh->hh_len) {
++              if (READ_ONCE(hh->hh_len)) {
+                       write_seqlock_bh(&hh->hh_lock);
+                       update(hh, neigh->dev, neigh->ha);
+                       write_sequnlock_bh(&hh->hh_lock);
+@@ -1319,7 +1319,7 @@ int neigh_resolve_output(struct neighbour *neigh, struct 
sk_buff *skb)
+               struct net_device *dev = neigh->dev;
+               unsigned int seq;
+ 
+-              if (dev->header_ops->cache && !neigh->hh.hh_len)
++              if (dev->header_ops->cache && !READ_ONCE(neigh->hh.hh_len))
+                       neigh_hh_init(neigh);
+ 
+               do {
+diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
+index 24d7aff8db1a..204aa0131fbe 100644
+--- a/net/ethernet/eth.c
++++ b/net/ethernet/eth.c
+@@ -238,7 +238,12 @@ int eth_header_cache(const struct neighbour *neigh, 
struct hh_cache *hh, __be16
+       eth->h_proto = type;
+       memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
+       memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
+-      hh->hh_len = ETH_HLEN;
++
++      /* Pairs with READ_ONCE() in neigh_resolve_output(),
++       * neigh_hh_output() and neigh_update_hhs().
++       */
++      smp_store_release(&hh->hh_len, ETH_HLEN);
++
+       return 0;
+ }
+ EXPORT_SYMBOL(eth_header_cache);
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index 84ff36a6d4e3..4901d17a8e63 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -1741,8 +1741,11 @@ tcp_sacktag_write_queue(struct sock *sk, const struct 
sk_buff *ack_skb,
+               }
+ 
+               /* Ignore very old stuff early */
+-              if (!after(sp[used_sacks].end_seq, prior_snd_una))
++              if (!after(sp[used_sacks].end_seq, prior_snd_una)) {
++                      if (i == 0)
++                              first_sack_index = -1;
+                       continue;
++              }
+ 
+               used_sacks++;
+       }
+diff --git a/net/llc/llc_station.c b/net/llc/llc_station.c
+index 204a8351efff..c29170e767a8 100644
+--- a/net/llc/llc_station.c
++++ b/net/llc/llc_station.c
+@@ -32,7 +32,7 @@ static int llc_stat_ev_rx_null_dsap_xid_c(struct sk_buff 
*skb)
+       return LLC_PDU_IS_CMD(pdu) &&                   /* command PDU */
+              LLC_PDU_TYPE_IS_U(pdu) &&                /* U type PDU */
+              LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_XID &&
+-             !pdu->dsap ? 0 : 1;                      /* NULL DSAP value */
++             !pdu->dsap;                              /* NULL DSAP value */
+ }
+ 
+ static int llc_stat_ev_rx_null_dsap_test_c(struct sk_buff *skb)
+@@ -42,7 +42,7 @@ static int llc_stat_ev_rx_null_dsap_test_c(struct sk_buff 
*skb)
+       return LLC_PDU_IS_CMD(pdu) &&                   /* command PDU */
+              LLC_PDU_TYPE_IS_U(pdu) &&                /* U type PDU */
+              LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_TEST &&
+-             !pdu->dsap ? 0 : 1;                      /* NULL DSAP */
++             !pdu->dsap;                              /* NULL DSAP */
+ }
+ 
+ static int llc_station_ac_send_xid_r(struct sk_buff *skb)
+diff --git a/net/netfilter/nf_conntrack_netlink.c 
b/net/netfilter/nf_conntrack_netlink.c
+index deea281ab169..5e28702c801f 100644
+--- a/net/netfilter/nf_conntrack_netlink.c
++++ b/net/netfilter/nf_conntrack_netlink.c
+@@ -3388,6 +3388,9 @@ static void __net_exit ctnetlink_net_exit_batch(struct 
list_head *net_exit_list)
+ 
+       list_for_each_entry(net, net_exit_list, exit_list)
+               ctnetlink_net_exit(net);
++
++      /* wait for other cpus until they are done with ctnl_notifiers */
++      synchronize_rcu();
+ }
+ 
+ static struct pernet_operations ctnetlink_net_ops = {
+diff --git a/net/rfkill/core.c b/net/rfkill/core.c
+index 884027f62783..87c35844d7d9 100644
+--- a/net/rfkill/core.c
++++ b/net/rfkill/core.c
+@@ -940,10 +940,13 @@ static void rfkill_sync_work(struct work_struct *work)
+ int __must_check rfkill_register(struct rfkill *rfkill)
+ {
+       static unsigned long rfkill_no;
+-      struct device *dev = &rfkill->dev;
++      struct device *dev;
+       int error;
+ 
+-      BUG_ON(!rfkill);
++      if (!rfkill)
++              return -EINVAL;
++
++      dev = &rfkill->dev;
+ 
+       mutex_lock(&rfkill_global_mutex);
+ 
+diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c
+index bf13b8470c9a..80950a4384aa 100644
+--- a/net/rxrpc/peer_event.c
++++ b/net/rxrpc/peer_event.c
+@@ -148,6 +148,9 @@ void rxrpc_error_report(struct sock *sk)
+       struct rxrpc_peer *peer;
+       struct sk_buff *skb;
+ 
++      if (unlikely(!local))
++              return;
++
+       _enter("%p{%d}", sk, local->debug_id);
+ 
+       skb = sock_dequeue_err_skb(sk);
+diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c
+index b57b4de73038..7e7eba33bbdb 100644
+--- a/net/sched/sch_fq.c
++++ b/net/sched/sch_fq.c
+@@ -736,7 +736,7 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt)
+       if (tb[TCA_FQ_QUANTUM]) {
+               u32 quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]);
+ 
+-              if (quantum > 0)
++              if (quantum > 0 && quantum <= (1 << 20))
+                       q->quantum = quantum;
+               else
+                       err = -EINVAL;
+diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
+index 2cca1ead96b5..2332984ba422 100644
+--- a/net/sched/sch_prio.c
++++ b/net/sched/sch_prio.c
+@@ -232,8 +232,14 @@ static int prio_graft(struct Qdisc *sch, unsigned long 
arg, struct Qdisc *new,
+       struct prio_sched_data *q = qdisc_priv(sch);
+       unsigned long band = arg - 1;
+ 
+-      if (new == NULL)
+-              new = &noop_qdisc;
++      if (!new) {
++              new = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
++                                      TC_H_MAKE(sch->handle, arg));
++              if (!new)
++                      new = &noop_qdisc;
++              else
++                      qdisc_hash_add(new);
++      }
+ 
+       *old = qdisc_replace(sch, new, &q->queues[band]);
+       return 0;
+diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
+index 8b4cf78987e4..1133fa0830f4 100644
+--- a/net/sctp/sm_sideeffect.c
++++ b/net/sctp/sm_sideeffect.c
+@@ -1321,8 +1321,10 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
+                       /* Generate an INIT ACK chunk.  */
+                       new_obj = sctp_make_init_ack(asoc, chunk, GFP_ATOMIC,
+                                                    0);
+-                      if (!new_obj)
+-                              goto nomem;
++                      if (!new_obj) {
++                              error = -ENOMEM;
++                              break;
++                      }
+ 
+                       sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,
+                                       SCTP_CHUNK(new_obj));
+@@ -1344,7 +1346,8 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
+                       if (!new_obj) {
+                               if (cmd->obj.chunk)
+                                       sctp_chunk_free(cmd->obj.chunk);
+-                              goto nomem;
++                              error = -ENOMEM;
++                              break;
+                       }
+                       sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,
+                                       SCTP_CHUNK(new_obj));
+@@ -1391,8 +1394,10 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
+ 
+                       /* Generate a SHUTDOWN chunk.  */
+                       new_obj = sctp_make_shutdown(asoc, chunk);
+-                      if (!new_obj)
+-                              goto nomem;
++                      if (!new_obj) {
++                              error = -ENOMEM;
++                              break;
++                      }
+                       sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,
+                                       SCTP_CHUNK(new_obj));
+                       break;
+@@ -1721,11 +1726,17 @@ static int sctp_cmd_interpreter(sctp_event_t 
event_type,
+                       break;
+               }
+ 
+-              if (error)
++              if (error) {
++                      cmd = sctp_next_cmd(commands);
++                      while (cmd) {
++                              if (cmd->verb == SCTP_CMD_REPLY)
++                                      sctp_chunk_free(cmd->obj.chunk);
++                              cmd = sctp_next_cmd(commands);
++                      }
+                       break;
++              }
+       }
+ 
+-out:
+       /* If this is in response to a received chunk, wait until
+        * we are done with the packet to open the queue so that we don't
+        * send multiple packets in response to a single request.
+@@ -1740,8 +1751,5 @@ out:
+               sp->data_ready_signalled = 0;
+ 
+       return error;
+-nomem:
+-      error = -ENOMEM;
+-      goto out;
+ }
+ 
+diff --git a/samples/bpf/trace_event_user.c b/samples/bpf/trace_event_user.c
+index 9a130d31ecf2..6fbb5eb9daf3 100644
+--- a/samples/bpf/trace_event_user.c
++++ b/samples/bpf/trace_event_user.c
+@@ -33,9 +33,9 @@ static void print_ksym(__u64 addr)
+               return;
+       sym = ksym_search(addr);
+       printf("%s;", sym->name);
+-      if (!strcmp(sym->name, "sys_read"))
++      if (!strstr(sym->name, "sys_read"))
+               sys_read_seen = true;
+-      else if (!strcmp(sym->name, "sys_write"))
++      else if (!strstr(sym->name, "sys_write"))
+               sys_write_seen = true;
+ }
+ 
+diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
+index ed29bad1f03a..96420b620963 100644
+--- a/scripts/kconfig/expr.c
++++ b/scripts/kconfig/expr.c
+@@ -201,6 +201,13 @@ static int expr_eq(struct expr *e1, struct expr *e2)
+ {
+       int res, old_count;
+ 
++      /*
++       * A NULL expr is taken to be yes, but there's also a different way to
++       * represent yes. expr_is_yes() checks for either representation.
++       */
++      if (!e1 || !e2)
++              return expr_is_yes(e1) && expr_is_yes(e2);
++
+       if (e1->type != e2->type)
+               return 0;
+       switch (e1->type) {
+diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
+index 9d7582c90a95..c67d379cb6d6 100644
+--- a/sound/isa/cs423x/cs4236.c
++++ b/sound/isa/cs423x/cs4236.c
+@@ -293,7 +293,8 @@ static int snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev 
*pdev)
+       } else {
+               mpu_port[dev] = pnp_port_start(pdev, 0);
+               if (mpu_irq[dev] >= 0 &&
+-                  pnp_irq_valid(pdev, 0) && pnp_irq(pdev, 0) >= 0) {
++                  pnp_irq_valid(pdev, 0) &&
++                  pnp_irq(pdev, 0) != (resource_size_t)-1) {
+                       mpu_irq[dev] = pnp_irq(pdev, 0);
+               } else {
+                       mpu_irq[dev] = -1;      /* disable interrupt */
+diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c
+index e5c52ed9b674..8c06de37b467 100644
+--- a/sound/pci/ice1712/ice1724.c
++++ b/sound/pci/ice1712/ice1724.c
+@@ -661,6 +661,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 
*ice, unsigned int rate,
+       unsigned long flags;
+       unsigned char mclk_change;
+       unsigned int i, old_rate;
++      bool call_set_rate = false;
+ 
+       if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
+               return -EINVAL;
+@@ -684,7 +685,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 
*ice, unsigned int rate,
+                * setting clock rate for internal clock mode */
+               old_rate = ice->get_rate(ice);
+               if (force || (old_rate != rate))
+-                      ice->set_rate(ice, rate);
++                      call_set_rate = true;
+               else if (rate == ice->cur_rate) {
+                       spin_unlock_irqrestore(&ice->reg_lock, flags);
+                       return 0;
+@@ -692,12 +693,14 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 
*ice, unsigned int rate,
+       }
+ 
+       ice->cur_rate = rate;
++      spin_unlock_irqrestore(&ice->reg_lock, flags);
++
++      if (call_set_rate)
++              ice->set_rate(ice, rate);
+ 
+       /* setting master clock */
+       mclk_change = ice->set_mclk(ice, rate);
+ 
+-      spin_unlock_irqrestore(&ice->reg_lock, flags);
+-
+       if (mclk_change && ice->gpio.i2s_mclk_changed)
+               ice->gpio.i2s_mclk_changed(ice);
+       if (ice->gpio.set_pro_rate)
+diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c
+index fd2731d171dd..0e8008d38161 100644
+--- a/sound/soc/codecs/wm8962.c
++++ b/sound/soc/codecs/wm8962.c
+@@ -2791,7 +2791,7 @@ static int fll_factors(struct _fll_div *fll_div, 
unsigned int Fref,
+ 
+       if (target % Fref == 0) {
+               fll_div->theta = 0;
+-              fll_div->lambda = 0;
++              fll_div->lambda = 1;
+       } else {
+               gcd_fll = gcd(target, fratio * Fref);
+ 
+@@ -2861,7 +2861,7 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, 
int fll_id, int source,
+               return -EINVAL;
+       }
+ 
+-      if (fll_div.theta || fll_div.lambda)
++      if (fll_div.theta)
+               fll1 |= WM8962_FLL_FRAC;
+ 
+       /* Stop the FLL while we reconfigure */
+diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
+index 33ff5c843346..6e88460cd13d 100644
+--- a/tools/perf/builtin-report.c
++++ b/tools/perf/builtin-report.c
+@@ -292,13 +292,6 @@ static int report__setup_sample_type(struct report *rep)
+                               PERF_SAMPLE_BRANCH_ANY))
+               rep->nonany_branch_mode = true;
+ 
+-#ifndef HAVE_LIBUNWIND_SUPPORT
+-      if (dwarf_callchain_users) {
+-              ui__warning("Please install libunwind development packages "
+-                          "during the perf build.\n");
+-      }
+-#endif
+-
+       return 0;
+ }
+ 

Reply via email to