commit:     2a4040d235293f0dd66180b9c9194f286dbdedfb
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Mon Dec 25 14:29:47 2017 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Mon Dec 25 14:29:47 2017 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=2a4040d2

linux kernel 4.9.72

 0000_README             |    4 +
 1071_linux-4.9.72.patch | 3792 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3796 insertions(+)

diff --git a/0000_README b/0000_README
index e02f58e..532ba73 100644
--- a/0000_README
+++ b/0000_README
@@ -327,6 +327,10 @@ Patch:  1070_linux-4.9.71.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.9.71
 
+Patch:  1071_linux-4.9.72.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.9.72
+
 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/1071_linux-4.9.72.patch b/1071_linux-4.9.72.patch
new file mode 100644
index 0000000..733e821
--- /dev/null
+++ b/1071_linux-4.9.72.patch
@@ -0,0 +1,3792 @@
+diff --git a/Makefile b/Makefile
+index 5f2736bb4877..78dde51d9d74 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 71
++SUBLEVEL = 72
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+diff --git a/arch/arm/boot/dts/am335x-evmsk.dts 
b/arch/arm/boot/dts/am335x-evmsk.dts
+index 975c36e332a2..8e6b3938bef9 100644
+--- a/arch/arm/boot/dts/am335x-evmsk.dts
++++ b/arch/arm/boot/dts/am335x-evmsk.dts
+@@ -668,6 +668,7 @@
+       ti,non-removable;
+       bus-width = <4>;
+       cap-power-off-card;
++      keep-power-in-suspend;
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc2_pins>;
+ 
+diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
+index 064d84f87e45..ce54a70b7695 100644
+--- a/arch/arm/boot/dts/dra7.dtsi
++++ b/arch/arm/boot/dts/dra7.dtsi
+@@ -282,6 +282,7 @@
+                               device_type = "pci";
+                               ranges = <0x81000000 0 0          0x03000 0 
0x00010000
+                                         0x82000000 0 0x20013000 0x13000 0 
0xffed000>;
++                              bus-range = <0x00 0xff>;
+                               #interrupt-cells = <1>;
+                               num-lanes = <1>;
+                               linux,pci-domain = <0>;
+@@ -318,6 +319,7 @@
+                               device_type = "pci";
+                               ranges = <0x81000000 0 0          0x03000 0 
0x00010000
+                                         0x82000000 0 0x30013000 0x13000 0 
0xffed000>;
++                              bus-range = <0x00 0xff>;
+                               #interrupt-cells = <1>;
+                               num-lanes = <1>;
+                               linux,pci-domain = <1>;
+diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
+index ab7710002ba6..00e9e79b6cb8 100644
+--- a/arch/arm/mm/dma-mapping.c
++++ b/arch/arm/mm/dma-mapping.c
+@@ -930,13 +930,31 @@ static void arm_coherent_dma_free(struct device *dev, 
size_t size, void *cpu_add
+       __arm_dma_free(dev, size, cpu_addr, handle, attrs, true);
+ }
+ 
++/*
++ * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems
++ * that the intention is to allow exporting memory allocated via the
++ * coherent DMA APIs through the dma_buf API, which only accepts a
++ * scattertable.  This presents a couple of problems:
++ * 1. Not all memory allocated via the coherent DMA APIs is backed by
++ *    a struct page
++ * 2. Passing coherent DMA memory into the streaming APIs is not allowed
++ *    as we will try to flush the memory through a different alias to that
++ *    actually being used (and the flushes are redundant.)
++ */
+ int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt,
+                void *cpu_addr, dma_addr_t handle, size_t size,
+                unsigned long attrs)
+ {
+-      struct page *page = pfn_to_page(dma_to_pfn(dev, handle));
++      unsigned long pfn = dma_to_pfn(dev, handle);
++      struct page *page;
+       int ret;
+ 
++      /* If the PFN is not valid, we do not have a struct page */
++      if (!pfn_valid(pfn))
++              return -ENXIO;
++
++      page = pfn_to_page(pfn);
++
+       ret = sg_alloc_table(sgt, 1, GFP_KERNEL);
+       if (unlikely(ret))
+               return ret;
+diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c
+index a4ec240ee7ba..3eb018fa1a1f 100644
+--- a/arch/arm/probes/kprobes/core.c
++++ b/arch/arm/probes/kprobes/core.c
+@@ -433,6 +433,7 @@ static __used __kprobes void *trampoline_handler(struct 
pt_regs *regs)
+       struct hlist_node *tmp;
+       unsigned long flags, orig_ret_address = 0;
+       unsigned long trampoline_address = (unsigned long)&kretprobe_trampoline;
++      kprobe_opcode_t *correct_ret_addr = NULL;
+ 
+       INIT_HLIST_HEAD(&empty_rp);
+       kretprobe_hash_lock(current, &head, &flags);
+@@ -455,14 +456,34 @@ static __used __kprobes void *trampoline_handler(struct 
pt_regs *regs)
+                       /* another task is sharing our hash bucket */
+                       continue;
+ 
++              orig_ret_address = (unsigned long)ri->ret_addr;
++
++              if (orig_ret_address != trampoline_address)
++                      /*
++                       * This is the real return address. Any other
++                       * instances associated with this task are for
++                       * other calls deeper on the call stack
++                       */
++                      break;
++      }
++
++      kretprobe_assert(ri, orig_ret_address, trampoline_address);
++
++      correct_ret_addr = ri->ret_addr;
++      hlist_for_each_entry_safe(ri, tmp, head, hlist) {
++              if (ri->task != current)
++                      /* another task is sharing our hash bucket */
++                      continue;
++
++              orig_ret_address = (unsigned long)ri->ret_addr;
+               if (ri->rp && ri->rp->handler) {
+                       __this_cpu_write(current_kprobe, &ri->rp->kp);
+                       get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
++                      ri->ret_addr = correct_ret_addr;
+                       ri->rp->handler(ri, regs);
+                       __this_cpu_write(current_kprobe, NULL);
+               }
+ 
+-              orig_ret_address = (unsigned long)ri->ret_addr;
+               recycle_rp_inst(ri, &empty_rp);
+ 
+               if (orig_ret_address != trampoline_address)
+@@ -474,7 +495,6 @@ static __used __kprobes void *trampoline_handler(struct 
pt_regs *regs)
+                       break;
+       }
+ 
+-      kretprobe_assert(ri, orig_ret_address, trampoline_address);
+       kretprobe_hash_unlock(current, &flags);
+ 
+       hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
+diff --git a/arch/arm/probes/kprobes/test-core.c 
b/arch/arm/probes/kprobes/test-core.c
+index 9775de22e2ff..a48354de1aa1 100644
+--- a/arch/arm/probes/kprobes/test-core.c
++++ b/arch/arm/probes/kprobes/test-core.c
+@@ -976,7 +976,10 @@ static void coverage_end(void)
+ void __naked __kprobes_test_case_start(void)
+ {
+       __asm__ __volatile__ (
+-              "stmdb  sp!, {r4-r11}                           \n\t"
++              "mov    r2, sp                                  \n\t"
++              "bic    r3, r2, #7                              \n\t"
++              "mov    sp, r3                                  \n\t"
++              "stmdb  sp!, {r2-r11}                           \n\t"
+               "sub    sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
+               "bic    r0, lr, #1  @ r0 = inline data          \n\t"
+               "mov    r1, sp                                  \n\t"
+@@ -996,7 +999,8 @@ void __naked __kprobes_test_case_end_32(void)
+               "movne  pc, r0                                  \n\t"
+               "mov    r0, r4                                  \n\t"
+               "add    sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
+-              "ldmia  sp!, {r4-r11}                           \n\t"
++              "ldmia  sp!, {r2-r11}                           \n\t"
++              "mov    sp, r2                                  \n\t"
+               "mov    pc, r0                                  \n\t"
+       );
+ }
+@@ -1012,7 +1016,8 @@ void __naked __kprobes_test_case_end_16(void)
+               "bxne   r0                                      \n\t"
+               "mov    r0, r4                                  \n\t"
+               "add    sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
+-              "ldmia  sp!, {r4-r11}                           \n\t"
++              "ldmia  sp!, {r2-r11}                           \n\t"
++              "mov    sp, r2                                  \n\t"
+               "bx     r0                                      \n\t"
+       );
+ }
+diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
+index 380ebe705093..9b8b477c363d 100644
+--- a/arch/arm64/mm/init.c
++++ b/arch/arm64/mm/init.c
+@@ -296,6 +296,7 @@ void __init arm64_memblock_init(void)
+               arm64_dma_phys_limit = max_zone_dma_phys();
+       else
+               arm64_dma_phys_limit = PHYS_MASK + 1;
++      high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
+       dma_contiguous_reserve(arm64_dma_phys_limit);
+ 
+       memblock_allow_resize();
+@@ -322,7 +323,6 @@ void __init bootmem_init(void)
+       sparse_init();
+       zone_sizes_init(min, max);
+ 
+-      high_memory = __va((max << PAGE_SHIFT) - 1) + 1;
+       memblock_dump_all();
+ }
+ 
+diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c
+index 9ade60ca08e0..7f2519cfb5d2 100644
+--- a/arch/mips/math-emu/cp1emu.c
++++ b/arch/mips/math-emu/cp1emu.c
+@@ -1781,7 +1781,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       SPFROMREG(fs, MIPSInst_FS(ir));
+                       SPFROMREG(fd, MIPSInst_FD(ir));
+                       rv.s = ieee754sp_maddf(fd, fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmsubf_op: {
+@@ -1794,7 +1794,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       SPFROMREG(fs, MIPSInst_FS(ir));
+                       SPFROMREG(fd, MIPSInst_FD(ir));
+                       rv.s = ieee754sp_msubf(fd, fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case frint_op: {
+@@ -1818,7 +1818,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       SPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.w = ieee754sp_2008class(fs);
+                       rfmt = w_fmt;
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmin_op: {
+@@ -1830,7 +1830,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       SPFROMREG(ft, MIPSInst_FT(ir));
+                       SPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.s = ieee754sp_fmin(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmina_op: {
+@@ -1842,7 +1842,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       SPFROMREG(ft, MIPSInst_FT(ir));
+                       SPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.s = ieee754sp_fmina(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmax_op: {
+@@ -1854,7 +1854,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       SPFROMREG(ft, MIPSInst_FT(ir));
+                       SPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.s = ieee754sp_fmax(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmaxa_op: {
+@@ -1866,7 +1866,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       SPFROMREG(ft, MIPSInst_FT(ir));
+                       SPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.s = ieee754sp_fmaxa(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fabs_op:
+@@ -2110,7 +2110,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       DPFROMREG(fs, MIPSInst_FS(ir));
+                       DPFROMREG(fd, MIPSInst_FD(ir));
+                       rv.d = ieee754dp_maddf(fd, fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmsubf_op: {
+@@ -2123,7 +2123,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       DPFROMREG(fs, MIPSInst_FS(ir));
+                       DPFROMREG(fd, MIPSInst_FD(ir));
+                       rv.d = ieee754dp_msubf(fd, fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case frint_op: {
+@@ -2147,7 +2147,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       DPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.w = ieee754dp_2008class(fs);
+                       rfmt = w_fmt;
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmin_op: {
+@@ -2159,7 +2159,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       DPFROMREG(ft, MIPSInst_FT(ir));
+                       DPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.d = ieee754dp_fmin(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmina_op: {
+@@ -2171,7 +2171,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       DPFROMREG(ft, MIPSInst_FT(ir));
+                       DPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.d = ieee754dp_fmina(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmax_op: {
+@@ -2183,7 +2183,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       DPFROMREG(ft, MIPSInst_FT(ir));
+                       DPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.d = ieee754dp_fmax(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fmaxa_op: {
+@@ -2195,7 +2195,7 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
+                       DPFROMREG(ft, MIPSInst_FT(ir));
+                       DPFROMREG(fs, MIPSInst_FS(ir));
+                       rv.d = ieee754dp_fmaxa(fs, ft);
+-                      break;
++                      goto copcsr;
+               }
+ 
+               case fabs_op:
+diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
+index c7f2a5295b3a..83a73cf5116a 100644
+--- a/arch/sparc/mm/srmmu.c
++++ b/arch/sparc/mm/srmmu.c
+@@ -54,6 +54,7 @@
+ enum mbus_module srmmu_modtype;
+ static unsigned int hwbug_bitmask;
+ int vac_cache_size;
++EXPORT_SYMBOL(vac_cache_size);
+ int vac_line_size;
+ 
+ extern struct resource sparc_iomap;
+diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
+index d29c745f10ad..0a324e120942 100644
+--- a/arch/x86/kvm/mmu.c
++++ b/arch/x86/kvm/mmu.c
+@@ -5052,13 +5052,13 @@ int kvm_mmu_module_init(void)
+ {
+       pte_list_desc_cache = kmem_cache_create("pte_list_desc",
+                                           sizeof(struct pte_list_desc),
+-                                          0, 0, NULL);
++                                          0, SLAB_ACCOUNT, NULL);
+       if (!pte_list_desc_cache)
+               goto nomem;
+ 
+       mmu_page_header_cache = kmem_cache_create("kvm_mmu_page_header",
+                                                 sizeof(struct kvm_mmu_page),
+-                                                0, 0, NULL);
++                                                0, SLAB_ACCOUNT, NULL);
+       if (!mmu_page_header_cache)
+               goto nomem;
+ 
+diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
+index 23f1a6bd7a0d..8148d8ca7930 100644
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -1382,6 +1382,9 @@ static void avic_vm_destroy(struct kvm *kvm)
+       unsigned long flags;
+       struct kvm_arch *vm_data = &kvm->arch;
+ 
++      if (!avic)
++              return;
++
+       avic_free_vm_id(vm_data->avic_vm_id);
+ 
+       if (vm_data->avic_logical_id_table_page)
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index a929ca03b7ed..263e56059fd5 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -1199,6 +1199,11 @@ static inline bool cpu_has_vmx_invvpid_global(void)
+       return vmx_capability.vpid & VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT;
+ }
+ 
++static inline bool cpu_has_vmx_invvpid(void)
++{
++      return vmx_capability.vpid & VMX_VPID_INVVPID_BIT;
++}
++
+ static inline bool cpu_has_vmx_ept(void)
+ {
+       return vmcs_config.cpu_based_2nd_exec_ctrl &
+@@ -3816,6 +3821,12 @@ static void vmx_flush_tlb(struct kvm_vcpu *vcpu)
+       __vmx_flush_tlb(vcpu, to_vmx(vcpu)->vpid);
+ }
+ 
++static void vmx_flush_tlb_ept_only(struct kvm_vcpu *vcpu)
++{
++      if (enable_ept)
++              vmx_flush_tlb(vcpu);
++}
++
+ static void vmx_decache_cr0_guest_bits(struct kvm_vcpu *vcpu)
+ {
+       ulong cr0_guest_owned_bits = vcpu->arch.cr0_guest_owned_bits;
+@@ -6428,8 +6439,10 @@ static __init int hardware_setup(void)
+       if (boot_cpu_has(X86_FEATURE_NX))
+               kvm_enable_efer_bits(EFER_NX);
+ 
+-      if (!cpu_has_vmx_vpid())
++      if (!cpu_has_vmx_vpid() || !cpu_has_vmx_invvpid() ||
++              !(cpu_has_vmx_invvpid_single() || cpu_has_vmx_invvpid_global()))
+               enable_vpid = 0;
++
+       if (!cpu_has_vmx_shadow_vmcs())
+               enable_shadow_vmcs = 0;
+       if (enable_shadow_vmcs)
+@@ -8494,6 +8507,7 @@ static void vmx_set_virtual_x2apic_mode(struct kvm_vcpu 
*vcpu, bool set)
+       } else {
+               sec_exec_control &= ~SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE;
+               sec_exec_control |= SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
++              vmx_flush_tlb_ept_only(vcpu);
+       }
+       vmcs_write32(SECONDARY_VM_EXEC_CONTROL, sec_exec_control);
+ 
+@@ -8519,8 +8533,10 @@ static void vmx_set_apic_access_page_addr(struct 
kvm_vcpu *vcpu, hpa_t hpa)
+        */
+       if (!is_guest_mode(vcpu) ||
+           !nested_cpu_has2(get_vmcs12(&vmx->vcpu),
+-                           SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES))
++                           SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
+               vmcs_write64(APIC_ACCESS_ADDR, hpa);
++              vmx_flush_tlb_ept_only(vcpu);
++      }
+ }
+ 
+ static void vmx_hwapic_isr_update(struct kvm_vcpu *vcpu, int max_isr)
+@@ -10093,6 +10109,9 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, 
struct vmcs12 *vmcs12)
+       if (nested_cpu_has_ept(vmcs12)) {
+               kvm_mmu_unload(vcpu);
+               nested_ept_init_mmu_context(vcpu);
++      } else if (nested_cpu_has2(vmcs12,
++                                 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
++              vmx_flush_tlb_ept_only(vcpu);
+       }
+ 
+       if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER)
+@@ -10833,6 +10852,10 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, 
u32 exit_reason,
+               vmx->nested.change_vmcs01_virtual_x2apic_mode = false;
+               vmx_set_virtual_x2apic_mode(vcpu,
+                               vcpu->arch.apic_base & X2APIC_ENABLE);
++      } else if (!nested_cpu_has_ept(vmcs12) &&
++                 nested_cpu_has2(vmcs12,
++                                 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
++              vmx_flush_tlb_ept_only(vcpu);
+       }
+ 
+       /* This is needed for same reason as it was needed in prepare_vmcs02 */
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 26b580ad268f..f4d893713d54 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -8443,11 +8443,11 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
+ {
+       struct x86_exception fault;
+ 
+-      trace_kvm_async_pf_ready(work->arch.token, work->gva);
+       if (work->wakeup_all)
+               work->arch.token = ~0; /* broadcast wakeup */
+       else
+               kvm_del_async_pf_gfn(vcpu, work->arch.gfn);
++      trace_kvm_async_pf_ready(work->arch.token, work->gva);
+ 
+       if ((vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED) &&
+           !apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
+diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c
+index 6441dfda489f..a7c5b79371a7 100644
+--- a/drivers/base/power/opp/core.c
++++ b/drivers/base/power/opp/core.c
+@@ -331,7 +331,7 @@ int dev_pm_opp_get_opp_count(struct device *dev)
+       opp_table = _find_opp_table(dev);
+       if (IS_ERR(opp_table)) {
+               count = PTR_ERR(opp_table);
+-              dev_err(dev, "%s: OPP table not found (%d)\n",
++              dev_dbg(dev, "%s: OPP table not found (%d)\n",
+                       __func__, count);
+               goto out_unlock;
+       }
+diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
+index 98b767d3171e..7d506cb73e54 100644
+--- a/drivers/block/nbd.c
++++ b/drivers/block/nbd.c
+@@ -654,7 +654,10 @@ static int __nbd_ioctl(struct block_device *bdev, struct 
nbd_device *nbd,
+               return nbd_size_set(nbd, bdev, nbd->blksize, arg);
+ 
+       case NBD_SET_TIMEOUT:
+-              nbd->tag_set.timeout = arg * HZ;
++              if (arg) {
++                      nbd->tag_set.timeout = arg * HZ;
++                      blk_queue_rq_timeout(nbd->disk->queue, arg * HZ);
++              }
+               return 0;
+ 
+       case NBD_SET_FLAGS:
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 3ae950c82922..693028659ccc 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -1059,10 +1059,6 @@ static int btusb_open(struct hci_dev *hdev)
+       }
+ 
+       data->intf->needs_remote_wakeup = 1;
+-      /* device specific wakeup source enabled and required for USB
+-       * remote wakeup while host is suspended
+-       */
+-      device_wakeup_enable(&data->udev->dev);
+ 
+       if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
+               goto done;
+@@ -1126,7 +1122,6 @@ static int btusb_close(struct hci_dev *hdev)
+               goto failed;
+ 
+       data->intf->needs_remote_wakeup = 0;
+-      device_wakeup_disable(&data->udev->dev);
+       usb_autopm_put_interface(data->intf);
+ 
+ failed:
+diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c 
b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+index df97e25aec76..9fe0939c1273 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
++++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+@@ -608,7 +608,7 @@ static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", 
lcd_ch1_parents,
+                                0x150, 0, 4, 24, 2, BIT(31),
+                                CLK_SET_RATE_PARENT);
+ 
+-static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M", 0x150, BIT(30), 0);
++static SUNXI_CCU_GATE(hdmi_ddc_clk, "ddc", "osc24M", 0x150, BIT(30), 0);
+ 
+ static SUNXI_CCU_GATE(ps_clk, "ps", "lcd1-ch1", 0x140, BIT(31), 0);
+ 
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
+index 530f255a898b..35e34c0e0429 100644
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -918,11 +918,19 @@ static struct kobj_type ktype_cpufreq = {
+       .release        = cpufreq_sysfs_release,
+ };
+ 
+-static int add_cpu_dev_symlink(struct cpufreq_policy *policy,
+-                             struct device *dev)
++static void add_cpu_dev_symlink(struct cpufreq_policy *policy, unsigned int 
cpu)
+ {
++      struct device *dev = get_cpu_device(cpu);
++
++      if (!dev)
++              return;
++
++      if (cpumask_test_and_set_cpu(cpu, policy->real_cpus))
++              return;
++
+       dev_dbg(dev, "%s: Adding symlink\n", __func__);
+-      return sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq");
++      if (sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq"))
++              dev_err(dev, "cpufreq symlink creation failed\n");
+ }
+ 
+ static void remove_cpu_dev_symlink(struct cpufreq_policy *policy,
+@@ -1184,10 +1192,10 @@ static int cpufreq_online(unsigned int cpu)
+               policy->user_policy.min = policy->min;
+               policy->user_policy.max = policy->max;
+ 
+-              write_lock_irqsave(&cpufreq_driver_lock, flags);
+-              for_each_cpu(j, policy->related_cpus)
++              for_each_cpu(j, policy->related_cpus) {
+                       per_cpu(cpufreq_cpu_data, j) = policy;
+-              write_unlock_irqrestore(&cpufreq_driver_lock, flags);
++                      add_cpu_dev_symlink(policy, j);
++              }
+       } else {
+               policy->min = policy->user_policy.min;
+               policy->max = policy->user_policy.max;
+@@ -1284,13 +1292,15 @@ static int cpufreq_online(unsigned int cpu)
+ 
+       if (cpufreq_driver->exit)
+               cpufreq_driver->exit(policy);
++
++      for_each_cpu(j, policy->real_cpus)
++              remove_cpu_dev_symlink(policy, get_cpu_device(j));
++
+ out_free_policy:
+       cpufreq_policy_free(policy, !new_policy);
+       return ret;
+ }
+ 
+-static int cpufreq_offline(unsigned int cpu);
+-
+ /**
+  * cpufreq_add_dev - the cpufreq interface for a CPU device.
+  * @dev: CPU device.
+@@ -1312,16 +1322,10 @@ static int cpufreq_add_dev(struct device *dev, struct 
subsys_interface *sif)
+ 
+       /* Create sysfs link on CPU registration */
+       policy = per_cpu(cpufreq_cpu_data, cpu);
+-      if (!policy || cpumask_test_and_set_cpu(cpu, policy->real_cpus))
+-              return 0;
++      if (policy)
++              add_cpu_dev_symlink(policy, cpu);
+ 
+-      ret = add_cpu_dev_symlink(policy, dev);
+-      if (ret) {
+-              cpumask_clear_cpu(cpu, policy->real_cpus);
+-              cpufreq_offline(cpu);
+-      }
+-
+-      return ret;
++      return 0;
+ }
+ 
+ static int cpufreq_offline(unsigned int cpu)
+diff --git a/drivers/cpuidle/cpuidle-powernv.c 
b/drivers/cpuidle/cpuidle-powernv.c
+index 7fe442ca38f4..854a56781100 100644
+--- a/drivers/cpuidle/cpuidle-powernv.c
++++ b/drivers/cpuidle/cpuidle-powernv.c
+@@ -164,6 +164,24 @@ static int powernv_cpuidle_driver_init(void)
+               drv->state_count += 1;
+       }
+ 
++      /*
++       * On the PowerNV platform cpu_present may be less than cpu_possible in
++       * cases when firmware detects the CPU, but it is not available to the
++       * OS.  If CONFIG_HOTPLUG_CPU=n, then such CPUs are not hotplugable at
++       * run time and hence cpu_devices are not created for those CPUs by the
++       * generic topology_init().
++       *
++       * drv->cpumask defaults to cpu_possible_mask in
++       * __cpuidle_driver_init().  This breaks cpuidle on PowerNV where
++       * cpu_devices are not created for CPUs in cpu_possible_mask that
++       * cannot be hot-added later at run time.
++       *
++       * Trying cpuidle_register_device() on a CPU without a cpu_device is
++       * incorrect, so pass a correct CPU mask to the generic cpuidle driver.
++       */
++
++      drv->cpumask = (struct cpumask *)cpu_present_mask;
++
+       return 0;
+ }
+ 
+diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
+index c73207abb5a4..35237c8d5206 100644
+--- a/drivers/cpuidle/cpuidle.c
++++ b/drivers/cpuidle/cpuidle.c
+@@ -189,6 +189,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct 
cpuidle_driver *drv,
+                       return -EBUSY;
+               }
+               target_state = &drv->states[index];
++              broadcast = false;
+       }
+ 
+       /* Take note of the planned idle state. */
+diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c
+index 832a2c3f01ff..9e98a5fbbc1d 100644
+--- a/drivers/cpuidle/sysfs.c
++++ b/drivers/cpuidle/sysfs.c
+@@ -613,6 +613,18 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
+       struct device *cpu_dev = get_cpu_device((unsigned long)dev->cpu);
+       int error;
+ 
++      /*
++       * Return if cpu_device is not setup for this CPU.
++       *
++       * This could happen if the arch did not set up cpu_device
++       * since this CPU is not in cpu_present mask and the
++       * driver did not send a correct CPU mask during registration.
++       * Without this check we would end up passing bogus
++       * value for &cpu_dev->kobj in kobject_init_and_add()
++       */
++      if (!cpu_dev)
++              return -ENODEV;
++
+       kdev = kzalloc(sizeof(*kdev), GFP_KERNEL);
+       if (!kdev)
+               return -ENOMEM;
+diff --git a/drivers/crypto/amcc/crypto4xx_core.h 
b/drivers/crypto/amcc/crypto4xx_core.h
+index ecfdcfe3698d..4f41d6da5acc 100644
+--- a/drivers/crypto/amcc/crypto4xx_core.h
++++ b/drivers/crypto/amcc/crypto4xx_core.h
+@@ -34,12 +34,12 @@
+ #define PPC405EX_CE_RESET                       0x00000008
+ 
+ #define CRYPTO4XX_CRYPTO_PRIORITY             300
+-#define PPC4XX_LAST_PD                                63
+-#define PPC4XX_NUM_PD                         64
+-#define PPC4XX_LAST_GD                                1023
++#define PPC4XX_NUM_PD                         256
++#define PPC4XX_LAST_PD                                (PPC4XX_NUM_PD - 1)
+ #define PPC4XX_NUM_GD                         1024
+-#define PPC4XX_LAST_SD                                63
+-#define PPC4XX_NUM_SD                         64
++#define PPC4XX_LAST_GD                                (PPC4XX_NUM_GD - 1)
++#define PPC4XX_NUM_SD                         256
++#define PPC4XX_LAST_SD                                (PPC4XX_NUM_SD - 1)
+ #define PPC4XX_SD_BUFFER_SIZE                 2048
+ 
+ #define PD_ENTRY_INUSE                                1
+diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
+index db607d51ee2b..8eed456a67be 100644
+--- a/drivers/hid/Kconfig
++++ b/drivers/hid/Kconfig
+@@ -190,6 +190,7 @@ config HID_CORSAIR
+ 
+       Supported devices:
+       - Vengeance K90
++      - Scimitar PRO RGB
+ 
+ config HID_PRODIKEYS
+       tristate "Prodikeys PC-MIDI Keyboard support"
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index bdde8859e191..e32862ca5223 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -1872,6 +1872,7 @@ static const struct hid_device_id 
hid_have_special_driver[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, 
USB_DEVICE_ID_CHICONY_ACER_SWITCH12) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, 
USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, 
USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_1) },
+@@ -2106,6 +2107,7 @@ static const struct hid_device_id 
hid_have_special_driver[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, 
USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, 
USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, 
USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_THT_2P_ARCADE) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, 
USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) },
+diff --git a/drivers/hid/hid-corsair.c b/drivers/hid/hid-corsair.c
+index c0303f61c26a..9ba5d98a1180 100644
+--- a/drivers/hid/hid-corsair.c
++++ b/drivers/hid/hid-corsair.c
+@@ -3,8 +3,10 @@
+  *
+  * Supported devices:
+  *  - Vengeance K90 Keyboard
++ *  - Scimitar PRO RGB Gaming Mouse
+  *
+  * Copyright (c) 2015 Clement Vuchener
++ * Copyright (c) 2017 Oscar Campos
+  */
+ 
+ /*
+@@ -670,10 +672,51 @@ static int corsair_input_mapping(struct hid_device *dev,
+       return 0;
+ }
+ 
++/*
++ * The report descriptor of Corsair Scimitar RGB Pro gaming mouse is
++ * non parseable as they define two consecutive Logical Minimum for
++ * the Usage Page (Consumer) in rdescs bytes 75 and 77 being 77 0x16
++ * that should be obviousy 0x26 for Logical Magimum of 16 bits. This
++ * prevents poper parsing of the report descriptor due Logical
++ * Minimum being larger than Logical Maximum.
++ *
++ * This driver fixes the report descriptor for:
++ * - USB ID b1c:1b3e, sold as Scimitar RGB Pro Gaming mouse
++ */
++
++static __u8 *corsair_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,
++        unsigned int *rsize)
++{
++      struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
++
++      if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
++              /*
++               * Corsair Scimitar RGB Pro report descriptor is broken and
++               * defines two different Logical Minimum for the Consumer
++               * Application. The byte 77 should be a 0x26 defining a 16
++               * bits integer for the Logical Maximum but it is a 0x16
++               * instead (Logical Minimum)
++               */
++              switch (hdev->product) {
++              case USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB:
++                      if (*rsize >= 172 && rdesc[75] == 0x15 && rdesc[77] == 
0x16
++                      && rdesc[78] == 0xff && rdesc[79] == 0x0f) {
++                              hid_info(hdev, "Fixing up report descriptor\n");
++                              rdesc[77] = 0x26;
++                      }
++                      break;
++              }
++
++      }
++      return rdesc;
++}
++
+ static const struct hid_device_id corsair_devices[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90),
+               .driver_data = CORSAIR_USE_K90_MACRO |
+                              CORSAIR_USE_K90_BACKLIGHT },
++      { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR,
++            USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) },
+       {}
+ };
+ 
+@@ -686,10 +729,14 @@ static struct hid_driver corsair_driver = {
+       .event = corsair_event,
+       .remove = corsair_remove,
+       .input_mapping = corsair_input_mapping,
++      .report_fixup = corsair_mouse_report_fixup,
+ };
+ 
+ module_hid_driver(corsair_driver);
+ 
+ MODULE_LICENSE("GPL");
++/* Original K90 driver author */
+ MODULE_AUTHOR("Clement Vuchener");
++/* Scimitar PRO RGB driver author */
++MODULE_AUTHOR("Oscar Campos");
+ MODULE_DESCRIPTION("HID driver for Corsair devices");
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 433d5f675c03..244b97c1b74e 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -277,6 +277,9 @@
+ #define USB_DEVICE_ID_CORSAIR_K70RGB    0x1b13
+ #define USB_DEVICE_ID_CORSAIR_STRAFE    0x1b15
+ #define USB_DEVICE_ID_CORSAIR_K65RGB    0x1b17
++#define USB_DEVICE_ID_CORSAIR_K70RGB_RAPIDFIRE  0x1b38
++#define USB_DEVICE_ID_CORSAIR_K65RGB_RAPIDFIRE  0x1b39
++#define USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB  0x1b3e
+ 
+ #define USB_VENDOR_ID_CREATIVELABS    0x041e
+ #define USB_DEVICE_ID_CREATIVE_SB_OMNI_SURROUND_51    0x322c
+@@ -1077,6 +1080,7 @@
+ 
+ #define USB_VENDOR_ID_XIN_MO                  0x16c0
+ #define USB_DEVICE_ID_XIN_MO_DUAL_ARCADE      0x05e1
++#define USB_DEVICE_ID_THT_2P_ARCADE           0x75e1
+ 
+ #define USB_VENDOR_ID_XIROKU          0x1477
+ #define USB_DEVICE_ID_XIROKU_SPX      0x1006
+diff --git a/drivers/hid/hid-xinmo.c b/drivers/hid/hid-xinmo.c
+index 7df5227a7e61..9ad7731d2e10 100644
+--- a/drivers/hid/hid-xinmo.c
++++ b/drivers/hid/hid-xinmo.c
+@@ -46,6 +46,7 @@ static int xinmo_event(struct hid_device *hdev, struct 
hid_field *field,
+ 
+ static const struct hid_device_id xinmo_devices[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, 
USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_THT_2P_ARCADE) },
+       { }
+ };
+ 
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index 2b1620797959..1916f80a692d 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -80,6 +80,9 @@ static const struct hid_blacklist {
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K70RGB, 
HID_QUIRK_NO_INIT_REPORTS },
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB, 
HID_QUIRK_NO_INIT_REPORTS },
+       { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_STRAFE, 
HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL },
++      { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K70RGB_RAPIDFIRE, 
HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL },
++      { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB_RAPIDFIRE, 
HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL },
++      { USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB, 
HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL },
+       { USB_VENDOR_ID_CREATIVELABS, 
USB_DEVICE_ID_CREATIVE_SB_OMNI_SURROUND_51, HID_QUIRK_NOGET },
+       { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_PIXART_USB_OPTICAL_MOUSE, 
HID_QUIRK_ALWAYS_POLL },
+       { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
+diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c
+index cccef87963e0..975c43d446f8 100644
+--- a/drivers/hwmon/asus_atk0110.c
++++ b/drivers/hwmon/asus_atk0110.c
+@@ -646,6 +646,9 @@ static int atk_read_value(struct atk_sensor_data *sensor, 
u64 *value)
+               else
+                       err = atk_read_value_new(sensor, value);
+ 
++              if (err)
++                      return err;
++
+               sensor->is_valid = true;
+               sensor->last_updated = jiffies;
+               sensor->cached_value = *value;
+diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c
+index c1b9275978f9..281491cca510 100644
+--- a/drivers/hwmon/max31790.c
++++ b/drivers/hwmon/max31790.c
+@@ -311,7 +311,7 @@ static int max31790_write_pwm(struct device *dev, u32 
attr, int channel,
+               data->pwm[channel] = val << 8;
+               err = i2c_smbus_write_word_swapped(client,
+                                                  MAX31790_REG_PWMOUT(channel),
+-                                                 val);
++                                                 data->pwm[channel]);
+               break;
+       case hwmon_pwm_enable:
+               fan_config = data->fan_config[channel];
+diff --git a/drivers/infiniband/core/cq.c b/drivers/infiniband/core/cq.c
+index a754fc727de5..ff12b8d176ce 100644
+--- a/drivers/infiniband/core/cq.c
++++ b/drivers/infiniband/core/cq.c
+@@ -196,7 +196,7 @@ void ib_free_cq(struct ib_cq *cq)
+               irq_poll_disable(&cq->iop);
+               break;
+       case IB_POLL_WORKQUEUE:
+-              flush_work(&cq->work);
++              cancel_work_sync(&cq->work);
+               break;
+       default:
+               WARN_ON_ONCE(1);
+diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c 
b/drivers/infiniband/hw/i40iw/i40iw_utils.c
+index 6fd043b1d714..7db2001775cb 100644
+--- a/drivers/infiniband/hw/i40iw/i40iw_utils.c
++++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c
+@@ -159,6 +159,9 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
+               return NOTIFY_DONE;
+ 
+       iwdev = &hdl->device;
++      if (iwdev->init_state < INET_NOTIFIER)
++              return NOTIFY_DONE;
++
+       netdev = iwdev->ldev->netdev;
+       upper_dev = netdev_master_upper_dev_get(netdev);
+       if (netdev != event_netdev)
+@@ -231,6 +234,9 @@ int i40iw_inet6addr_event(struct notifier_block *notifier,
+               return NOTIFY_DONE;
+ 
+       iwdev = &hdl->device;
++      if (iwdev->init_state < INET_NOTIFIER)
++              return NOTIFY_DONE;
++
+       netdev = iwdev->ldev->netdev;
+       if (netdev != event_netdev)
+               return NOTIFY_DONE;
+@@ -280,6 +286,8 @@ int i40iw_net_event(struct notifier_block *notifier, 
unsigned long event, void *
+               if (!iwhdl)
+                       return NOTIFY_DONE;
+               iwdev = &iwhdl->device;
++              if (iwdev->init_state < INET_NOTIFIER)
++                      return NOTIFY_DONE;
+               p = (__be32 *)neigh->primary_key;
+               i40iw_copy_ip_ntohl(local_ipaddr, p);
+               if (neigh->nud_state & NUD_VALID) {
+diff --git a/drivers/infiniband/sw/rdmavt/mmap.c 
b/drivers/infiniband/sw/rdmavt/mmap.c
+index e202b8142759..6b712eecbd37 100644
+--- a/drivers/infiniband/sw/rdmavt/mmap.c
++++ b/drivers/infiniband/sw/rdmavt/mmap.c
+@@ -170,9 +170,9 @@ struct rvt_mmap_info *rvt_create_mmap_info(struct 
rvt_dev_info *rdi,
+ 
+       spin_lock_irq(&rdi->mmap_offset_lock);
+       if (rdi->mmap_offset == 0)
+-              rdi->mmap_offset = PAGE_SIZE;
++              rdi->mmap_offset = ALIGN(PAGE_SIZE, SHMLBA);
+       ip->offset = rdi->mmap_offset;
+-      rdi->mmap_offset += size;
++      rdi->mmap_offset += ALIGN(size, SHMLBA);
+       spin_unlock_irq(&rdi->mmap_offset_lock);
+ 
+       INIT_LIST_HEAD(&ip->pending_mmaps);
+diff --git a/drivers/infiniband/sw/rxe/rxe_mmap.c 
b/drivers/infiniband/sw/rxe/rxe_mmap.c
+index c572a4c09359..bd812e00988e 100644
+--- a/drivers/infiniband/sw/rxe/rxe_mmap.c
++++ b/drivers/infiniband/sw/rxe/rxe_mmap.c
+@@ -156,10 +156,10 @@ struct rxe_mmap_info *rxe_create_mmap_info(struct 
rxe_dev *rxe,
+       spin_lock_bh(&rxe->mmap_offset_lock);
+ 
+       if (rxe->mmap_offset == 0)
+-              rxe->mmap_offset = PAGE_SIZE;
++              rxe->mmap_offset = ALIGN(PAGE_SIZE, SHMLBA);
+ 
+       ip->info.offset = rxe->mmap_offset;
+-      rxe->mmap_offset += size;
++      rxe->mmap_offset += ALIGN(size, SHMLBA);
+ 
+       spin_unlock_bh(&rxe->mmap_offset_lock);
+ 
+diff --git a/drivers/infiniband/sw/rxe/rxe_pool.c 
b/drivers/infiniband/sw/rxe/rxe_pool.c
+index ee26a1b1b4ed..1c4e5b2e6835 100644
+--- a/drivers/infiniband/sw/rxe/rxe_pool.c
++++ b/drivers/infiniband/sw/rxe/rxe_pool.c
+@@ -412,6 +412,8 @@ void *rxe_alloc(struct rxe_pool *pool)
+       elem = kmem_cache_zalloc(pool_cache(pool),
+                                (pool->flags & RXE_POOL_ATOMIC) ?
+                                GFP_ATOMIC : GFP_KERNEL);
++      if (!elem)
++              return NULL;
+ 
+       elem->pool = pool;
+       kref_init(&elem->ref_cnt);
+diff --git a/drivers/infiniband/sw/rxe/rxe_req.c 
b/drivers/infiniband/sw/rxe/rxe_req.c
+index 9d084780ac91..5b0ca35c06ab 100644
+--- a/drivers/infiniband/sw/rxe/rxe_req.c
++++ b/drivers/infiniband/sw/rxe/rxe_req.c
+@@ -726,11 +726,11 @@ int rxe_requester(void *arg)
+       ret = rxe_xmit_packet(to_rdev(qp->ibqp.device), qp, &pkt, skb);
+       if (ret) {
+               qp->need_req_skb = 1;
+-              kfree_skb(skb);
+ 
+               rollback_state(wqe, qp, &rollback_wqe, rollback_psn);
+ 
+               if (ret == -EAGAIN) {
++                      kfree_skb(skb);
+                       rxe_run_task(&qp->req.task, 1);
+                       goto exit;
+               }
+diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c 
b/drivers/infiniband/sw/rxe/rxe_resp.c
+index 7705820cdac6..8c0ddd7165ae 100644
+--- a/drivers/infiniband/sw/rxe/rxe_resp.c
++++ b/drivers/infiniband/sw/rxe/rxe_resp.c
+@@ -799,18 +799,17 @@ static enum resp_states execute(struct rxe_qp *qp, 
struct rxe_pkt_info *pkt)
+               /* Unreachable */
+               WARN_ON(1);
+ 
+-      /* We successfully processed this new request. */
+-      qp->resp.msn++;
+-
+       /* next expected psn, read handles this separately */
+       qp->resp.psn = (pkt->psn + 1) & BTH_PSN_MASK;
+ 
+       qp->resp.opcode = pkt->opcode;
+       qp->resp.status = IB_WC_SUCCESS;
+ 
+-      if (pkt->mask & RXE_COMP_MASK)
++      if (pkt->mask & RXE_COMP_MASK) {
++              /* We successfully processed this new request. */
++              qp->resp.msn++;
+               return RESPST_COMPLETE;
+-      else if (qp_type(qp) == IB_QPT_RC)
++      } else if (qp_type(qp) == IB_QPT_RC)
+               return RESPST_ACKNOWLEDGE;
+       else
+               return RESPST_CLEANUP;
+diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h 
b/drivers/infiniband/ulp/iser/iscsi_iser.h
+index 0be6a7c5ddb5..cb48e22afff7 100644
+--- a/drivers/infiniband/ulp/iser/iscsi_iser.h
++++ b/drivers/infiniband/ulp/iser/iscsi_iser.h
+@@ -430,6 +430,7 @@ struct iser_fr_desc {
+       struct list_head                  list;
+       struct iser_reg_resources         rsc;
+       struct iser_pi_context           *pi_ctx;
++      struct list_head                  all_list;
+ };
+ 
+ /**
+@@ -443,6 +444,7 @@ struct iser_fr_pool {
+       struct list_head        list;
+       spinlock_t              lock;
+       int                     size;
++      struct list_head        all_list;
+ };
+ 
+ /**
+diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c 
b/drivers/infiniband/ulp/iser/iser_verbs.c
+index a4b791dfaa1d..bc6f5bb6c524 100644
+--- a/drivers/infiniband/ulp/iser/iser_verbs.c
++++ b/drivers/infiniband/ulp/iser/iser_verbs.c
+@@ -362,6 +362,7 @@ int iser_alloc_fastreg_pool(struct ib_conn *ib_conn,
+       int i, ret;
+ 
+       INIT_LIST_HEAD(&fr_pool->list);
++      INIT_LIST_HEAD(&fr_pool->all_list);
+       spin_lock_init(&fr_pool->lock);
+       fr_pool->size = 0;
+       for (i = 0; i < cmds_max; i++) {
+@@ -373,6 +374,7 @@ int iser_alloc_fastreg_pool(struct ib_conn *ib_conn,
+               }
+ 
+               list_add_tail(&desc->list, &fr_pool->list);
++              list_add_tail(&desc->all_list, &fr_pool->all_list);
+               fr_pool->size++;
+       }
+ 
+@@ -392,13 +394,13 @@ void iser_free_fastreg_pool(struct ib_conn *ib_conn)
+       struct iser_fr_desc *desc, *tmp;
+       int i = 0;
+ 
+-      if (list_empty(&fr_pool->list))
++      if (list_empty(&fr_pool->all_list))
+               return;
+ 
+       iser_info("freeing conn %p fr pool\n", ib_conn);
+ 
+-      list_for_each_entry_safe(desc, tmp, &fr_pool->list, list) {
+-              list_del(&desc->list);
++      list_for_each_entry_safe(desc, tmp, &fr_pool->all_list, all_list) {
++              list_del(&desc->all_list);
+               iser_free_reg_res(&desc->rsc);
+               if (desc->pi_ctx)
+                       iser_free_pi_ctx(desc->pi_ctx);
+diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
+index c7820b3ea80e..beef59eb94fa 100644
+--- a/drivers/iommu/exynos-iommu.c
++++ b/drivers/iommu/exynos-iommu.c
+@@ -543,7 +543,10 @@ static void sysmmu_tlb_invalidate_flpdcache(struct 
sysmmu_drvdata *data,
+       if (is_sysmmu_active(data) && data->version >= MAKE_MMU_VER(3, 3)) {
+               clk_enable(data->clk_master);
+               if (sysmmu_block(data)) {
+-                      __sysmmu_tlb_invalidate_entry(data, iova, 1);
++                      if (data->version >= MAKE_MMU_VER(5, 0))
++                              __sysmmu_tlb_invalidate(data);
++                      else
++                              __sysmmu_tlb_invalidate_entry(data, iova, 1);
+                       sysmmu_unblock(data);
+               }
+               clk_disable(data->clk_master);
+diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c
+index 823f6985b260..dd7e38ac29bd 100644
+--- a/drivers/isdn/capi/kcapi.c
++++ b/drivers/isdn/capi/kcapi.c
+@@ -1032,6 +1032,7 @@ static int old_capi_manufacturer(unsigned int cmd, void 
__user *data)
+                                                    sizeof(avmb1_carddef))))
+                               return -EFAULT;
+                       cdef.cardtype = AVM_CARDTYPE_B1;
++                      cdef.cardnr = 0;
+               } else {
+                       if ((retval = copy_from_user(&cdef, data,
+                                                    sizeof(avmb1_extcarddef))))
+diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
+index eef202d4399b..a5422f483ad5 100644
+--- a/drivers/misc/cxl/pci.c
++++ b/drivers/misc/cxl/pci.c
+@@ -1758,6 +1758,9 @@ static pci_ers_result_t cxl_vphb_error_detected(struct 
cxl_afu *afu,
+       /* There should only be one entry, but go through the list
+        * anyway
+        */
++      if (afu->phb == NULL)
++              return result;
++
+       list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) {
+               if (!afu_dev->driver)
+                       continue;
+@@ -1801,6 +1804,11 @@ static pci_ers_result_t cxl_pci_error_detected(struct 
pci_dev *pdev,
+                       /* Only participate in EEH if we are on a virtual PHB */
+                       if (afu->phb == NULL)
+                               return PCI_ERS_RESULT_NONE;
++
++                      /*
++                       * Tell the AFU drivers; but we don't care what they
++                       * say, we're going away.
++                       */
+                       cxl_vphb_error_detected(afu, state);
+               }
+               return PCI_ERS_RESULT_DISCONNECT;
+@@ -1941,6 +1949,9 @@ static pci_ers_result_t cxl_pci_slot_reset(struct 
pci_dev *pdev)
+               if (cxl_afu_select_best_mode(afu))
+                       goto err;
+ 
++              if (afu->phb == NULL)
++                      continue;
++
+               list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) 
{
+                       /* Reset the device context.
+                        * TODO: make this less disruptive
+@@ -2003,6 +2014,9 @@ static void cxl_pci_resume(struct pci_dev *pdev)
+       for (i = 0; i < adapter->slices; i++) {
+               afu = adapter->afu[i];
+ 
++              if (afu->phb == NULL)
++                      continue;
++
+               list_for_each_entry(afu_dev, &afu->phb->bus->devices, bus_list) 
{
+                       if (afu_dev->driver && afu_dev->driver->err_handler &&
+                           afu_dev->driver->err_handler->resume)
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index 0b894d76aa41..bbb3641eddcb 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -2381,6 +2381,18 @@ static int bnxt_init_one_rx_ring(struct bnxt *bp, int 
ring_nr)
+       return 0;
+ }
+ 
++static void bnxt_init_cp_rings(struct bnxt *bp)
++{
++      int i;
++
++      for (i = 0; i < bp->cp_nr_rings; i++) {
++              struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring;
++              struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;
++
++              ring->fw_ring_id = INVALID_HW_RING_ID;
++      }
++}
++
+ static int bnxt_init_rx_rings(struct bnxt *bp)
+ {
+       int i, rc = 0;
+@@ -4700,6 +4712,7 @@ static int bnxt_shutdown_nic(struct bnxt *bp, bool 
irq_re_init)
+ 
+ static int bnxt_init_nic(struct bnxt *bp, bool irq_re_init)
+ {
++      bnxt_init_cp_rings(bp);
+       bnxt_init_rx_rings(bp);
+       bnxt_init_tx_rings(bp);
+       bnxt_init_ring_grps(bp, irq_re_init);
+diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.c 
b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
+index 9e59663a6ead..0f6811860ad5 100644
+--- a/drivers/net/ethernet/brocade/bna/bfa_ioc.c
++++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
+@@ -1930,13 +1930,13 @@ static void
+ bfa_ioc_send_enable(struct bfa_ioc *ioc)
+ {
+       struct bfi_ioc_ctrl_req enable_req;
+-      struct timeval tv;
+ 
+       bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ,
+                   bfa_ioc_portid(ioc));
+       enable_req.clscode = htons(ioc->clscode);
+-      do_gettimeofday(&tv);
+-      enable_req.tv_sec = ntohl(tv.tv_sec);
++      enable_req.rsvd = htons(0);
++      /* overflow in 2106 */
++      enable_req.tv_sec = ntohl(ktime_get_real_seconds());
+       bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req));
+ }
+ 
+@@ -1947,6 +1947,10 @@ bfa_ioc_send_disable(struct bfa_ioc *ioc)
+ 
+       bfi_h2i_set(disable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_DISABLE_REQ,
+                   bfa_ioc_portid(ioc));
++      disable_req.clscode = htons(ioc->clscode);
++      disable_req.rsvd = htons(0);
++      /* overflow in 2106 */
++      disable_req.tv_sec = ntohl(ktime_get_real_seconds());
+       bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req));
+ }
+ 
+diff --git a/drivers/net/ethernet/brocade/bna/bnad_debugfs.c 
b/drivers/net/ethernet/brocade/bna/bnad_debugfs.c
+index 05c1c1dd7751..cebfe3bd086e 100644
+--- a/drivers/net/ethernet/brocade/bna/bnad_debugfs.c
++++ b/drivers/net/ethernet/brocade/bna/bnad_debugfs.c
+@@ -325,7 +325,7 @@ bnad_debugfs_write_regrd(struct file *file, const char 
__user *buf,
+               return PTR_ERR(kern_buf);
+ 
+       rc = sscanf(kern_buf, "%x:%x", &addr, &len);
+-      if (rc < 2) {
++      if (rc < 2 || len > UINT_MAX >> 2) {
+               netdev_warn(bnad->netdev, "failed to read user buffer\n");
+               kfree(kern_buf);
+               return -EINVAL;
+diff --git a/drivers/net/ethernet/intel/fm10k/fm10k.h 
b/drivers/net/ethernet/intel/fm10k/fm10k.h
+index 4d19e46f7c55..3693ae104c2a 100644
+--- a/drivers/net/ethernet/intel/fm10k/fm10k.h
++++ b/drivers/net/ethernet/intel/fm10k/fm10k.h
+@@ -508,8 +508,8 @@ s32 fm10k_iov_update_pvid(struct fm10k_intfc *interface, 
u16 glort, u16 pvid);
+ int fm10k_ndo_set_vf_mac(struct net_device *netdev, int vf_idx, u8 *mac);
+ int fm10k_ndo_set_vf_vlan(struct net_device *netdev,
+                         int vf_idx, u16 vid, u8 qos, __be16 vlan_proto);
+-int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx, int rate,
+-                      int unused);
++int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx,
++                      int __always_unused min_rate, int max_rate);
+ int fm10k_ndo_get_vf_config(struct net_device *netdev,
+                           int vf_idx, struct ifla_vf_info *ivi);
+ 
+diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c 
b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
+index 5f4dac0d36ef..e72fd52bacfe 100644
+--- a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
++++ b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
+@@ -126,6 +126,9 @@ s32 fm10k_iov_mbx(struct fm10k_intfc *interface)
+               struct fm10k_mbx_info *mbx = &vf_info->mbx;
+               u16 glort = vf_info->glort;
+ 
++              /* process the SM mailbox first to drain outgoing messages */
++              hw->mbx.ops.process(hw, &hw->mbx);
++
+               /* verify port mapping is valid, if not reset port */
+               if (vf_info->vf_flags && !fm10k_glort_valid_pf(hw, glort))
+                       hw->iov.ops.reset_lport(hw, vf_info);
+@@ -482,7 +485,7 @@ int fm10k_ndo_set_vf_vlan(struct net_device *netdev, int 
vf_idx, u16 vid,
+ }
+ 
+ int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx,
+-                      int __always_unused unused, int rate)
++                      int __always_unused min_rate, int max_rate)
+ {
+       struct fm10k_intfc *interface = netdev_priv(netdev);
+       struct fm10k_iov_data *iov_data = interface->iov_data;
+@@ -493,14 +496,15 @@ int fm10k_ndo_set_vf_bw(struct net_device *netdev, int 
vf_idx,
+               return -EINVAL;
+ 
+       /* rate limit cannot be less than 10Mbs or greater than link speed */
+-      if (rate && ((rate < FM10K_VF_TC_MIN) || rate > FM10K_VF_TC_MAX))
++      if (max_rate &&
++          (max_rate < FM10K_VF_TC_MIN || max_rate > FM10K_VF_TC_MAX))
+               return -EINVAL;
+ 
+       /* store values */
+-      iov_data->vf_info[vf_idx].rate = rate;
++      iov_data->vf_info[vf_idx].rate = max_rate;
+ 
+       /* update hardware configuration */
+-      hw->iov.ops.configure_tc(hw, vf_idx, rate);
++      hw->iov.ops.configure_tc(hw, vf_idx, max_rate);
+ 
+       return 0;
+ }
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index 2caafebb0295..becffd15c092 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -4217,8 +4217,12 @@ static void i40e_napi_enable_all(struct i40e_vsi *vsi)
+       if (!vsi->netdev)
+               return;
+ 
+-      for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++)
+-              napi_enable(&vsi->q_vectors[q_idx]->napi);
++      for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) {
++              struct i40e_q_vector *q_vector = vsi->q_vectors[q_idx];
++
++              if (q_vector->rx.ring || q_vector->tx.ring)
++                      napi_enable(&q_vector->napi);
++      }
+ }
+ 
+ /**
+@@ -4232,8 +4236,12 @@ static void i40e_napi_disable_all(struct i40e_vsi *vsi)
+       if (!vsi->netdev)
+               return;
+ 
+-      for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++)
+-              napi_disable(&vsi->q_vectors[q_idx]->napi);
++      for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) {
++              struct i40e_q_vector *q_vector = vsi->q_vectors[q_idx];
++
++              if (q_vector->rx.ring || q_vector->tx.ring)
++                      napi_disable(&q_vector->napi);
++      }
+ }
+ 
+ /**
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
+index 16839600fb78..ca54f7684668 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -3102,6 +3102,8 @@ static int igb_sw_init(struct igb_adapter *adapter)
+       /* Setup and initialize a copy of the hw vlan table array */
+       adapter->shadow_vfta = kcalloc(E1000_VLAN_FILTER_TBL_SIZE, sizeof(u32),
+                                      GFP_ATOMIC);
++      if (!adapter->shadow_vfta)
++              return -ENOMEM;
+ 
+       /* This call may decrease the number of queues */
+       if (igb_init_interrupt_scheme(adapter, true)) {
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+index 77d3039283f6..ad3362293cbd 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+@@ -3696,10 +3696,10 @@ s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, 
u8 maj, u8 min,
+       fw_cmd.ver_build = build;
+       fw_cmd.ver_sub = sub;
+       fw_cmd.hdr.checksum = 0;
+-      fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
+-                              (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
+       fw_cmd.pad = 0;
+       fw_cmd.pad2 = 0;
++      fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
++                              (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
+ 
+       for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) {
+               ret_val = ixgbe_host_interface_command(hw, &fw_cmd,
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+index 60f0bf779073..77a60aa5dc7e 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+@@ -617,6 +617,8 @@ static s32 ixgbe_read_ee_hostif_buffer_X550(struct 
ixgbe_hw *hw,
+               /* convert offset from words to bytes */
+               buffer.address = cpu_to_be32((offset + current_word) * 2);
+               buffer.length = cpu_to_be16(words_to_read * 2);
++              buffer.pad2 = 0;
++              buffer.pad3 = 0;
+ 
+               status = ixgbe_host_interface_command(hw, &buffer,
+                                                     sizeof(buffer),
+diff --git a/drivers/net/ethernet/moxa/moxart_ether.c 
b/drivers/net/ethernet/moxa/moxart_ether.c
+index 4367dd6879a2..0622fd03941b 100644
+--- a/drivers/net/ethernet/moxa/moxart_ether.c
++++ b/drivers/net/ethernet/moxa/moxart_ether.c
+@@ -25,6 +25,7 @@
+ #include <linux/of_irq.h>
+ #include <linux/crc32.h>
+ #include <linux/crc32c.h>
++#include <linux/circ_buf.h>
+ 
+ #include "moxart_ether.h"
+ 
+@@ -278,6 +279,13 @@ static int moxart_rx_poll(struct napi_struct *napi, int 
budget)
+       return rx;
+ }
+ 
++static int moxart_tx_queue_space(struct net_device *ndev)
++{
++      struct moxart_mac_priv_t *priv = netdev_priv(ndev);
++
++      return CIRC_SPACE(priv->tx_head, priv->tx_tail, TX_DESC_NUM);
++}
++
+ static void moxart_tx_finished(struct net_device *ndev)
+ {
+       struct moxart_mac_priv_t *priv = netdev_priv(ndev);
+@@ -297,6 +305,9 @@ static void moxart_tx_finished(struct net_device *ndev)
+               tx_tail = TX_NEXT(tx_tail);
+       }
+       priv->tx_tail = tx_tail;
++      if (netif_queue_stopped(ndev) &&
++          moxart_tx_queue_space(ndev) >= TX_WAKE_THRESHOLD)
++              netif_wake_queue(ndev);
+ }
+ 
+ static irqreturn_t moxart_mac_interrupt(int irq, void *dev_id)
+@@ -324,13 +335,18 @@ static int moxart_mac_start_xmit(struct sk_buff *skb, 
struct net_device *ndev)
+       struct moxart_mac_priv_t *priv = netdev_priv(ndev);
+       void *desc;
+       unsigned int len;
+-      unsigned int tx_head = priv->tx_head;
++      unsigned int tx_head;
+       u32 txdes1;
+       int ret = NETDEV_TX_BUSY;
+ 
++      spin_lock_irq(&priv->txlock);
++
++      tx_head = priv->tx_head;
+       desc = priv->tx_desc_base + (TX_REG_DESC_SIZE * tx_head);
+ 
+-      spin_lock_irq(&priv->txlock);
++      if (moxart_tx_queue_space(ndev) == 1)
++              netif_stop_queue(ndev);
++
+       if (moxart_desc_read(desc + TX_REG_OFFSET_DESC0) & TX_DESC0_DMA_OWN) {
+               net_dbg_ratelimited("no TX space for packet\n");
+               priv->stats.tx_dropped++;
+diff --git a/drivers/net/ethernet/moxa/moxart_ether.h 
b/drivers/net/ethernet/moxa/moxart_ether.h
+index 93a9563ac7c6..afc32ec998c0 100644
+--- a/drivers/net/ethernet/moxa/moxart_ether.h
++++ b/drivers/net/ethernet/moxa/moxart_ether.h
+@@ -59,6 +59,7 @@
+ #define TX_NEXT(N)            (((N) + 1) & (TX_DESC_NUM_MASK))
+ #define TX_BUF_SIZE           1600
+ #define TX_BUF_SIZE_MAX               (TX_DESC1_BUF_SIZE_MASK+1)
++#define TX_WAKE_THRESHOLD     16
+ 
+ #define RX_DESC_NUM           64
+ #define RX_DESC_NUM_MASK      (RX_DESC_NUM-1)
+diff --git a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c
+index a0849f49bbec..c0192f97ecc8 100644
+--- a/drivers/net/irda/vlsi_ir.c
++++ b/drivers/net/irda/vlsi_ir.c
+@@ -418,8 +418,9 @@ static struct vlsi_ring *vlsi_alloc_ring(struct pci_dev 
*pdev, struct ring_descr
+               memset(rd, 0, sizeof(*rd));
+               rd->hw = hwmap + i;
+               rd->buf = kmalloc(len, GFP_KERNEL|GFP_DMA);
+-              if (rd->buf == NULL ||
+-                  !(busaddr = pci_map_single(pdev, rd->buf, len, dir))) {
++              if (rd->buf)
++                      busaddr = pci_map_single(pdev, rd->buf, len, dir);
++              if (rd->buf == NULL || pci_dma_mapping_error(pdev, busaddr)) {
+                       if (rd->buf) {
+                               net_err_ratelimited("%s: failed to create 
PCI-MAP for %p\n",
+                                                   __func__, rd->buf);
+@@ -430,8 +431,7 @@ static struct vlsi_ring *vlsi_alloc_ring(struct pci_dev 
*pdev, struct ring_descr
+                               rd = r->rd + j;
+                               busaddr = rd_get_addr(rd);
+                               rd_set_addr_status(rd, 0, 0);
+-                              if (busaddr)
+-                                      pci_unmap_single(pdev, busaddr, len, 
dir);
++                              pci_unmap_single(pdev, busaddr, len, dir);
+                               kfree(rd->buf);
+                               rd->buf = NULL;
+                       }
+diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
+index a52b560e428b..3603eec7217f 100644
+--- a/drivers/net/phy/at803x.c
++++ b/drivers/net/phy/at803x.c
+@@ -166,7 +166,7 @@ static int at803x_set_wol(struct phy_device *phydev,
+               mac = (const u8 *) ndev->dev_addr;
+ 
+               if (!is_valid_ether_addr(mac))
+-                      return -EFAULT;
++                      return -EINVAL;
+ 
+               for (i = 0; i < 3; i++) {
+                       phy_write(phydev, AT803X_MMD_ACCESS_CONTROL,
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 62725655d8e4..105fbfb47e3a 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -582,6 +582,10 @@ static const struct usb_device_id products[] = {
+               USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 
USB_CLASS_VENDOR_SPEC, 0x01, 0x69),
+               .driver_info        = (unsigned long)&qmi_wwan_info,
+       },
++      {       /* Motorola Mapphone devices with MDM6600 */
++              USB_VENDOR_AND_INTERFACE_INFO(0x22b8, USB_CLASS_VENDOR_SPEC, 
0xfb, 0xff),
++              .driver_info        = (unsigned long)&qmi_wwan_info,
++      },
+ 
+       /* 2. Combined interface devices matching on class+protocol */
+       {       /* Huawei E367 and possibly others in "Windows mode" */
+diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
+index afb953a258cd..b2d7c7e32250 100644
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -32,7 +32,7 @@
+ #define NETNEXT_VERSION               "08"
+ 
+ /* Information for net */
+-#define NET_VERSION           "8"
++#define NET_VERSION           "9"
+ 
+ #define DRIVER_VERSION                "v1." NETNEXT_VERSION "." NET_VERSION
+ #define DRIVER_AUTHOR "Realtek linux nic maintainers <nic_s...@realtek.com>"
+@@ -501,6 +501,8 @@ enum rtl_register_content {
+ #define RTL8153_RMS           RTL8153_MAX_PACKET
+ #define RTL8152_TX_TIMEOUT    (5 * HZ)
+ #define RTL8152_NAPI_WEIGHT   64
++#define rx_reserved_size(x)   ((x) + VLAN_ETH_HLEN + CRC_SIZE + \
++                               sizeof(struct rx_desc) + RX_ALIGN)
+ 
+ /* rtl8152 flags */
+ enum rtl8152_flags {
+@@ -1292,6 +1294,7 @@ static void intr_callback(struct urb *urb)
+               }
+       } else {
+               if (netif_carrier_ok(tp->netdev)) {
++                      netif_stop_queue(tp->netdev);
+                       set_bit(RTL8152_LINK_CHG, &tp->flags);
+                       schedule_delayed_work(&tp->schedule, 0);
+               }
+@@ -1362,6 +1365,7 @@ static int alloc_all_mem(struct r8152 *tp)
+       spin_lock_init(&tp->rx_lock);
+       spin_lock_init(&tp->tx_lock);
+       INIT_LIST_HEAD(&tp->tx_free);
++      INIT_LIST_HEAD(&tp->rx_done);
+       skb_queue_head_init(&tp->tx_queue);
+       skb_queue_head_init(&tp->rx_queue);
+ 
+@@ -2252,8 +2256,7 @@ static void r8153_set_rx_early_timeout(struct r8152 *tp)
+ 
+ static void r8153_set_rx_early_size(struct r8152 *tp)
+ {
+-      u32 mtu = tp->netdev->mtu;
+-      u32 ocp_data = (agg_buf_sz - mtu - VLAN_ETH_HLEN - VLAN_HLEN) / 8;
++      u32 ocp_data = (agg_buf_sz - rx_reserved_size(tp->netdev->mtu)) / 4;
+ 
+       ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data);
+ }
+@@ -3165,6 +3168,9 @@ static void set_carrier(struct r8152 *tp)
+                       napi_enable(&tp->napi);
+                       netif_wake_queue(netdev);
+                       netif_info(tp, link, netdev, "carrier on\n");
++              } else if (netif_queue_stopped(netdev) &&
++                         skb_queue_len(&tp->tx_queue) < tp->tx_qlen) {
++                      netif_wake_queue(netdev);
+               }
+       } else {
+               if (netif_carrier_ok(netdev)) {
+@@ -3698,8 +3704,18 @@ static int rtl8152_resume(struct usb_interface *intf)
+                       tp->rtl_ops.autosuspend_en(tp, false);
+                       napi_disable(&tp->napi);
+                       set_bit(WORK_ENABLE, &tp->flags);
+-                      if (netif_carrier_ok(tp->netdev))
+-                              rtl_start_rx(tp);
++
++                      if (netif_carrier_ok(tp->netdev)) {
++                              if (rtl8152_get_speed(tp) & LINK_STATUS) {
++                                      rtl_start_rx(tp);
++                              } else {
++                                      netif_carrier_off(tp->netdev);
++                                      tp->rtl_ops.disable(tp);
++                                      netif_info(tp, link, tp->netdev,
++                                                 "linking down\n");
++                              }
++                      }
++
+                       napi_enable(&tp->napi);
+                       clear_bit(SELECTIVE_SUSPEND, &tp->flags);
+                       smp_mb__after_atomic();
+diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c
+index c8e612c1c72f..e56ca3fb107e 100644
+--- a/drivers/nvme/target/loop.c
++++ b/drivers/nvme/target/loop.c
+@@ -223,8 +223,6 @@ static void nvme_loop_submit_async_event(struct nvme_ctrl 
*arg, int aer_idx)
+ static int nvme_loop_init_iod(struct nvme_loop_ctrl *ctrl,
+               struct nvme_loop_iod *iod, unsigned int queue_idx)
+ {
+-      BUG_ON(queue_idx >= ctrl->queue_count);
+-
+       iod->req.cmd = &iod->cmd;
+       iod->req.rsp = &iod->rsp;
+       iod->queue = &ctrl->queues[queue_idx];
+@@ -314,6 +312,43 @@ static void nvme_loop_free_ctrl(struct nvme_ctrl *nctrl)
+       kfree(ctrl);
+ }
+ 
++static void nvme_loop_destroy_io_queues(struct nvme_loop_ctrl *ctrl)
++{
++      int i;
++
++      for (i = 1; i < ctrl->queue_count; i++)
++              nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
++}
++
++static int nvme_loop_init_io_queues(struct nvme_loop_ctrl *ctrl)
++{
++      struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;
++      unsigned int nr_io_queues;
++      int ret, i;
++
++      nr_io_queues = min(opts->nr_io_queues, num_online_cpus());
++      ret = nvme_set_queue_count(&ctrl->ctrl, &nr_io_queues);
++      if (ret || !nr_io_queues)
++              return ret;
++
++      dev_info(ctrl->ctrl.device, "creating %d I/O queues.\n", nr_io_queues);
++
++      for (i = 1; i <= nr_io_queues; i++) {
++              ctrl->queues[i].ctrl = ctrl;
++              ret = nvmet_sq_init(&ctrl->queues[i].nvme_sq);
++              if (ret)
++                      goto out_destroy_queues;
++
++              ctrl->queue_count++;
++      }
++
++      return 0;
++
++out_destroy_queues:
++      nvme_loop_destroy_io_queues(ctrl);
++      return ret;
++}
++
+ static int nvme_loop_configure_admin_queue(struct nvme_loop_ctrl *ctrl)
+ {
+       int error;
+@@ -385,17 +420,13 @@ static int nvme_loop_configure_admin_queue(struct 
nvme_loop_ctrl *ctrl)
+ 
+ static void nvme_loop_shutdown_ctrl(struct nvme_loop_ctrl *ctrl)
+ {
+-      int i;
+-
+       nvme_stop_keep_alive(&ctrl->ctrl);
+ 
+       if (ctrl->queue_count > 1) {
+               nvme_stop_queues(&ctrl->ctrl);
+               blk_mq_tagset_busy_iter(&ctrl->tag_set,
+                                       nvme_cancel_request, &ctrl->ctrl);
+-
+-              for (i = 1; i < ctrl->queue_count; i++)
+-                      nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
++              nvme_loop_destroy_io_queues(ctrl);
+       }
+ 
+       if (ctrl->ctrl.state == NVME_CTRL_LIVE)
+@@ -467,19 +498,14 @@ static void nvme_loop_reset_ctrl_work(struct work_struct 
*work)
+       if (ret)
+               goto out_disable;
+ 
+-      for (i = 1; i <= ctrl->ctrl.opts->nr_io_queues; i++) {
+-              ctrl->queues[i].ctrl = ctrl;
+-              ret = nvmet_sq_init(&ctrl->queues[i].nvme_sq);
+-              if (ret)
+-                      goto out_free_queues;
+-
+-              ctrl->queue_count++;
+-      }
++      ret = nvme_loop_init_io_queues(ctrl);
++      if (ret)
++              goto out_destroy_admin;
+ 
+-      for (i = 1; i <= ctrl->ctrl.opts->nr_io_queues; i++) {
++      for (i = 1; i < ctrl->queue_count; i++) {
+               ret = nvmf_connect_io_queue(&ctrl->ctrl, i);
+               if (ret)
+-                      goto out_free_queues;
++                      goto out_destroy_io;
+       }
+ 
+       changed = nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_LIVE);
+@@ -492,9 +518,9 @@ static void nvme_loop_reset_ctrl_work(struct work_struct 
*work)
+ 
+       return;
+ 
+-out_free_queues:
+-      for (i = 1; i < ctrl->queue_count; i++)
+-              nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
++out_destroy_io:
++      nvme_loop_destroy_io_queues(ctrl);
++out_destroy_admin:
+       nvme_loop_destroy_admin_queue(ctrl);
+ out_disable:
+       dev_warn(ctrl->ctrl.device, "Removing after reset failure\n");
+@@ -533,25 +559,12 @@ static const struct nvme_ctrl_ops nvme_loop_ctrl_ops = {
+ 
+ static int nvme_loop_create_io_queues(struct nvme_loop_ctrl *ctrl)
+ {
+-      struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;
+       int ret, i;
+ 
+-      ret = nvme_set_queue_count(&ctrl->ctrl, &opts->nr_io_queues);
+-      if (ret || !opts->nr_io_queues)
++      ret = nvme_loop_init_io_queues(ctrl);
++      if (ret)
+               return ret;
+ 
+-      dev_info(ctrl->ctrl.device, "creating %d I/O queues.\n",
+-              opts->nr_io_queues);
+-
+-      for (i = 1; i <= opts->nr_io_queues; i++) {
+-              ctrl->queues[i].ctrl = ctrl;
+-              ret = nvmet_sq_init(&ctrl->queues[i].nvme_sq);
+-              if (ret)
+-                      goto out_destroy_queues;
+-
+-              ctrl->queue_count++;
+-      }
+-
+       memset(&ctrl->tag_set, 0, sizeof(ctrl->tag_set));
+       ctrl->tag_set.ops = &nvme_loop_mq_ops;
+       ctrl->tag_set.queue_depth = ctrl->ctrl.opts->queue_size;
+@@ -575,7 +588,7 @@ static int nvme_loop_create_io_queues(struct 
nvme_loop_ctrl *ctrl)
+               goto out_free_tagset;
+       }
+ 
+-      for (i = 1; i <= opts->nr_io_queues; i++) {
++      for (i = 1; i < ctrl->queue_count; i++) {
+               ret = nvmf_connect_io_queue(&ctrl->ctrl, i);
+               if (ret)
+                       goto out_cleanup_connect_q;
+@@ -588,8 +601,7 @@ static int nvme_loop_create_io_queues(struct 
nvme_loop_ctrl *ctrl)
+ out_free_tagset:
+       blk_mq_free_tag_set(&ctrl->tag_set);
+ out_destroy_queues:
+-      for (i = 1; i < ctrl->queue_count; i++)
+-              nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
++      nvme_loop_destroy_io_queues(ctrl);
+       return ret;
+ }
+ 
+diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
+index 47227820406d..1d32fe2d97aa 100644
+--- a/drivers/pci/iov.c
++++ b/drivers/pci/iov.c
+@@ -164,7 +164,6 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int 
reset)
+       pci_device_add(virtfn, virtfn->bus);
+       mutex_unlock(&iov->dev->sriov->lock);
+ 
+-      pci_bus_add_device(virtfn);
+       sprintf(buf, "virtfn%u", id);
+       rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
+       if (rc)
+@@ -175,6 +174,8 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int 
reset)
+ 
+       kobject_uevent(&virtfn->dev.kobj, KOBJ_CHANGE);
+ 
++      pci_bus_add_device(virtfn);
++
+       return 0;
+ 
+ failed2:
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index e7d4048e81f2..a87c8e1aef68 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -4214,6 +4214,10 @@ static bool pci_bus_resetable(struct pci_bus *bus)
+ {
+       struct pci_dev *dev;
+ 
++
++      if (bus->self && (bus->self->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET))
++              return false;
++
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+               if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET ||
+                   (dev->subordinate && !pci_bus_resetable(dev->subordinate)))
+diff --git a/drivers/pci/pcie/aer/aerdrv_core.c 
b/drivers/pci/pcie/aer/aerdrv_core.c
+index b1303b32053f..057465adf0b6 100644
+--- a/drivers/pci/pcie/aer/aerdrv_core.c
++++ b/drivers/pci/pcie/aer/aerdrv_core.c
+@@ -390,7 +390,14 @@ static pci_ers_result_t broadcast_error_message(struct 
pci_dev *dev,
+                * If the error is reported by an end point, we think this
+                * error is related to the upstream link of the end point.
+                */
+-              pci_walk_bus(dev->bus, cb, &result_data);
++              if (state == pci_channel_io_normal)
++                      /*
++                       * the error is non fatal so the bus is ok, just invoke
++                       * the callback for the function that logged the error.
++                       */
++                      cb(dev, &result_data);
++              else
++                      pci_walk_bus(dev->bus, cb, &result_data);
+       }
+ 
+       return result_data.result;
+diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
+index b7bb37167969..50c45bdf93be 100644
+--- a/drivers/pinctrl/pinctrl-st.c
++++ b/drivers/pinctrl/pinctrl-st.c
+@@ -1285,6 +1285,22 @@ static void st_gpio_irq_unmask(struct irq_data *d)
+       writel(BIT(d->hwirq), bank->base + REG_PIO_SET_PMASK);
+ }
+ 
++static int st_gpio_irq_request_resources(struct irq_data *d)
++{
++      struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
++
++      st_gpio_direction_input(gc, d->hwirq);
++
++      return gpiochip_lock_as_irq(gc, d->hwirq);
++}
++
++static void st_gpio_irq_release_resources(struct irq_data *d)
++{
++      struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
++
++      gpiochip_unlock_as_irq(gc, d->hwirq);
++}
++
+ static int st_gpio_irq_set_type(struct irq_data *d, unsigned type)
+ {
+       struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+@@ -1438,12 +1454,14 @@ static struct gpio_chip st_gpio_template = {
+ };
+ 
+ static struct irq_chip st_gpio_irqchip = {
+-      .name           = "GPIO",
+-      .irq_disable    = st_gpio_irq_mask,
+-      .irq_mask       = st_gpio_irq_mask,
+-      .irq_unmask     = st_gpio_irq_unmask,
+-      .irq_set_type   = st_gpio_irq_set_type,
+-      .flags          = IRQCHIP_SKIP_SET_WAKE,
++      .name                   = "GPIO",
++      .irq_request_resources  = st_gpio_irq_request_resources,
++      .irq_release_resources  = st_gpio_irq_release_resources,
++      .irq_disable            = st_gpio_irq_mask,
++      .irq_mask               = st_gpio_irq_mask,
++      .irq_unmask             = st_gpio_irq_unmask,
++      .irq_set_type           = st_gpio_irq_set_type,
++      .flags                  = IRQCHIP_SKIP_SET_WAKE,
+ };
+ 
+ static int st_gpiolib_register_bank(struct st_pinctrl *info,
+diff --git a/drivers/platform/x86/asus-wireless.c 
b/drivers/platform/x86/asus-wireless.c
+index 9f31bc1a47d0..18716025b1db 100644
+--- a/drivers/platform/x86/asus-wireless.c
++++ b/drivers/platform/x86/asus-wireless.c
+@@ -97,6 +97,7 @@ static void asus_wireless_notify(struct acpi_device *adev, 
u32 event)
+               return;
+       }
+       input_report_key(data->idev, KEY_RFKILL, 1);
++      input_sync(data->idev);
+       input_report_key(data->idev, KEY_RFKILL, 0);
+       input_sync(data->idev);
+ }
+diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
+index 84a52db9b05f..6ebd42aad291 100644
+--- a/drivers/rtc/interface.c
++++ b/drivers/rtc/interface.c
+@@ -772,7 +772,7 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, 
struct rtc_timer *timer)
+       }
+ 
+       timerqueue_add(&rtc->timerqueue, &timer->node);
+-      if (!next) {
++      if (!next || ktime_before(timer->node.expires, next->expires)) {
+               struct rtc_wkalrm alarm;
+               int err;
+               alarm.time = rtc_ktime_to_tm(timer->node.expires);
+diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
+index e1687e19c59f..a30f24cb6c83 100644
+--- a/drivers/rtc/rtc-pl031.c
++++ b/drivers/rtc/rtc-pl031.c
+@@ -308,7 +308,8 @@ static int pl031_remove(struct amba_device *adev)
+ 
+       dev_pm_clear_wake_irq(&adev->dev);
+       device_init_wakeup(&adev->dev, false);
+-      free_irq(adev->irq[0], ldata);
++      if (adev->irq[0])
++              free_irq(adev->irq[0], ldata);
+       rtc_device_unregister(ldata->rtc);
+       iounmap(ldata->base);
+       kfree(ldata);
+@@ -381,12 +382,13 @@ static int pl031_probe(struct amba_device *adev, const 
struct amba_id *id)
+               goto out_no_rtc;
+       }
+ 
+-      if (request_irq(adev->irq[0], pl031_interrupt,
+-                      vendor->irqflags, "rtc-pl031", ldata)) {
+-              ret = -EIO;
+-              goto out_no_irq;
++      if (adev->irq[0]) {
++              ret = request_irq(adev->irq[0], pl031_interrupt,
++                                vendor->irqflags, "rtc-pl031", ldata);
++              if (ret)
++                      goto out_no_irq;
++              dev_pm_set_wake_irq(&adev->dev, adev->irq[0]);
+       }
+-      dev_pm_set_wake_irq(&adev->dev, adev->irq[0]);
+       return 0;
+ 
+ out_no_irq:
+diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
+index e2bd2ad01b15..e72234efb648 100644
+--- a/drivers/s390/net/qeth_core.h
++++ b/drivers/s390/net/qeth_core.h
+@@ -969,7 +969,8 @@ int qeth_bridgeport_query_ports(struct qeth_card *card,
+ int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role);
+ int qeth_bridgeport_an_set(struct qeth_card *card, int enable);
+ int qeth_get_priority_queue(struct qeth_card *, struct sk_buff *, int, int);
+-int qeth_get_elements_no(struct qeth_card *, struct sk_buff *, int);
++int qeth_get_elements_no(struct qeth_card *card, struct sk_buff *skb,
++                       int extra_elems, int data_offset);
+ int qeth_get_elements_for_frags(struct sk_buff *);
+ int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *,
+                       struct sk_buff *, struct qeth_hdr *, int, int, int);
+diff --git a/drivers/s390/net/qeth_core_main.c 
b/drivers/s390/net/qeth_core_main.c
+index b5fa6bb56b29..838ed6213118 100644
+--- a/drivers/s390/net/qeth_core_main.c
++++ b/drivers/s390/net/qeth_core_main.c
+@@ -3842,6 +3842,7 @@ EXPORT_SYMBOL_GPL(qeth_get_elements_for_frags);
+  * @card:                     qeth card structure, to check max. elems.
+  * @skb:                      SKB address
+  * @extra_elems:              extra elems needed, to check against max.
++ * @data_offset:              range starts at skb->data + data_offset
+  *
+  * Returns the number of pages, and thus QDIO buffer elements, needed to cover
+  * skb data, including linear part and fragments. Checks if the result plus
+@@ -3849,10 +3850,10 @@ EXPORT_SYMBOL_GPL(qeth_get_elements_for_frags);
+  * Note: extra_elems is not included in the returned result.
+  */
+ int qeth_get_elements_no(struct qeth_card *card,
+-                   struct sk_buff *skb, int extra_elems)
++                   struct sk_buff *skb, int extra_elems, int data_offset)
+ {
+       int elements = qeth_get_elements_for_range(
+-                              (addr_t)skb->data,
++                              (addr_t)skb->data + data_offset,
+                               (addr_t)skb->data + skb_headlen(skb)) +
+                       qeth_get_elements_for_frags(skb);
+ 
+diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
+index ac33f6c999b1..5082dfeacb95 100644
+--- a/drivers/s390/net/qeth_l2_main.c
++++ b/drivers/s390/net/qeth_l2_main.c
+@@ -865,7 +865,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
+        * chaining we can not send long frag lists
+        */
+       if ((card->info.type != QETH_CARD_TYPE_IQD) &&
+-          !qeth_get_elements_no(card, new_skb, 0)) {
++          !qeth_get_elements_no(card, new_skb, 0, 0)) {
+               int lin_rc = skb_linearize(new_skb);
+ 
+               if (card->options.performance_stats) {
+@@ -910,7 +910,8 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
+               }
+       }
+ 
+-      elements = qeth_get_elements_no(card, new_skb, elements_needed);
++      elements = qeth_get_elements_no(card, new_skb, elements_needed,
++                                      (data_offset > 0) ? data_offset : 0);
+       if (!elements) {
+               if (data_offset >= 0)
+                       kmem_cache_free(qeth_core_header_cache, hdr);
+diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
+index 5735fc3be6c7..f91e70c369ed 100644
+--- a/drivers/s390/net/qeth_l3_main.c
++++ b/drivers/s390/net/qeth_l3_main.c
+@@ -2612,17 +2612,13 @@ static void qeth_l3_fill_af_iucv_hdr(struct qeth_card 
*card,
+       char daddr[16];
+       struct af_iucv_trans_hdr *iucv_hdr;
+ 
+-      skb_pull(skb, 14);
+-      card->dev->header_ops->create(skb, card->dev, 0,
+-                                    card->dev->dev_addr, card->dev->dev_addr,
+-                                    card->dev->addr_len);
+-      skb_pull(skb, 14);
+-      iucv_hdr = (struct af_iucv_trans_hdr *)skb->data;
+       memset(hdr, 0, sizeof(struct qeth_hdr));
+       hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3;
+       hdr->hdr.l3.ext_flags = 0;
+-      hdr->hdr.l3.length = skb->len;
++      hdr->hdr.l3.length = skb->len - ETH_HLEN;
+       hdr->hdr.l3.flags = QETH_HDR_IPV6 | QETH_CAST_UNICAST;
++
++      iucv_hdr = (struct af_iucv_trans_hdr *) (skb->data + ETH_HLEN);
+       memset(daddr, 0, sizeof(daddr));
+       daddr[0] = 0xfe;
+       daddr[1] = 0x80;
+@@ -2826,10 +2822,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
+       if ((card->info.type == QETH_CARD_TYPE_IQD) &&
+           !skb_is_nonlinear(skb)) {
+               new_skb = skb;
+-              if (new_skb->protocol == ETH_P_AF_IUCV)
+-                      data_offset = 0;
+-              else
+-                      data_offset = ETH_HLEN;
++              data_offset = ETH_HLEN;
+               hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC);
+               if (!hdr)
+                       goto tx_drop;
+@@ -2870,7 +2863,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
+        */
+       if ((card->info.type != QETH_CARD_TYPE_IQD) &&
+           ((use_tso && !qeth_l3_get_elements_no_tso(card, new_skb, 1)) ||
+-           (!use_tso && !qeth_get_elements_no(card, new_skb, 0)))) {
++           (!use_tso && !qeth_get_elements_no(card, new_skb, 0, 0)))) {
+               int lin_rc = skb_linearize(new_skb);
+ 
+               if (card->options.performance_stats) {
+@@ -2912,7 +2905,8 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
+ 
+       elements = use_tso ?
+                  qeth_l3_get_elements_no_tso(card, new_skb, hdr_elements) :
+-                 qeth_get_elements_no(card, new_skb, hdr_elements);
++                 qeth_get_elements_no(card, new_skb, hdr_elements,
++                                      (data_offset > 0) ? data_offset : 0);
+       if (!elements) {
+               if (data_offset >= 0)
+                       kmem_cache_free(qeth_core_header_cache, hdr);
+diff --git a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c 
b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+index 0039bebaa9e2..358ec32927ba 100644
+--- a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
++++ b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+@@ -1347,6 +1347,7 @@ static void release_offload_resources(struct cxgbi_sock 
*csk)
+               csk, csk->state, csk->flags, csk->tid);
+ 
+       cxgbi_sock_free_cpl_skbs(csk);
++      cxgbi_sock_purge_write_queue(csk);
+       if (csk->wr_cred != csk->wr_max_cred) {
+               cxgbi_sock_purge_wr_queue(csk);
+               cxgbi_sock_reset_wr_list(csk);
+diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
+index 9c9563312a3d..fc7addaf24da 100644
+--- a/drivers/scsi/lpfc/lpfc_els.c
++++ b/drivers/scsi/lpfc/lpfc_els.c
+@@ -7782,7 +7782,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct 
lpfc_sli_ring *pring,
+                       did, vport->port_state, ndlp->nlp_flag);
+ 
+               phba->fc_stat.elsRcvPRLI++;
+-              if (vport->port_state < LPFC_DISC_AUTH) {
++              if ((vport->port_state < LPFC_DISC_AUTH) &&
++                  (vport->fc_flag & FC_FABRIC)) {
+                       rjt_err = LSRJT_UNABLE_TPC;
+                       rjt_exp = LSEXP_NOTHING_MORE;
+                       break;
+diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c 
b/drivers/scsi/lpfc/lpfc_hbadisc.c
+index ed223937798a..7d2ad633b6bc 100644
+--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
++++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
+@@ -4784,7 +4784,8 @@ lpfc_nlp_remove(struct lpfc_vport *vport, struct 
lpfc_nodelist *ndlp)
+       lpfc_cancel_retry_delay_tmo(vport, ndlp);
+       if ((ndlp->nlp_flag & NLP_DEFER_RM) &&
+           !(ndlp->nlp_flag & NLP_REG_LOGIN_SEND) &&
+-          !(ndlp->nlp_flag & NLP_RPI_REGISTERED)) {
++          !(ndlp->nlp_flag & NLP_RPI_REGISTERED) &&
++          phba->sli_rev != LPFC_SLI_REV4) {
+               /* For this case we need to cleanup the default rpi
+                * allocated by the firmware.
+                */
+diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
+index 55faa94637a9..2a436dff1589 100644
+--- a/drivers/scsi/lpfc/lpfc_hw4.h
++++ b/drivers/scsi/lpfc/lpfc_hw4.h
+@@ -3232,7 +3232,7 @@ struct lpfc_mbx_get_port_name {
+ #define MB_CEQ_STATUS_QUEUE_FLUSHING          0x4
+ #define MB_CQE_STATUS_DMA_FAILED              0x5
+ 
+-#define LPFC_MBX_WR_CONFIG_MAX_BDE            8
++#define LPFC_MBX_WR_CONFIG_MAX_BDE            1
+ struct lpfc_mbx_wr_object {
+       struct mbox_header header;
+       union {
+diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+index 289374cbcb47..468acab04d3d 100644
+--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
++++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+@@ -4770,6 +4770,11 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, 
u8 msix_index, u32 reply)
+               } else if (log_info == VIRTUAL_IO_FAILED_RETRY) {
+                       scmd->result = DID_RESET << 16;
+                       break;
++              } else if ((scmd->device->channel == RAID_CHANNEL) &&
++                 (scsi_state == (MPI2_SCSI_STATE_TERMINATED |
++                 MPI2_SCSI_STATE_NO_SCSI_STATUS))) {
++                      scmd->result = DID_RESET << 16;
++                      break;
+               }
+               scmd->result = DID_SOFT_ERROR << 16;
+               break;
+diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c
+index 8dffd8a7e762..9f01427f35f9 100644
+--- a/drivers/staging/greybus/light.c
++++ b/drivers/staging/greybus/light.c
+@@ -924,6 +924,8 @@ static void __gb_lights_led_unregister(struct gb_channel 
*channel)
+               return;
+ 
+       led_classdev_unregister(cdev);
++      kfree(cdev->name);
++      cdev->name = NULL;
+       channel->led = NULL;
+ }
+ 
+diff --git a/drivers/thermal/hisi_thermal.c b/drivers/thermal/hisi_thermal.c
+index f6429666a1cf..c5285ed34fdd 100644
+--- a/drivers/thermal/hisi_thermal.c
++++ b/drivers/thermal/hisi_thermal.c
+@@ -35,8 +35,9 @@
+ #define TEMP0_RST_MSK                 (0x1C)
+ #define TEMP0_VALUE                   (0x28)
+ 
+-#define HISI_TEMP_BASE                        (-60)
++#define HISI_TEMP_BASE                        (-60000)
+ #define HISI_TEMP_RESET                       (100000)
++#define HISI_TEMP_STEP                        (784)
+ 
+ #define HISI_MAX_SENSORS              4
+ 
+@@ -61,19 +62,38 @@ struct hisi_thermal_data {
+       void __iomem *regs;
+ };
+ 
+-/* in millicelsius */
+-static inline int _step_to_temp(int step)
++/*
++ * The temperature computation on the tsensor is as follow:
++ *    Unit: millidegree Celsius
++ *    Step: 255/200 (0.7843)
++ *    Temperature base: -60°C
++ *
++ * The register is programmed in temperature steps, every step is 784
++ * millidegree and begins at -60 000 m°C
++ *
++ * The temperature from the steps:
++ *
++ *    Temp = TempBase + (steps x 784)
++ *
++ * and the steps from the temperature:
++ *
++ *    steps = (Temp - TempBase) / 784
++ *
++ */
++static inline int hisi_thermal_step_to_temp(int step)
+ {
+-      /*
+-       * Every step equals (1 * 200) / 255 celsius, and finally
+-       * need convert to millicelsius.
+-       */
+-      return (HISI_TEMP_BASE * 1000 + (step * 200000 / 255));
++      return HISI_TEMP_BASE + (step * HISI_TEMP_STEP);
+ }
+ 
+-static inline long _temp_to_step(long temp)
++static inline long hisi_thermal_temp_to_step(long temp)
+ {
+-      return ((temp - HISI_TEMP_BASE * 1000) * 255) / 200000;
++      return (temp - HISI_TEMP_BASE) / HISI_TEMP_STEP;
++}
++
++static inline long hisi_thermal_round_temp(int temp)
++{
++      return hisi_thermal_step_to_temp(
++              hisi_thermal_temp_to_step(temp));
+ }
+ 
+ static long hisi_thermal_get_sensor_temp(struct hisi_thermal_data *data,
+@@ -99,7 +119,7 @@ static long hisi_thermal_get_sensor_temp(struct 
hisi_thermal_data *data,
+       usleep_range(3000, 5000);
+ 
+       val = readl(data->regs + TEMP0_VALUE);
+-      val = _step_to_temp(val);
++      val = hisi_thermal_step_to_temp(val);
+ 
+       mutex_unlock(&data->thermal_lock);
+ 
+@@ -126,10 +146,11 @@ static void hisi_thermal_enable_bind_irq_sensor
+       writel((sensor->id << 12), data->regs + TEMP0_CFG);
+ 
+       /* enable for interrupt */
+-      writel(_temp_to_step(sensor->thres_temp) | 0x0FFFFFF00,
++      writel(hisi_thermal_temp_to_step(sensor->thres_temp) | 0x0FFFFFF00,
+              data->regs + TEMP0_TH);
+ 
+-      writel(_temp_to_step(HISI_TEMP_RESET), data->regs + TEMP0_RST_TH);
++      writel(hisi_thermal_temp_to_step(HISI_TEMP_RESET),
++             data->regs + TEMP0_RST_TH);
+ 
+       /* enable module */
+       writel(0x1, data->regs + TEMP0_RST_MSK);
+@@ -230,7 +251,7 @@ static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, 
void *dev)
+       sensor = &data->sensors[data->irq_bind_sensor];
+ 
+       dev_crit(&data->pdev->dev, "THERMAL ALARM: T > %d\n",
+-               sensor->thres_temp / 1000);
++               sensor->thres_temp);
+       mutex_unlock(&data->thermal_lock);
+ 
+       for (i = 0; i < HISI_MAX_SENSORS; i++) {
+@@ -269,7 +290,7 @@ static int hisi_thermal_register_sensor(struct 
platform_device *pdev,
+ 
+       for (i = 0; i < of_thermal_get_ntrips(sensor->tzd); i++) {
+               if (trip[i].type == THERMAL_TRIP_PASSIVE) {
+-                      sensor->thres_temp = trip[i].temperature;
++                      sensor->thres_temp = 
hisi_thermal_round_temp(trip[i].temperature);
+                       break;
+               }
+       }
+@@ -317,15 +338,6 @@ static int hisi_thermal_probe(struct platform_device 
*pdev)
+       if (data->irq < 0)
+               return data->irq;
+ 
+-      ret = devm_request_threaded_irq(&pdev->dev, data->irq,
+-                                      hisi_thermal_alarm_irq,
+-                                      hisi_thermal_alarm_irq_thread,
+-                                      0, "hisi_thermal", data);
+-      if (ret < 0) {
+-              dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret);
+-              return ret;
+-      }
+-
+       platform_set_drvdata(pdev, data);
+ 
+       data->clk = devm_clk_get(&pdev->dev, "thermal_clk");
+@@ -345,8 +357,7 @@ static int hisi_thermal_probe(struct platform_device *pdev)
+       }
+ 
+       hisi_thermal_enable_bind_irq_sensor(data);
+-      irq_get_irqchip_state(data->irq, IRQCHIP_STATE_MASKED,
+-                            &data->irq_enabled);
++      data->irq_enabled = true;
+ 
+       for (i = 0; i < HISI_MAX_SENSORS; ++i) {
+               ret = hisi_thermal_register_sensor(pdev, data,
+@@ -358,6 +369,17 @@ static int hisi_thermal_probe(struct platform_device 
*pdev)
+                       hisi_thermal_toggle_sensor(&data->sensors[i], true);
+       }
+ 
++      ret = devm_request_threaded_irq(&pdev->dev, data->irq,
++                                      hisi_thermal_alarm_irq,
++                                      hisi_thermal_alarm_irq_thread,
++                                      0, "hisi_thermal", data);
++      if (ret < 0) {
++              dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret);
++              return ret;
++      }
++
++      enable_irq(data->irq);
++
+       return 0;
+ }
+ 
+@@ -397,8 +419,11 @@ static int hisi_thermal_suspend(struct device *dev)
+ static int hisi_thermal_resume(struct device *dev)
+ {
+       struct hisi_thermal_data *data = dev_get_drvdata(dev);
++      int ret;
+ 
+-      clk_prepare_enable(data->clk);
++      ret = clk_prepare_enable(data->clk);
++      if (ret)
++              return ret;
+ 
+       data->irq_enabled = true;
+       hisi_thermal_enable_bind_irq_sensor(data);
+diff --git a/drivers/usb/gadget/function/f_uvc.c 
b/drivers/usb/gadget/function/f_uvc.c
+index c7689d05356c..f8a1881609a2 100644
+--- a/drivers/usb/gadget/function/f_uvc.c
++++ b/drivers/usb/gadget/function/f_uvc.c
+@@ -594,6 +594,14 @@ uvc_function_bind(struct usb_configuration *c, struct 
usb_function *f)
+       opts->streaming_maxpacket = clamp(opts->streaming_maxpacket, 1U, 3072U);
+       opts->streaming_maxburst = min(opts->streaming_maxburst, 15U);
+ 
++      /* For SS, wMaxPacketSize has to be 1024 if bMaxBurst is not 0 */
++      if (opts->streaming_maxburst &&
++          (opts->streaming_maxpacket % 1024) != 0) {
++              opts->streaming_maxpacket = roundup(opts->streaming_maxpacket, 
1024);
++              INFO(cdev, "overriding streaming_maxpacket to %d\n",
++                   opts->streaming_maxpacket);
++      }
++
+       /* Fill in the FS/HS/SS Video Streaming specific descriptors from the
+        * module parameters.
+        *
+diff --git a/drivers/usb/gadget/udc/pch_udc.c 
b/drivers/usb/gadget/udc/pch_udc.c
+index a97da645c1b9..8a365aad66fe 100644
+--- a/drivers/usb/gadget/udc/pch_udc.c
++++ b/drivers/usb/gadget/udc/pch_udc.c
+@@ -1523,7 +1523,6 @@ static void pch_udc_free_dma_chain(struct pch_udc_dev 
*dev,
+               td = phys_to_virt(addr);
+               addr2 = (dma_addr_t)td->next;
+               pci_pool_free(dev->data_requests, td, addr);
+-              td->next = 0x00;
+               addr = addr2;
+       }
+       req->chain_len = 1;
+diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
+index ca8b0b1ae37d..dec100811946 100644
+--- a/drivers/usb/host/xhci-plat.c
++++ b/drivers/usb/host/xhci-plat.c
+@@ -335,6 +335,7 @@ MODULE_DEVICE_TABLE(acpi, usb_xhci_acpi_match);
+ static struct platform_driver usb_xhci_driver = {
+       .probe  = xhci_plat_probe,
+       .remove = xhci_plat_remove,
++      .shutdown       = usb_hcd_platform_shutdown,
+       .driver = {
+               .name = "xhci-hcd",
+               .pm = DEV_PM_OPS,
+diff --git a/drivers/vfio/pci/vfio_pci_config.c 
b/drivers/vfio/pci/vfio_pci_config.c
+index 65d4a3015542..9f1ec4392209 100644
+--- a/drivers/vfio/pci/vfio_pci_config.c
++++ b/drivers/vfio/pci/vfio_pci_config.c
+@@ -851,11 +851,13 @@ static int __init init_pci_cap_exp_perm(struct perm_bits 
*perm)
+ 
+       /*
+        * Allow writes to device control fields, except devctl_phantom,
+-       * which could confuse IOMMU, and the ARI bit in devctl2, which
++       * which could confuse IOMMU, MPS, which can break communication
++       * with other physical devices, and the ARI bit in devctl2, which
+        * is set at probe time.  FLR gets virtualized via our writefn.
+        */
+       p_setw(perm, PCI_EXP_DEVCTL,
+-             PCI_EXP_DEVCTL_BCR_FLR, ~PCI_EXP_DEVCTL_PHANTOM);
++             PCI_EXP_DEVCTL_BCR_FLR | PCI_EXP_DEVCTL_PAYLOAD,
++             ~PCI_EXP_DEVCTL_PHANTOM);
+       p_setw(perm, PCI_EXP_DEVCTL2, NO_VIRT, ~PCI_EXP_DEVCTL2_ARI);
+       return 0;
+ }
+diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
+index e3fad302b4fb..0ec970ca64ce 100644
+--- a/drivers/vhost/vsock.c
++++ b/drivers/vhost/vsock.c
+@@ -218,6 +218,46 @@ vhost_transport_send_pkt(struct virtio_vsock_pkt *pkt)
+       return len;
+ }
+ 
++static int
++vhost_transport_cancel_pkt(struct vsock_sock *vsk)
++{
++      struct vhost_vsock *vsock;
++      struct virtio_vsock_pkt *pkt, *n;
++      int cnt = 0;
++      LIST_HEAD(freeme);
++
++      /* Find the vhost_vsock according to guest context id  */
++      vsock = vhost_vsock_get(vsk->remote_addr.svm_cid);
++      if (!vsock)
++              return -ENODEV;
++
++      spin_lock_bh(&vsock->send_pkt_list_lock);
++      list_for_each_entry_safe(pkt, n, &vsock->send_pkt_list, list) {
++              if (pkt->vsk != vsk)
++                      continue;
++              list_move(&pkt->list, &freeme);
++      }
++      spin_unlock_bh(&vsock->send_pkt_list_lock);
++
++      list_for_each_entry_safe(pkt, n, &freeme, list) {
++              if (pkt->reply)
++                      cnt++;
++              list_del(&pkt->list);
++              virtio_transport_free_pkt(pkt);
++      }
++
++      if (cnt) {
++              struct vhost_virtqueue *tx_vq = &vsock->vqs[VSOCK_VQ_TX];
++              int new_cnt;
++
++              new_cnt = atomic_sub_return(cnt, &vsock->queued_replies);
++              if (new_cnt + cnt >= tx_vq->num && new_cnt < tx_vq->num)
++                      vhost_poll_queue(&tx_vq->poll);
++      }
++
++      return 0;
++}
++
+ static struct virtio_vsock_pkt *
+ vhost_vsock_alloc_pkt(struct vhost_virtqueue *vq,
+                     unsigned int out, unsigned int in)
+@@ -669,6 +709,7 @@ static struct virtio_transport vhost_transport = {
+               .release                  = virtio_transport_release,
+               .connect                  = virtio_transport_connect,
+               .shutdown                 = virtio_transport_shutdown,
++              .cancel_pkt               = vhost_transport_cancel_pkt,
+ 
+               .dgram_enqueue            = virtio_transport_dgram_enqueue,
+               .dgram_dequeue            = virtio_transport_dgram_dequeue,
+diff --git a/drivers/video/backlight/pwm_bl.c 
b/drivers/video/backlight/pwm_bl.c
+index 12614006211e..d95ae092f154 100644
+--- a/drivers/video/backlight/pwm_bl.c
++++ b/drivers/video/backlight/pwm_bl.c
+@@ -79,14 +79,17 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
+ static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
+ {
+       unsigned int lth = pb->lth_brightness;
+-      int duty_cycle;
++      u64 duty_cycle;
+ 
+       if (pb->levels)
+               duty_cycle = pb->levels[brightness];
+       else
+               duty_cycle = brightness;
+ 
+-      return (duty_cycle * (pb->period - lth) / pb->scale) + lth;
++      duty_cycle *= pb->period - lth;
++      do_div(duty_cycle, pb->scale);
++
++      return duty_cycle + lth;
+ }
+ 
+ static int pwm_backlight_update_status(struct backlight_device *bl)
+diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
+index 2c2e6792f7e0..a7c08cc4c1b7 100644
+--- a/drivers/virtio/virtio_balloon.c
++++ b/drivers/virtio/virtio_balloon.c
+@@ -241,11 +241,11 @@ static inline void update_stat(struct virtio_balloon 
*vb, int idx,
+ 
+ #define pages_to_bytes(x) ((u64)(x) << PAGE_SHIFT)
+ 
+-static void update_balloon_stats(struct virtio_balloon *vb)
++static unsigned int update_balloon_stats(struct virtio_balloon *vb)
+ {
+       unsigned long events[NR_VM_EVENT_ITEMS];
+       struct sysinfo i;
+-      int idx = 0;
++      unsigned int idx = 0;
+       long available;
+ 
+       all_vm_events(events);
+@@ -253,18 +253,22 @@ static void update_balloon_stats(struct virtio_balloon 
*vb)
+ 
+       available = si_mem_available();
+ 
++#ifdef CONFIG_VM_EVENT_COUNTERS
+       update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_IN,
+                               pages_to_bytes(events[PSWPIN]));
+       update_stat(vb, idx++, VIRTIO_BALLOON_S_SWAP_OUT,
+                               pages_to_bytes(events[PSWPOUT]));
+       update_stat(vb, idx++, VIRTIO_BALLOON_S_MAJFLT, events[PGMAJFAULT]);
+       update_stat(vb, idx++, VIRTIO_BALLOON_S_MINFLT, events[PGFAULT]);
++#endif
+       update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMFREE,
+                               pages_to_bytes(i.freeram));
+       update_stat(vb, idx++, VIRTIO_BALLOON_S_MEMTOT,
+                               pages_to_bytes(i.totalram));
+       update_stat(vb, idx++, VIRTIO_BALLOON_S_AVAIL,
+                               pages_to_bytes(available));
++
++      return idx;
+ }
+ 
+ /*
+@@ -290,14 +294,14 @@ static void stats_handle_request(struct virtio_balloon 
*vb)
+ {
+       struct virtqueue *vq;
+       struct scatterlist sg;
+-      unsigned int len;
++      unsigned int len, num_stats;
+ 
+-      update_balloon_stats(vb);
++      num_stats = update_balloon_stats(vb);
+ 
+       vq = vb->stats_vq;
+       if (!virtqueue_get_buf(vq, &len))
+               return;
+-      sg_init_one(&sg, vb->stats, sizeof(vb->stats));
++      sg_init_one(&sg, vb->stats, sizeof(vb->stats[0]) * num_stats);
+       virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL);
+       virtqueue_kick(vq);
+ }
+@@ -421,15 +425,16 @@ static int init_vqs(struct virtio_balloon *vb)
+       vb->deflate_vq = vqs[1];
+       if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_STATS_VQ)) {
+               struct scatterlist sg;
++              unsigned int num_stats;
+               vb->stats_vq = vqs[2];
+ 
+               /*
+                * Prime this virtqueue with one buffer so the hypervisor can
+                * use it to signal us later (it can't be broken yet!).
+                */
+-              update_balloon_stats(vb);
++              num_stats = update_balloon_stats(vb);
+ 
+-              sg_init_one(&sg, vb->stats, sizeof vb->stats);
++              sg_init_one(&sg, vb->stats, sizeof(vb->stats[0]) * num_stats);
+               if (virtqueue_add_outbuf(vb->stats_vq, &sg, 1, vb, GFP_KERNEL)
+                   < 0)
+                       BUG();
+diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
+index 77f9efc1f7aa..9a47b5598df7 100644
+--- a/fs/btrfs/send.c
++++ b/fs/btrfs/send.c
+@@ -6196,8 +6196,13 @@ long btrfs_ioctl_send(struct file *mnt_file, void 
__user *arg_)
+               goto out;
+       }
+ 
++      /*
++       * Check that we don't overflow at later allocations, we request
++       * clone_sources_count + 1 items, and compare to unsigned long inside
++       * access_ok.
++       */
+       if (arg->clone_sources_count >
+-          ULLONG_MAX / sizeof(*arg->clone_sources)) {
++          ULONG_MAX / sizeof(struct clone_root) - 1) {
+               ret = -EINVAL;
+               goto out;
+       }
+diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
+index 3101141661a1..4c4e9358c146 100644
+--- a/include/linux/bpf_verifier.h
++++ b/include/linux/bpf_verifier.h
+@@ -68,6 +68,7 @@ struct bpf_verifier_state_list {
+ 
+ struct bpf_insn_aux_data {
+       enum bpf_reg_type ptr_type;     /* pointer type for load/store insns */
++      bool seen; /* this insn was processed by the verifier */
+ };
+ 
+ #define MAX_USED_MAPS 64 /* max number of maps accessed by one eBPF program */
+diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h
+index 9638bfeb0d1f..584f9a647ad4 100644
+--- a/include/linux/virtio_vsock.h
++++ b/include/linux/virtio_vsock.h
+@@ -48,6 +48,8 @@ struct virtio_vsock_pkt {
+       struct virtio_vsock_hdr hdr;
+       struct work_struct work;
+       struct list_head list;
++      /* socket refcnt not held, only use for cancellation */
++      struct vsock_sock *vsk;
+       void *buf;
+       u32 len;
+       u32 off;
+@@ -56,6 +58,7 @@ struct virtio_vsock_pkt {
+ 
+ struct virtio_vsock_pkt_info {
+       u32 remote_cid, remote_port;
++      struct vsock_sock *vsk;
+       struct msghdr *msg;
+       u32 pkt_len;
+       u16 type;
+diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h
+index f2758964ce6f..f32ed9ac181a 100644
+--- a/include/net/af_vsock.h
++++ b/include/net/af_vsock.h
+@@ -100,6 +100,9 @@ struct vsock_transport {
+       void (*destruct)(struct vsock_sock *);
+       void (*release)(struct vsock_sock *);
+ 
++      /* Cancel all pending packets sent on vsock. */
++      int (*cancel_pkt)(struct vsock_sock *vsk);
++
+       /* Connections. */
+       int (*connect)(struct vsock_sock *);
+ 
+diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
+index 372454aa7f37..8b1ebe4c6aba 100644
+--- a/kernel/bpf/verifier.c
++++ b/kernel/bpf/verifier.c
+@@ -1790,10 +1790,17 @@ static int check_alu_op(struct bpf_verifier_env *env, 
struct bpf_insn *insn)
+                       /* case: R = imm
+                        * remember the value we stored into this reg
+                        */
++                      u64 imm;
++
++                      if (BPF_CLASS(insn->code) == BPF_ALU64)
++                              imm = insn->imm;
++                      else
++                              imm = (u32)insn->imm;
++
+                       regs[insn->dst_reg].type = CONST_IMM;
+-                      regs[insn->dst_reg].imm = insn->imm;
+-                      regs[insn->dst_reg].max_value = insn->imm;
+-                      regs[insn->dst_reg].min_value = insn->imm;
++                      regs[insn->dst_reg].imm = imm;
++                      regs[insn->dst_reg].max_value = imm;
++                      regs[insn->dst_reg].min_value = imm;
+               }
+ 
+       } else if (opcode > BPF_END) {
+@@ -1861,10 +1868,28 @@ static int check_alu_op(struct bpf_verifier_env *env, 
struct bpf_insn *insn)
+                          ((BPF_SRC(insn->code) == BPF_X &&
+                            regs[insn->src_reg].type == CONST_IMM) ||
+                           BPF_SRC(insn->code) == BPF_K)) {
+-                      if (BPF_SRC(insn->code) == BPF_X)
++                      if (BPF_SRC(insn->code) == BPF_X) {
++                              /* check in case the register contains a big
++                               * 64-bit value
++                               */
++                              if (regs[insn->src_reg].imm < -MAX_BPF_STACK ||
++                                  regs[insn->src_reg].imm > MAX_BPF_STACK) {
++                                      verbose("R%d value too big in R%d 
pointer arithmetic\n",
++                                              insn->src_reg, insn->dst_reg);
++                                      return -EACCES;
++                              }
+                               dst_reg->imm += regs[insn->src_reg].imm;
+-                      else
++                      } else {
++                              /* safe against overflow: addition of 32-bit
++                               * numbers in 64-bit representation
++                               */
+                               dst_reg->imm += insn->imm;
++                      }
++                      if (dst_reg->imm > 0 || dst_reg->imm < -MAX_BPF_STACK) {
++                              verbose("R%d out-of-bounds pointer 
arithmetic\n",
++                                      insn->dst_reg);
++                              return -EACCES;
++                      }
+                       return 0;
+               } else if (opcode == BPF_ADD &&
+                          BPF_CLASS(insn->code) == BPF_ALU64 &&
+@@ -2862,6 +2887,7 @@ static int do_check(struct bpf_verifier_env *env)
+               if (err)
+                       return err;
+ 
++              env->insn_aux_data[insn_idx].seen = true;
+               if (class == BPF_ALU || class == BPF_ALU64) {
+                       err = check_alu_op(env, insn);
+                       if (err)
+@@ -3059,6 +3085,7 @@ static int do_check(struct bpf_verifier_env *env)
+                                       return err;
+ 
+                               insn_idx++;
++                              env->insn_aux_data[insn_idx].seen = true;
+                       } else {
+                               verbose("invalid BPF_LD mode\n");
+                               return -EINVAL;
+@@ -3210,6 +3237,63 @@ static void convert_pseudo_ld_imm64(struct 
bpf_verifier_env *env)
+                       insn->src_reg = 0;
+ }
+ 
++/* single env->prog->insni[off] instruction was replaced with the range
++ * insni[off, off + cnt).  Adjust corresponding insn_aux_data by copying
++ * [0, off) and [off, end) to new locations, so the patched range stays zero
++ */
++static int adjust_insn_aux_data(struct bpf_verifier_env *env, u32 prog_len,
++                              u32 off, u32 cnt)
++{
++      struct bpf_insn_aux_data *new_data, *old_data = env->insn_aux_data;
++      int i;
++
++      if (cnt == 1)
++              return 0;
++      new_data = vzalloc(sizeof(struct bpf_insn_aux_data) * prog_len);
++      if (!new_data)
++              return -ENOMEM;
++      memcpy(new_data, old_data, sizeof(struct bpf_insn_aux_data) * off);
++      memcpy(new_data + off + cnt - 1, old_data + off,
++             sizeof(struct bpf_insn_aux_data) * (prog_len - off - cnt + 1));
++      for (i = off; i < off + cnt - 1; i++)
++              new_data[i].seen = true;
++      env->insn_aux_data = new_data;
++      vfree(old_data);
++      return 0;
++}
++
++static struct bpf_prog *bpf_patch_insn_data(struct bpf_verifier_env *env, u32 
off,
++                                          const struct bpf_insn *patch, u32 
len)
++{
++      struct bpf_prog *new_prog;
++
++      new_prog = bpf_patch_insn_single(env->prog, off, patch, len);
++      if (!new_prog)
++              return NULL;
++      if (adjust_insn_aux_data(env, new_prog->len, off, len))
++              return NULL;
++      return new_prog;
++}
++
++/* The verifier does more data flow analysis than llvm and will not explore
++ * branches that are dead at run time. Malicious programs can have dead code
++ * too. Therefore replace all dead at-run-time code with nops.
++ */
++static void sanitize_dead_code(struct bpf_verifier_env *env)
++{
++      struct bpf_insn_aux_data *aux_data = env->insn_aux_data;
++      struct bpf_insn nop = BPF_MOV64_REG(BPF_REG_0, BPF_REG_0);
++      struct bpf_insn *insn = env->prog->insnsi;
++      const int insn_cnt = env->prog->len;
++      int i;
++
++      for (i = 0; i < insn_cnt; i++) {
++              if (aux_data[i].seen)
++                      continue;
++              memcpy(insn + i, &nop, sizeof(nop));
++      }
++}
++
+ /* convert load instructions that access fields of 'struct __sk_buff'
+  * into sequence of instructions that access fields of 'struct sk_buff'
+  */
+@@ -3229,10 +3313,10 @@ static int convert_ctx_accesses(struct 
bpf_verifier_env *env)
+                       verbose("bpf verifier is misconfigured\n");
+                       return -EINVAL;
+               } else if (cnt) {
+-                      new_prog = bpf_patch_insn_single(env->prog, 0,
+-                                                       insn_buf, cnt);
++                      new_prog = bpf_patch_insn_data(env, 0, insn_buf, cnt);
+                       if (!new_prog)
+                               return -ENOMEM;
++
+                       env->prog = new_prog;
+                       delta += cnt - 1;
+               }
+@@ -3253,7 +3337,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env 
*env)
+               else
+                       continue;
+ 
+-              if (env->insn_aux_data[i].ptr_type != PTR_TO_CTX)
++              if (env->insn_aux_data[i + delta].ptr_type != PTR_TO_CTX)
+                       continue;
+ 
+               cnt = ops->convert_ctx_access(type, insn->dst_reg, 
insn->src_reg,
+@@ -3263,8 +3347,7 @@ static int convert_ctx_accesses(struct bpf_verifier_env 
*env)
+                       return -EINVAL;
+               }
+ 
+-              new_prog = bpf_patch_insn_single(env->prog, i + delta, insn_buf,
+-                                               cnt);
++              new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
+               if (!new_prog)
+                       return -ENOMEM;
+ 
+@@ -3372,6 +3455,9 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr 
*attr)
+       while (pop_stack(env, NULL) >= 0);
+       free_states(env);
+ 
++      if (ret == 0)
++              sanitize_dead_code(env);
++
+       if (ret == 0)
+               /* program is valid, convert *(u32*)(ctx + off) accesses */
+               ret = convert_ctx_accesses(env);
+diff --git a/kernel/trace/trace_events_hist.c 
b/kernel/trace/trace_events_hist.c
+index f3a960ed75a1..0664044ade06 100644
+--- a/kernel/trace/trace_events_hist.c
++++ b/kernel/trace/trace_events_hist.c
+@@ -449,7 +449,7 @@ static int create_val_field(struct hist_trigger_data 
*hist_data,
+       }
+ 
+       field = trace_find_event_field(file->event_call, field_name);
+-      if (!field) {
++      if (!field || !field->size) {
+               ret = -EINVAL;
+               goto out;
+       }
+@@ -547,7 +547,7 @@ static int create_key_field(struct hist_trigger_data 
*hist_data,
+               }
+ 
+               field = trace_find_event_field(file->event_call, field_name);
+-              if (!field) {
++              if (!field || !field->size) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
+index 0df2aa652530..a7f05f0130e8 100644
+--- a/net/core/sysctl_net_core.c
++++ b/net/core/sysctl_net_core.c
+@@ -369,14 +369,16 @@ static struct ctl_table net_core_table[] = {
+               .data           = &sysctl_net_busy_poll,
+               .maxlen         = sizeof(unsigned int),
+               .mode           = 0644,
+-              .proc_handler   = proc_dointvec
++              .proc_handler   = proc_dointvec_minmax,
++              .extra1         = &zero,
+       },
+       {
+               .procname       = "busy_read",
+               .data           = &sysctl_net_busy_read,
+               .maxlen         = sizeof(unsigned int),
+               .mode           = 0644,
+-              .proc_handler   = proc_dointvec
++              .proc_handler   = proc_dointvec_minmax,
++              .extra1         = &zero,
+       },
+ #endif
+ #ifdef CONFIG_NET_SCHED
+diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
+index 453db950dc9f..4bf3b8af0257 100644
+--- a/net/ipv4/ip_fragment.c
++++ b/net/ipv4/ip_fragment.c
+@@ -198,6 +198,7 @@ static void ip_expire(unsigned long arg)
+       qp = container_of((struct inet_frag_queue *) arg, struct ipq, q);
+       net = container_of(qp->q.net, struct net, ipv4.frags);
+ 
++      rcu_read_lock();
+       spin_lock(&qp->q.lock);
+ 
+       if (qp->q.flags & INET_FRAG_COMPLETE)
+@@ -207,7 +208,7 @@ static void ip_expire(unsigned long arg)
+       __IP_INC_STATS(net, IPSTATS_MIB_REASMFAILS);
+ 
+       if (!inet_frag_evicting(&qp->q)) {
+-              struct sk_buff *head = qp->q.fragments;
++              struct sk_buff *clone, *head = qp->q.fragments;
+               const struct iphdr *iph;
+               int err;
+ 
+@@ -216,32 +217,40 @@ static void ip_expire(unsigned long arg)
+               if (!(qp->q.flags & INET_FRAG_FIRST_IN) || !qp->q.fragments)
+                       goto out;
+ 
+-              rcu_read_lock();
+               head->dev = dev_get_by_index_rcu(net, qp->iif);
+               if (!head->dev)
+-                      goto out_rcu_unlock;
++                      goto out;
++
+ 
+               /* skb has no dst, perform route lookup again */
+               iph = ip_hdr(head);
+               err = ip_route_input_noref(head, iph->daddr, iph->saddr,
+                                          iph->tos, head->dev);
+               if (err)
+-                      goto out_rcu_unlock;
++                      goto out;
+ 
+               /* Only an end host needs to send an ICMP
+                * "Fragment Reassembly Timeout" message, per RFC792.
+                */
+               if (frag_expire_skip_icmp(qp->user) &&
+                   (skb_rtable(head)->rt_type != RTN_LOCAL))
+-                      goto out_rcu_unlock;
++                      goto out;
++
++              clone = skb_clone(head, GFP_ATOMIC);
+ 
+               /* Send an ICMP "Fragment Reassembly Timeout" message. */
+-              icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);
+-out_rcu_unlock:
+-              rcu_read_unlock();
++              if (clone) {
++                      spin_unlock(&qp->q.lock);
++                      icmp_send(clone, ICMP_TIME_EXCEEDED,
++                                ICMP_EXC_FRAGTIME, 0);
++                      consume_skb(clone);
++                      goto out_rcu_unlock;
++              }
+       }
+ out:
+       spin_unlock(&qp->q.lock);
++out_rcu_unlock:
++      rcu_read_unlock();
+       ipq_put(qp);
+ }
+ 
+diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c
+index 071a785c65eb..b23464d9c538 100644
+--- a/net/ipv4/ipconfig.c
++++ b/net/ipv4/ipconfig.c
+@@ -306,7 +306,7 @@ static void __init ic_close_devs(void)
+       while ((d = next)) {
+               next = d->next;
+               dev = d->dev;
+-              if ((!ic_dev || dev != ic_dev->dev) && !netdev_uses_dsa(dev)) {
++              if (d != ic_dev && !netdev_uses_dsa(dev)) {
+                       pr_debug("IP-Config: Downing %s\n", dev->name);
+                       dev_change_flags(dev, d->flags);
+               }
+diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c 
b/net/ipv4/netfilter/nf_nat_snmp_basic.c
+index 5a8f7c360887..53e49f5011d3 100644
+--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
++++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
+@@ -1260,16 +1260,6 @@ static const struct nf_conntrack_expect_policy 
snmp_exp_policy = {
+       .timeout        = 180,
+ };
+ 
+-static struct nf_conntrack_helper snmp_helper __read_mostly = {
+-      .me                     = THIS_MODULE,
+-      .help                   = help,
+-      .expect_policy          = &snmp_exp_policy,
+-      .name                   = "snmp",
+-      .tuple.src.l3num        = AF_INET,
+-      .tuple.src.u.udp.port   = cpu_to_be16(SNMP_PORT),
+-      .tuple.dst.protonum     = IPPROTO_UDP,
+-};
+-
+ static struct nf_conntrack_helper snmp_trap_helper __read_mostly = {
+       .me                     = THIS_MODULE,
+       .help                   = help,
+@@ -1288,17 +1278,10 @@ static struct nf_conntrack_helper snmp_trap_helper 
__read_mostly = {
+ 
+ static int __init nf_nat_snmp_basic_init(void)
+ {
+-      int ret = 0;
+-
+       BUG_ON(nf_nat_snmp_hook != NULL);
+       RCU_INIT_POINTER(nf_nat_snmp_hook, help);
+ 
+-      ret = nf_conntrack_helper_register(&snmp_trap_helper);
+-      if (ret < 0) {
+-              nf_conntrack_helper_unregister(&snmp_helper);
+-              return ret;
+-      }
+-      return ret;
++      return nf_conntrack_helper_register(&snmp_trap_helper);
+ }
+ 
+ static void __exit nf_nat_snmp_basic_fini(void)
+diff --git a/net/ipv4/tcp_vegas.c b/net/ipv4/tcp_vegas.c
+index 4c4bac1b5eab..3ecb61ee42fb 100644
+--- a/net/ipv4/tcp_vegas.c
++++ b/net/ipv4/tcp_vegas.c
+@@ -158,7 +158,7 @@ EXPORT_SYMBOL_GPL(tcp_vegas_cwnd_event);
+ 
+ static inline u32 tcp_vegas_ssthresh(struct tcp_sock *tp)
+ {
+-      return  min(tp->snd_ssthresh, tp->snd_cwnd-1);
++      return  min(tp->snd_ssthresh, tp->snd_cwnd);
+ }
+ 
+ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 acked)
+diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
+index a4fb90c4819f..1594d9fc9c92 100644
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -286,10 +286,10 @@ static struct ipv6_devconf ipv6_devconf_dflt 
__read_mostly = {
+       .keep_addr_on_down      = 0,
+ };
+ 
+-/* Check if a valid qdisc is available */
+-static inline bool addrconf_qdisc_ok(const struct net_device *dev)
++/* Check if link is ready: is it up and is a valid qdisc available */
++static inline bool addrconf_link_ready(const struct net_device *dev)
+ {
+-      return !qdisc_tx_is_noop(dev);
++      return netif_oper_up(dev) && !qdisc_tx_is_noop(dev);
+ }
+ 
+ static void addrconf_del_rs_timer(struct inet6_dev *idev)
+@@ -434,7 +434,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device 
*dev)
+ 
+       ndev->token = in6addr_any;
+ 
+-      if (netif_running(dev) && addrconf_qdisc_ok(dev))
++      if (netif_running(dev) && addrconf_link_ready(dev))
+               ndev->if_flags |= IF_READY;
+ 
+       ipv6_mc_init_dev(ndev);
+@@ -3368,7 +3368,7 @@ static int addrconf_notify(struct notifier_block *this, 
unsigned long event,
+                       /* restore routes for permanent addresses */
+                       addrconf_permanent_addr(dev);
+ 
+-                      if (!addrconf_qdisc_ok(dev)) {
++                      if (!addrconf_link_ready(dev)) {
+                               /* device is not ready yet. */
+                               pr_info("ADDRCONF(NETDEV_UP): %s: link is not 
ready\n",
+                                       dev->name);
+@@ -3383,7 +3383,7 @@ static int addrconf_notify(struct notifier_block *this, 
unsigned long event,
+                               run_pending = 1;
+                       }
+               } else if (event == NETDEV_CHANGE) {
+-                      if (!addrconf_qdisc_ok(dev)) {
++                      if (!addrconf_link_ready(dev)) {
+                               /* device is still not ready. */
+                               break;
+                       }
+diff --git a/net/netfilter/nfnetlink_cthelper.c 
b/net/netfilter/nfnetlink_cthelper.c
+index b1fcfa08f0b4..28d065394c09 100644
+--- a/net/netfilter/nfnetlink_cthelper.c
++++ b/net/netfilter/nfnetlink_cthelper.c
+@@ -32,6 +32,13 @@ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Pablo Neira Ayuso <pa...@netfilter.org>");
+ MODULE_DESCRIPTION("nfnl_cthelper: User-space connection tracking helpers");
+ 
++struct nfnl_cthelper {
++      struct list_head                list;
++      struct nf_conntrack_helper      helper;
++};
++
++static LIST_HEAD(nfnl_cthelper_list);
++
+ static int
+ nfnl_userspace_cthelper(struct sk_buff *skb, unsigned int protoff,
+                       struct nf_conn *ct, enum ip_conntrack_info ctinfo)
+@@ -205,18 +212,20 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
+                    struct nf_conntrack_tuple *tuple)
+ {
+       struct nf_conntrack_helper *helper;
++      struct nfnl_cthelper *nfcth;
+       int ret;
+ 
+       if (!tb[NFCTH_TUPLE] || !tb[NFCTH_POLICY] || !tb[NFCTH_PRIV_DATA_LEN])
+               return -EINVAL;
+ 
+-      helper = kzalloc(sizeof(struct nf_conntrack_helper), GFP_KERNEL);
+-      if (helper == NULL)
++      nfcth = kzalloc(sizeof(*nfcth), GFP_KERNEL);
++      if (nfcth == NULL)
+               return -ENOMEM;
++      helper = &nfcth->helper;
+ 
+       ret = nfnl_cthelper_parse_expect_policy(helper, tb[NFCTH_POLICY]);
+       if (ret < 0)
+-              goto err;
++              goto err1;
+ 
+       strncpy(helper->name, nla_data(tb[NFCTH_NAME]), NF_CT_HELPER_NAME_LEN);
+       helper->data_len = ntohl(nla_get_be32(tb[NFCTH_PRIV_DATA_LEN]));
+@@ -247,14 +256,100 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
+ 
+       ret = nf_conntrack_helper_register(helper);
+       if (ret < 0)
+-              goto err;
++              goto err2;
+ 
++      list_add_tail(&nfcth->list, &nfnl_cthelper_list);
+       return 0;
+-err:
+-      kfree(helper);
++err2:
++      kfree(helper->expect_policy);
++err1:
++      kfree(nfcth);
+       return ret;
+ }
+ 
++static int
++nfnl_cthelper_update_policy_one(const struct nf_conntrack_expect_policy 
*policy,
++                              struct nf_conntrack_expect_policy *new_policy,
++                              const struct nlattr *attr)
++{
++      struct nlattr *tb[NFCTH_POLICY_MAX + 1];
++      int err;
++
++      err = nla_parse_nested(tb, NFCTH_POLICY_MAX, attr,
++                             nfnl_cthelper_expect_pol);
++      if (err < 0)
++              return err;
++
++      if (!tb[NFCTH_POLICY_NAME] ||
++          !tb[NFCTH_POLICY_EXPECT_MAX] ||
++          !tb[NFCTH_POLICY_EXPECT_TIMEOUT])
++              return -EINVAL;
++
++      if (nla_strcmp(tb[NFCTH_POLICY_NAME], policy->name))
++              return -EBUSY;
++
++      new_policy->max_expected =
++              ntohl(nla_get_be32(tb[NFCTH_POLICY_EXPECT_MAX]));
++      new_policy->timeout =
++              ntohl(nla_get_be32(tb[NFCTH_POLICY_EXPECT_TIMEOUT]));
++
++      return 0;
++}
++
++static int nfnl_cthelper_update_policy_all(struct nlattr *tb[],
++                                         struct nf_conntrack_helper *helper)
++{
++      struct nf_conntrack_expect_policy new_policy[helper->expect_class_max + 
1];
++      struct nf_conntrack_expect_policy *policy;
++      int i, err;
++
++      /* Check first that all policy attributes are well-formed, so we don't
++       * leave things in inconsistent state on errors.
++       */
++      for (i = 0; i < helper->expect_class_max + 1; i++) {
++
++              if (!tb[NFCTH_POLICY_SET + i])
++                      return -EINVAL;
++
++              err = nfnl_cthelper_update_policy_one(&helper->expect_policy[i],
++                                                    &new_policy[i],
++                                                    tb[NFCTH_POLICY_SET + i]);
++              if (err < 0)
++                      return err;
++      }
++      /* Now we can safely update them. */
++      for (i = 0; i < helper->expect_class_max + 1; i++) {
++              policy = (struct nf_conntrack_expect_policy *)
++                              &helper->expect_policy[i];
++              policy->max_expected = new_policy->max_expected;
++              policy->timeout = new_policy->timeout;
++      }
++
++      return 0;
++}
++
++static int nfnl_cthelper_update_policy(struct nf_conntrack_helper *helper,
++                                     const struct nlattr *attr)
++{
++      struct nlattr *tb[NFCTH_POLICY_SET_MAX + 1];
++      unsigned int class_max;
++      int err;
++
++      err = nla_parse_nested(tb, NFCTH_POLICY_SET_MAX, attr,
++                             nfnl_cthelper_expect_policy_set);
++      if (err < 0)
++              return err;
++
++      if (!tb[NFCTH_POLICY_SET_NUM])
++              return -EINVAL;
++
++      class_max = ntohl(nla_get_be32(tb[NFCTH_POLICY_SET_NUM]));
++      if (helper->expect_class_max + 1 != class_max)
++              return -EBUSY;
++
++      return nfnl_cthelper_update_policy_all(tb, helper);
++}
++
+ static int
+ nfnl_cthelper_update(const struct nlattr * const tb[],
+                    struct nf_conntrack_helper *helper)
+@@ -265,8 +360,7 @@ nfnl_cthelper_update(const struct nlattr * const tb[],
+               return -EBUSY;
+ 
+       if (tb[NFCTH_POLICY]) {
+-              ret = nfnl_cthelper_parse_expect_policy(helper,
+-                                                      tb[NFCTH_POLICY]);
++              ret = nfnl_cthelper_update_policy(helper, tb[NFCTH_POLICY]);
+               if (ret < 0)
+                       return ret;
+       }
+@@ -295,7 +389,8 @@ static int nfnl_cthelper_new(struct net *net, struct sock 
*nfnl,
+       const char *helper_name;
+       struct nf_conntrack_helper *cur, *helper = NULL;
+       struct nf_conntrack_tuple tuple;
+-      int ret = 0, i;
++      struct nfnl_cthelper *nlcth;
++      int ret = 0;
+ 
+       if (!tb[NFCTH_NAME] || !tb[NFCTH_TUPLE])
+               return -EINVAL;
+@@ -306,31 +401,22 @@ static int nfnl_cthelper_new(struct net *net, struct 
sock *nfnl,
+       if (ret < 0)
+               return ret;
+ 
+-      rcu_read_lock();
+-      for (i = 0; i < nf_ct_helper_hsize && !helper; i++) {
+-              hlist_for_each_entry_rcu(cur, &nf_ct_helper_hash[i], hnode) {
++      list_for_each_entry(nlcth, &nfnl_cthelper_list, list) {
++              cur = &nlcth->helper;
+ 
+-                      /* skip non-userspace conntrack helpers. */
+-                      if (!(cur->flags & NF_CT_HELPER_F_USERSPACE))
+-                              continue;
++              if (strncmp(cur->name, helper_name, NF_CT_HELPER_NAME_LEN))
++                      continue;
+ 
+-                      if (strncmp(cur->name, helper_name,
+-                                      NF_CT_HELPER_NAME_LEN) != 0)
+-                              continue;
++              if ((tuple.src.l3num != cur->tuple.src.l3num ||
++                   tuple.dst.protonum != cur->tuple.dst.protonum))
++                      continue;
+ 
+-                      if ((tuple.src.l3num != cur->tuple.src.l3num ||
+-                           tuple.dst.protonum != cur->tuple.dst.protonum))
+-                              continue;
++              if (nlh->nlmsg_flags & NLM_F_EXCL)
++                      return -EEXIST;
+ 
+-                      if (nlh->nlmsg_flags & NLM_F_EXCL) {
+-                              ret = -EEXIST;
+-                              goto err;
+-                      }
+-                      helper = cur;
+-                      break;
+-              }
++              helper = cur;
++              break;
+       }
+-      rcu_read_unlock();
+ 
+       if (helper == NULL)
+               ret = nfnl_cthelper_create(tb, &tuple);
+@@ -338,9 +424,6 @@ static int nfnl_cthelper_new(struct net *net, struct sock 
*nfnl,
+               ret = nfnl_cthelper_update(tb, helper);
+ 
+       return ret;
+-err:
+-      rcu_read_unlock();
+-      return ret;
+ }
+ 
+ static int
+@@ -504,11 +587,12 @@ static int nfnl_cthelper_get(struct net *net, struct 
sock *nfnl,
+                            struct sk_buff *skb, const struct nlmsghdr *nlh,
+                            const struct nlattr * const tb[])
+ {
+-      int ret = -ENOENT, i;
++      int ret = -ENOENT;
+       struct nf_conntrack_helper *cur;
+       struct sk_buff *skb2;
+       char *helper_name = NULL;
+       struct nf_conntrack_tuple tuple;
++      struct nfnl_cthelper *nlcth;
+       bool tuple_set = false;
+ 
+       if (nlh->nlmsg_flags & NLM_F_DUMP) {
+@@ -529,45 +613,39 @@ static int nfnl_cthelper_get(struct net *net, struct 
sock *nfnl,
+               tuple_set = true;
+       }
+ 
+-      for (i = 0; i < nf_ct_helper_hsize; i++) {
+-              hlist_for_each_entry_rcu(cur, &nf_ct_helper_hash[i], hnode) {
++      list_for_each_entry(nlcth, &nfnl_cthelper_list, list) {
++              cur = &nlcth->helper;
++              if (helper_name &&
++                  strncmp(cur->name, helper_name, NF_CT_HELPER_NAME_LEN))
++                      continue;
+ 
+-                      /* skip non-userspace conntrack helpers. */
+-                      if (!(cur->flags & NF_CT_HELPER_F_USERSPACE))
+-                              continue;
++              if (tuple_set &&
++                  (tuple.src.l3num != cur->tuple.src.l3num ||
++                   tuple.dst.protonum != cur->tuple.dst.protonum))
++                      continue;
+ 
+-                      if (helper_name && strncmp(cur->name, helper_name,
+-                                              NF_CT_HELPER_NAME_LEN) != 0) {
+-                              continue;
+-                      }
+-                      if (tuple_set &&
+-                          (tuple.src.l3num != cur->tuple.src.l3num ||
+-                           tuple.dst.protonum != cur->tuple.dst.protonum))
+-                              continue;
+-
+-                      skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+-                      if (skb2 == NULL) {
+-                              ret = -ENOMEM;
+-                              break;
+-                      }
++              skb2 = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
++              if (skb2 == NULL) {
++                      ret = -ENOMEM;
++                      break;
++              }
+ 
+-                      ret = nfnl_cthelper_fill_info(skb2, 
NETLINK_CB(skb).portid,
+-                                              nlh->nlmsg_seq,
+-                                              NFNL_MSG_TYPE(nlh->nlmsg_type),
+-                                              NFNL_MSG_CTHELPER_NEW, cur);
+-                      if (ret <= 0) {
+-                              kfree_skb(skb2);
+-                              break;
+-                      }
++              ret = nfnl_cthelper_fill_info(skb2, NETLINK_CB(skb).portid,
++                                            nlh->nlmsg_seq,
++                                            NFNL_MSG_TYPE(nlh->nlmsg_type),
++                                            NFNL_MSG_CTHELPER_NEW, cur);
++              if (ret <= 0) {
++                      kfree_skb(skb2);
++                      break;
++              }
+ 
+-                      ret = netlink_unicast(nfnl, skb2, 
NETLINK_CB(skb).portid,
+-                                              MSG_DONTWAIT);
+-                      if (ret > 0)
+-                              ret = 0;
++              ret = netlink_unicast(nfnl, skb2, NETLINK_CB(skb).portid,
++                                    MSG_DONTWAIT);
++              if (ret > 0)
++                      ret = 0;
+ 
+-                      /* this avoids a loop in nfnetlink. */
+-                      return ret == -EAGAIN ? -ENOBUFS : ret;
+-              }
++              /* this avoids a loop in nfnetlink. */
++              return ret == -EAGAIN ? -ENOBUFS : ret;
+       }
+       return ret;
+ }
+@@ -578,10 +656,10 @@ static int nfnl_cthelper_del(struct net *net, struct 
sock *nfnl,
+ {
+       char *helper_name = NULL;
+       struct nf_conntrack_helper *cur;
+-      struct hlist_node *tmp;
+       struct nf_conntrack_tuple tuple;
+       bool tuple_set = false, found = false;
+-      int i, j = 0, ret;
++      struct nfnl_cthelper *nlcth, *n;
++      int j = 0, ret;
+ 
+       if (tb[NFCTH_NAME])
+               helper_name = nla_data(tb[NFCTH_NAME]);
+@@ -594,28 +672,27 @@ static int nfnl_cthelper_del(struct net *net, struct 
sock *nfnl,
+               tuple_set = true;
+       }
+ 
+-      for (i = 0; i < nf_ct_helper_hsize; i++) {
+-              hlist_for_each_entry_safe(cur, tmp, &nf_ct_helper_hash[i],
+-                                                              hnode) {
+-                      /* skip non-userspace conntrack helpers. */
+-                      if (!(cur->flags & NF_CT_HELPER_F_USERSPACE))
+-                              continue;
++      list_for_each_entry_safe(nlcth, n, &nfnl_cthelper_list, list) {
++              cur = &nlcth->helper;
++              j++;
+ 
+-                      j++;
++              if (helper_name &&
++                  strncmp(cur->name, helper_name, NF_CT_HELPER_NAME_LEN))
++                      continue;
+ 
+-                      if (helper_name && strncmp(cur->name, helper_name,
+-                                              NF_CT_HELPER_NAME_LEN) != 0) {
+-                              continue;
+-                      }
+-                      if (tuple_set &&
+-                          (tuple.src.l3num != cur->tuple.src.l3num ||
+-                           tuple.dst.protonum != cur->tuple.dst.protonum))
+-                              continue;
++              if (tuple_set &&
++                  (tuple.src.l3num != cur->tuple.src.l3num ||
++                   tuple.dst.protonum != cur->tuple.dst.protonum))
++                      continue;
+ 
+-                      found = true;
+-                      nf_conntrack_helper_unregister(cur);
+-              }
++              found = true;
++              nf_conntrack_helper_unregister(cur);
++              kfree(cur->expect_policy);
++
++              list_del(&nlcth->list);
++              kfree(nlcth);
+       }
++
+       /* Make sure we return success if we flush and there is no helpers */
+       return (found || j == 0) ? 0 : -ENOENT;
+ }
+@@ -664,20 +741,16 @@ static int __init nfnl_cthelper_init(void)
+ static void __exit nfnl_cthelper_exit(void)
+ {
+       struct nf_conntrack_helper *cur;
+-      struct hlist_node *tmp;
+-      int i;
++      struct nfnl_cthelper *nlcth, *n;
+ 
+       nfnetlink_subsys_unregister(&nfnl_cthelper_subsys);
+ 
+-      for (i=0; i<nf_ct_helper_hsize; i++) {
+-              hlist_for_each_entry_safe(cur, tmp, &nf_ct_helper_hash[i],
+-                                                                      hnode) {
+-                      /* skip non-userspace conntrack helpers. */
+-                      if (!(cur->flags & NF_CT_HELPER_F_USERSPACE))
+-                              continue;
++      list_for_each_entry_safe(nlcth, n, &nfnl_cthelper_list, list) {
++              cur = &nlcth->helper;
+ 
+-                      nf_conntrack_helper_unregister(cur);
+-              }
++              nf_conntrack_helper_unregister(cur);
++              kfree(cur->expect_policy);
++              kfree(nlcth);
+       }
+ }
+ 
+diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c
+index af832c526048..5efb40291ac3 100644
+--- a/net/netfilter/nfnetlink_queue.c
++++ b/net/netfilter/nfnetlink_queue.c
+@@ -443,7 +443,7 @@ nfqnl_build_packet_message(struct net *net, struct 
nfqnl_instance *queue,
+       skb = alloc_skb(size, GFP_ATOMIC);
+       if (!skb) {
+               skb_tx_error(entskb);
+-              return NULL;
++              goto nlmsg_failure;
+       }
+ 
+       nlh = nlmsg_put(skb, 0, 0,
+@@ -452,7 +452,7 @@ nfqnl_build_packet_message(struct net *net, struct 
nfqnl_instance *queue,
+       if (!nlh) {
+               skb_tx_error(entskb);
+               kfree_skb(skb);
+-              return NULL;
++              goto nlmsg_failure;
+       }
+       nfmsg = nlmsg_data(nlh);
+       nfmsg->nfgen_family = entry->state.pf;
+@@ -598,12 +598,17 @@ nfqnl_build_packet_message(struct net *net, struct 
nfqnl_instance *queue,
+       }
+ 
+       nlh->nlmsg_len = skb->len;
++      if (seclen)
++              security_release_secctx(secdata, seclen);
+       return skb;
+ 
+ nla_put_failure:
+       skb_tx_error(entskb);
+       kfree_skb(skb);
+       net_err_ratelimited("nf_queue: error creating packet message\n");
++nlmsg_failure:
++      if (seclen)
++              security_release_secctx(secdata, seclen);
+       return NULL;
+ }
+ 
+diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
+index c9fac08a53b1..1ff497bd9c20 100644
+--- a/net/netlink/af_netlink.c
++++ b/net/netlink/af_netlink.c
+@@ -96,6 +96,44 @@ EXPORT_SYMBOL_GPL(nl_table);
+ 
+ static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait);
+ 
++static struct lock_class_key nlk_cb_mutex_keys[MAX_LINKS];
++
++static const char *const nlk_cb_mutex_key_strings[MAX_LINKS + 1] = {
++      "nlk_cb_mutex-ROUTE",
++      "nlk_cb_mutex-1",
++      "nlk_cb_mutex-USERSOCK",
++      "nlk_cb_mutex-FIREWALL",
++      "nlk_cb_mutex-SOCK_DIAG",
++      "nlk_cb_mutex-NFLOG",
++      "nlk_cb_mutex-XFRM",
++      "nlk_cb_mutex-SELINUX",
++      "nlk_cb_mutex-ISCSI",
++      "nlk_cb_mutex-AUDIT",
++      "nlk_cb_mutex-FIB_LOOKUP",
++      "nlk_cb_mutex-CONNECTOR",
++      "nlk_cb_mutex-NETFILTER",
++      "nlk_cb_mutex-IP6_FW",
++      "nlk_cb_mutex-DNRTMSG",
++      "nlk_cb_mutex-KOBJECT_UEVENT",
++      "nlk_cb_mutex-GENERIC",
++      "nlk_cb_mutex-17",
++      "nlk_cb_mutex-SCSITRANSPORT",
++      "nlk_cb_mutex-ECRYPTFS",
++      "nlk_cb_mutex-RDMA",
++      "nlk_cb_mutex-CRYPTO",
++      "nlk_cb_mutex-SMC",
++      "nlk_cb_mutex-23",
++      "nlk_cb_mutex-24",
++      "nlk_cb_mutex-25",
++      "nlk_cb_mutex-26",
++      "nlk_cb_mutex-27",
++      "nlk_cb_mutex-28",
++      "nlk_cb_mutex-29",
++      "nlk_cb_mutex-30",
++      "nlk_cb_mutex-31",
++      "nlk_cb_mutex-MAX_LINKS"
++};
++
+ static int netlink_dump(struct sock *sk);
+ static void netlink_skb_destructor(struct sk_buff *skb);
+ 
+@@ -585,6 +623,9 @@ static int __netlink_create(struct net *net, struct socket 
*sock,
+       } else {
+               nlk->cb_mutex = &nlk->cb_def_mutex;
+               mutex_init(nlk->cb_mutex);
++              lockdep_set_class_and_name(nlk->cb_mutex,
++                                         nlk_cb_mutex_keys + protocol,
++                                         nlk_cb_mutex_key_strings[protocol]);
+       }
+       init_waitqueue_head(&nlk->wait);
+ 
+diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c
+index 1308bbf460f7..b56d57984439 100644
+--- a/net/sched/sch_dsmark.c
++++ b/net/sched/sch_dsmark.c
+@@ -200,9 +200,13 @@ static int dsmark_enqueue(struct sk_buff *skb, struct 
Qdisc *sch,
+       pr_debug("%s(skb %p,sch %p,[qdisc %p])\n", __func__, skb, sch, p);
+ 
+       if (p->set_tc_index) {
++              int wlen = skb_network_offset(skb);
++
+               switch (tc_skb_protocol(skb)) {
+               case htons(ETH_P_IP):
+-                      if (skb_cow_head(skb, sizeof(struct iphdr)))
++                      wlen += sizeof(struct iphdr);
++                      if (!pskb_may_pull(skb, wlen) ||
++                          skb_try_make_writable(skb, wlen))
+                               goto drop;
+ 
+                       skb->tc_index = ipv4_get_dsfield(ip_hdr(skb))
+@@ -210,7 +214,9 @@ static int dsmark_enqueue(struct sk_buff *skb, struct 
Qdisc *sch,
+                       break;
+ 
+               case htons(ETH_P_IPV6):
+-                      if (skb_cow_head(skb, sizeof(struct ipv6hdr)))
++                      wlen += sizeof(struct ipv6hdr);
++                      if (!pskb_may_pull(skb, wlen) ||
++                          skb_try_make_writable(skb, wlen))
+                               goto drop;
+ 
+                       skb->tc_index = ipv6_get_dsfield(ipv6_hdr(skb))
+diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
+index 582585393d35..0994ce491e7c 100644
+--- a/net/sctp/outqueue.c
++++ b/net/sctp/outqueue.c
+@@ -382,17 +382,18 @@ static int sctp_prsctp_prune_sent(struct 
sctp_association *asoc,
+ }
+ 
+ static int sctp_prsctp_prune_unsent(struct sctp_association *asoc,
+-                                  struct sctp_sndrcvinfo *sinfo,
+-                                  struct list_head *queue, int msg_len)
++                                  struct sctp_sndrcvinfo *sinfo, int msg_len)
+ {
++      struct sctp_outq *q = &asoc->outqueue;
+       struct sctp_chunk *chk, *temp;
+ 
+-      list_for_each_entry_safe(chk, temp, queue, list) {
++      list_for_each_entry_safe(chk, temp, &q->out_chunk_list, list) {
+               if (!SCTP_PR_PRIO_ENABLED(chk->sinfo.sinfo_flags) ||
+                   chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive)
+                       continue;
+ 
+               list_del_init(&chk->list);
++              q->out_qlen -= chk->skb->len;
+               asoc->sent_cnt_removable--;
+               asoc->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++;
+ 
+@@ -431,9 +432,7 @@ void sctp_prsctp_prune(struct sctp_association *asoc,
+                       return;
+       }
+ 
+-      sctp_prsctp_prune_unsent(asoc, sinfo,
+-                               &asoc->outqueue.out_chunk_list,
+-                               msg_len);
++      sctp_prsctp_prune_unsent(asoc, sinfo, msg_len);
+ }
+ 
+ /* Mark all the eligible packets on a transport for retransmission.  */
+diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
+index 9d94e65d0894..271cd66e4b3b 100644
+--- a/net/tipc/subscr.c
++++ b/net/tipc/subscr.c
+@@ -141,6 +141,11 @@ void tipc_subscrp_report_overlap(struct tipc_subscription 
*sub, u32 found_lower,
+ static void tipc_subscrp_timeout(unsigned long data)
+ {
+       struct tipc_subscription *sub = (struct tipc_subscription *)data;
++      struct tipc_subscriber *subscriber = sub->subscriber;
++
++      spin_lock_bh(&subscriber->lock);
++      tipc_nametbl_unsubscribe(sub);
++      spin_unlock_bh(&subscriber->lock);
+ 
+       /* Notify subscriber of timeout */
+       tipc_subscrp_send_event(sub, sub->evt.s.seq.lower, sub->evt.s.seq.upper,
+@@ -173,7 +178,6 @@ static void tipc_subscrp_kref_release(struct kref *kref)
+       struct tipc_subscriber *subscriber = sub->subscriber;
+ 
+       spin_lock_bh(&subscriber->lock);
+-      tipc_nametbl_unsubscribe(sub);
+       list_del(&sub->subscrp_list);
+       atomic_dec(&tn->subscription_count);
+       spin_unlock_bh(&subscriber->lock);
+@@ -205,6 +209,7 @@ static void tipc_subscrb_subscrp_delete(struct 
tipc_subscriber *subscriber,
+               if (s && memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr)))
+                       continue;
+ 
++              tipc_nametbl_unsubscribe(sub);
+               tipc_subscrp_get(sub);
+               spin_unlock_bh(&subscriber->lock);
+               tipc_subscrp_delete(sub);
+diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
+index 2f633eec6b7a..ee12e176256c 100644
+--- a/net/vmw_vsock/af_vsock.c
++++ b/net/vmw_vsock/af_vsock.c
+@@ -1101,10 +1101,19 @@ static const struct proto_ops vsock_dgram_ops = {
+       .sendpage = sock_no_sendpage,
+ };
+ 
++static int vsock_transport_cancel_pkt(struct vsock_sock *vsk)
++{
++      if (!transport->cancel_pkt)
++              return -EOPNOTSUPP;
++
++      return transport->cancel_pkt(vsk);
++}
++
+ static void vsock_connect_timeout(struct work_struct *work)
+ {
+       struct sock *sk;
+       struct vsock_sock *vsk;
++      int cancel = 0;
+ 
+       vsk = container_of(work, struct vsock_sock, dwork.work);
+       sk = sk_vsock(vsk);
+@@ -1115,8 +1124,11 @@ static void vsock_connect_timeout(struct work_struct 
*work)
+               sk->sk_state = SS_UNCONNECTED;
+               sk->sk_err = ETIMEDOUT;
+               sk->sk_error_report(sk);
++              cancel = 1;
+       }
+       release_sock(sk);
++      if (cancel)
++              vsock_transport_cancel_pkt(vsk);
+ 
+       sock_put(sk);
+ }
+@@ -1223,11 +1235,13 @@ static int vsock_stream_connect(struct socket *sock, 
struct sockaddr *addr,
+                       err = sock_intr_errno(timeout);
+                       sk->sk_state = SS_UNCONNECTED;
+                       sock->state = SS_UNCONNECTED;
++                      vsock_transport_cancel_pkt(vsk);
+                       goto out_wait;
+               } else if (timeout == 0) {
+                       err = -ETIMEDOUT;
+                       sk->sk_state = SS_UNCONNECTED;
+                       sock->state = SS_UNCONNECTED;
++                      vsock_transport_cancel_pkt(vsk);
+                       goto out_wait;
+               }
+ 
+diff --git a/net/vmw_vsock/virtio_transport_common.c 
b/net/vmw_vsock/virtio_transport_common.c
+index 62c056ea403b..9c07c76c504d 100644
+--- a/net/vmw_vsock/virtio_transport_common.c
++++ b/net/vmw_vsock/virtio_transport_common.c
+@@ -57,6 +57,7 @@ virtio_transport_alloc_pkt(struct virtio_vsock_pkt_info 
*info,
+       pkt->len                = len;
+       pkt->hdr.len            = cpu_to_le32(len);
+       pkt->reply              = info->reply;
++      pkt->vsk                = info->vsk;
+ 
+       if (info->msg && len > 0) {
+               pkt->buf = kmalloc(len, GFP_KERNEL);
+@@ -180,6 +181,7 @@ static int virtio_transport_send_credit_update(struct 
vsock_sock *vsk,
+       struct virtio_vsock_pkt_info info = {
+               .op = VIRTIO_VSOCK_OP_CREDIT_UPDATE,
+               .type = type,
++              .vsk = vsk,
+       };
+ 
+       return virtio_transport_send_pkt_info(vsk, &info);
+@@ -519,6 +521,7 @@ int virtio_transport_connect(struct vsock_sock *vsk)
+       struct virtio_vsock_pkt_info info = {
+               .op = VIRTIO_VSOCK_OP_REQUEST,
+               .type = VIRTIO_VSOCK_TYPE_STREAM,
++              .vsk = vsk,
+       };
+ 
+       return virtio_transport_send_pkt_info(vsk, &info);
+@@ -534,6 +537,7 @@ int virtio_transport_shutdown(struct vsock_sock *vsk, int 
mode)
+                         VIRTIO_VSOCK_SHUTDOWN_RCV : 0) |
+                        (mode & SEND_SHUTDOWN ?
+                         VIRTIO_VSOCK_SHUTDOWN_SEND : 0),
++              .vsk = vsk,
+       };
+ 
+       return virtio_transport_send_pkt_info(vsk, &info);
+@@ -560,6 +564,7 @@ virtio_transport_stream_enqueue(struct vsock_sock *vsk,
+               .type = VIRTIO_VSOCK_TYPE_STREAM,
+               .msg = msg,
+               .pkt_len = len,
++              .vsk = vsk,
+       };
+ 
+       return virtio_transport_send_pkt_info(vsk, &info);
+@@ -581,6 +586,7 @@ static int virtio_transport_reset(struct vsock_sock *vsk,
+               .op = VIRTIO_VSOCK_OP_RST,
+               .type = VIRTIO_VSOCK_TYPE_STREAM,
+               .reply = !!pkt,
++              .vsk = vsk,
+       };
+ 
+       /* Send RST only if the original pkt is not a RST pkt */
+@@ -826,6 +832,7 @@ virtio_transport_send_response(struct vsock_sock *vsk,
+               .remote_cid = le64_to_cpu(pkt->hdr.src_cid),
+               .remote_port = le32_to_cpu(pkt->hdr.src_port),
+               .reply = true,
++              .vsk = vsk,
+       };
+ 
+       return virtio_transport_send_pkt_info(vsk, &info);
+diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
+index f2e4e99ce651..2c3065c1f3fb 100644
+--- a/sound/pci/hda/patch_conexant.c
++++ b/sound/pci/hda/patch_conexant.c
+@@ -261,6 +261,7 @@ enum {
+       CXT_FIXUP_HP_530,
+       CXT_FIXUP_CAP_MIX_AMP_5047,
+       CXT_FIXUP_MUTE_LED_EAPD,
++      CXT_FIXUP_HP_DOCK,
+       CXT_FIXUP_HP_SPECTRE,
+       CXT_FIXUP_HP_GATE_MIC,
+ };
+@@ -778,6 +779,14 @@ static const struct hda_fixup cxt_fixups[] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = cxt_fixup_mute_led_eapd,
+       },
++      [CXT_FIXUP_HP_DOCK] = {
++              .type = HDA_FIXUP_PINS,
++              .v.pins = (const struct hda_pintbl[]) {
++                      { 0x16, 0x21011020 }, /* line-out */
++                      { 0x18, 0x2181103f }, /* line-in */
++                      { }
++              }
++      },
+       [CXT_FIXUP_HP_SPECTRE] = {
+               .type = HDA_FIXUP_PINS,
+               .v.pins = (const struct hda_pintbl[]) {
+@@ -839,6 +848,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
+       SND_PCI_QUIRK(0x1025, 0x0543, "Acer Aspire One 522", 
CXT_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", 
CXT_FIXUP_ASPIRE_DMIC),
+       SND_PCI_QUIRK(0x1025, 0x054f, "Acer Aspire 4830T", 
CXT_FIXUP_ASPIRE_DMIC),
++      SND_PCI_QUIRK(0x103c, 0x8079, "HP EliteBook 840 G3", CXT_FIXUP_HP_DOCK),
+       SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
+       SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC),
+       SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
+@@ -872,6 +882,7 @@ static const struct hda_model_fixup cxt5066_fixup_models[] 
= {
+       { .id = CXT_PINCFG_LEMOTE_A1205, .name = "lemote-a1205" },
+       { .id = CXT_FIXUP_OLPC_XO, .name = "olpc-xo" },
+       { .id = CXT_FIXUP_MUTE_LED_EAPD, .name = "mute-led-eapd" },
++      { .id = CXT_FIXUP_HP_DOCK, .name = "hp-dock" },
+       {}
+ };
+ 
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index d7fa7373cb94..ba40596b9d92 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -4854,6 +4854,7 @@ enum {
+       ALC286_FIXUP_HP_GPIO_LED,
+       ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
+       ALC280_FIXUP_HP_DOCK_PINS,
++      ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
+       ALC280_FIXUP_HP_9480M,
+       ALC288_FIXUP_DELL_HEADSET_MODE,
+       ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
+@@ -5394,6 +5395,16 @@ static const struct hda_fixup alc269_fixups[] = {
+               .chained = true,
+               .chain_id = ALC280_FIXUP_HP_GPIO4
+       },
++      [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
++              .type = HDA_FIXUP_PINS,
++              .v.pins = (const struct hda_pintbl[]) {
++                      { 0x1b, 0x21011020 }, /* line-out */
++                      { 0x18, 0x2181103f }, /* line-in */
++                      { },
++              },
++              .chained = true,
++              .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
++      },
+       [ALC280_FIXUP_HP_9480M] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc280_fixup_hp_9480m,
+@@ -5646,7 +5657,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+       SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+       SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+-      SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
++      SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
+       SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+       SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+       SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+@@ -5812,6 +5823,7 @@ static const struct hda_model_fixup 
alc269_fixup_models[] = {
+       {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = 
"headset-mode-no-hp-mic"},
+       {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
+       {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
++      {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = 
"hp-dock-gpio-mic1-led"},
+       {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = 
"dell-headset-multi"},
+       {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
+       {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
+diff --git a/sound/soc/img/img-parallel-out.c 
b/sound/soc/img/img-parallel-out.c
+index c1610a054d65..3cf522d66755 100644
+--- a/sound/soc/img/img-parallel-out.c
++++ b/sound/soc/img/img-parallel-out.c
+@@ -166,9 +166,11 @@ static int img_prl_out_set_fmt(struct snd_soc_dai *dai, 
unsigned int fmt)
+               return -EINVAL;
+       }
+ 
++      pm_runtime_get_sync(prl->dev);
+       reg = img_prl_out_readl(prl, IMG_PRL_OUT_CTL);
+       reg = (reg & ~IMG_PRL_OUT_CTL_EDGE_MASK) | control_set;
+       img_prl_out_writel(prl, reg, IMG_PRL_OUT_CTL);
++      pm_runtime_put(prl->dev);
+ 
+       return 0;
+ }
+diff --git a/sound/soc/sti/uniperif_reader.c b/sound/soc/sti/uniperif_reader.c
+index 0e1c3ee56675..9735b4caaed3 100644
+--- a/sound/soc/sti/uniperif_reader.c
++++ b/sound/soc/sti/uniperif_reader.c
+@@ -364,6 +364,8 @@ static int uni_reader_startup(struct snd_pcm_substream 
*substream,
+       struct uniperif *reader = priv->dai_data.uni;
+       int ret;
+ 
++      reader->substream = substream;
++
+       if (!UNIPERIF_TYPE_IS_TDM(reader))
+               return 0;
+ 
+@@ -393,6 +395,7 @@ static void uni_reader_shutdown(struct snd_pcm_substream 
*substream,
+               /* Stop the reader */
+               uni_reader_stop(reader);
+       }
++      reader->substream = NULL;
+ }
+ 
+ static const struct snd_soc_dai_ops uni_reader_dai_ops = {
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 4569fdcab701..1b20768e781d 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -1060,7 +1060,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
+        * changes) is disallowed above, so any other attribute changes getting
+        * here can be skipped.
+        */
+-      if ((change == KVM_MR_CREATE) || (change == KVM_MR_MOVE)) {
++      if (as_id == 0 && (change == KVM_MR_CREATE || change == KVM_MR_MOVE)) {
+               r = kvm_iommu_map_pages(kvm, &new);
+               return r;
+       }
+@@ -3904,7 +3904,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned 
vcpu_align,
+       if (!vcpu_align)
+               vcpu_align = __alignof__(struct kvm_vcpu);
+       kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size, vcpu_align,
+-                                         0, NULL);
++                                         SLAB_ACCOUNT, NULL);
+       if (!kvm_vcpu_cache) {
+               r = -ENOMEM;
+               goto out_free_3;

Reply via email to