commit:     d576b11d29553429b8b8d594e64421cda9ebfbf5
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sun Jun  9 16:17:25 2019 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sun Jun  9 16:17:25 2019 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=d576b11d

Linux patch 4.14.124

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

 0000_README               |    4 +
 1123_linux-4.14.124.patch | 2830 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2834 insertions(+)

diff --git a/0000_README b/0000_README
index 81872ea..ccbc586 100644
--- a/0000_README
+++ b/0000_README
@@ -535,6 +535,10 @@ Patch:  1122_4.14.123.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.14.123
 
+Patch:  1123_4.14.124.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.14.124
+
 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/1123_linux-4.14.124.patch b/1123_linux-4.14.124.patch
new file mode 100644
index 0000000..e42bee5
--- /dev/null
+++ b/1123_linux-4.14.124.patch
@@ -0,0 +1,2830 @@
+diff --git a/Documentation/conf.py b/Documentation/conf.py
+index 63857d33778c..329c519158b6 100644
+--- a/Documentation/conf.py
++++ b/Documentation/conf.py
+@@ -37,7 +37,7 @@ needs_sphinx = '1.3'
+ extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include', 'cdomain', 
'kfigure']
+ 
+ # The name of the math extension changed on Sphinx 1.4
+-if major == 1 and minor > 3:
++if (major == 1 and minor > 3) or (major > 1):
+     extensions.append("sphinx.ext.imgmath")
+ else:
+     extensions.append("sphinx.ext.pngmath")
+diff --git a/Documentation/sphinx/kerneldoc.py 
b/Documentation/sphinx/kerneldoc.py
+index fbedcc39460b..0bae1193fc05 100644
+--- a/Documentation/sphinx/kerneldoc.py
++++ b/Documentation/sphinx/kerneldoc.py
+@@ -37,7 +37,19 @@ import glob
+ from docutils import nodes, statemachine
+ from docutils.statemachine import ViewList
+ from docutils.parsers.rst import directives, Directive
+-from sphinx.ext.autodoc import AutodocReporter
++
++#
++# AutodocReporter is only good up to Sphinx 1.7
++#
++import sphinx
++
++Use_SSI = sphinx.__version__[:3] >= '1.7'
++if Use_SSI:
++    from sphinx.util.docutils import switch_source_input
++else:
++    from sphinx.ext.autodoc import AutodocReporter
++
++import kernellog
+ 
+ __version__  = '1.0'
+ 
+@@ -86,7 +98,8 @@ class KernelDocDirective(Directive):
+         cmd += [filename]
+ 
+         try:
+-            env.app.verbose('calling kernel-doc \'%s\'' % (" ".join(cmd)))
++            kernellog.verbose(env.app,
++                              'calling kernel-doc \'%s\'' % (" ".join(cmd)))
+ 
+             p = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE)
+             out, err = p.communicate()
+@@ -96,7 +109,8 @@ class KernelDocDirective(Directive):
+             if p.returncode != 0:
+                 sys.stderr.write(err)
+ 
+-                env.app.warn('kernel-doc \'%s\' failed with return code %d' % 
(" ".join(cmd), p.returncode))
++                kernellog.warn(env.app,
++                               'kernel-doc \'%s\' failed with return code %d' 
% (" ".join(cmd), p.returncode))
+                 return [nodes.error(None, nodes.paragraph(text = "kernel-doc 
missing"))]
+             elif env.config.kerneldoc_verbosity > 0:
+                 sys.stderr.write(err)
+@@ -117,20 +131,28 @@ class KernelDocDirective(Directive):
+                     lineoffset += 1
+ 
+             node = nodes.section()
+-            buf = self.state.memo.title_styles, 
self.state.memo.section_level, self.state.memo.reporter
++            self.do_parse(result, node)
++
++            return node.children
++
++        except Exception as e:  # pylint: disable=W0703
++            kernellog.warn(env.app, 'kernel-doc \'%s\' processing failed 
with: %s' %
++                           (" ".join(cmd), str(e)))
++            return [nodes.error(None, nodes.paragraph(text = "kernel-doc 
missing"))]
++
++    def do_parse(self, result, node):
++        if Use_SSI:
++            with switch_source_input(self.state, result):
++                self.state.nested_parse(result, 0, node, match_titles=1)
++        else:
++            save = self.state.memo.title_styles, 
self.state.memo.section_level, self.state.memo.reporter
+             self.state.memo.reporter = AutodocReporter(result, 
self.state.memo.reporter)
+             self.state.memo.title_styles, self.state.memo.section_level = [], 0
+             try:
+                 self.state.nested_parse(result, 0, node, match_titles=1)
+             finally:
+-                self.state.memo.title_styles, self.state.memo.section_level, 
self.state.memo.reporter = buf
++                self.state.memo.title_styles, self.state.memo.section_level, 
self.state.memo.reporter = save
+ 
+-            return node.children
+-
+-        except Exception as e:  # pylint: disable=W0703
+-            env.app.warn('kernel-doc \'%s\' processing failed with: %s' %
+-                         (" ".join(cmd), str(e)))
+-            return [nodes.error(None, nodes.paragraph(text = "kernel-doc 
missing"))]
+ 
+ def setup(app):
+     app.add_config_value('kerneldoc_bin', None, 'env')
+diff --git a/Documentation/sphinx/kernellog.py 
b/Documentation/sphinx/kernellog.py
+new file mode 100644
+index 000000000000..af924f51a7dc
+--- /dev/null
++++ b/Documentation/sphinx/kernellog.py
+@@ -0,0 +1,28 @@
++# SPDX-License-Identifier: GPL-2.0
++#
++# Sphinx has deprecated its older logging interface, but the replacement
++# only goes back to 1.6.  So here's a wrapper layer to keep around for
++# as long as we support 1.4.
++#
++import sphinx
++
++if sphinx.__version__[:3] >= '1.6':
++    UseLogging = True
++    from sphinx.util import logging
++    logger = logging.getLogger('kerneldoc')
++else:
++    UseLogging = False
++
++def warn(app, message):
++    if UseLogging:
++        logger.warning(message)
++    else:
++        app.warn(message)
++
++def verbose(app, message):
++    if UseLogging:
++        logger.verbose(message)
++    else:
++        app.verbose(message)
++
++
+diff --git a/Documentation/sphinx/kfigure.py b/Documentation/sphinx/kfigure.py
+index cef4ad19624c..4770cadbee0a 100644
+--- a/Documentation/sphinx/kfigure.py
++++ b/Documentation/sphinx/kfigure.py
+@@ -60,6 +60,8 @@ import sphinx
+ from sphinx.util.nodes import clean_astext
+ from six import iteritems
+ 
++import kernellog
++
+ PY3 = sys.version_info[0] == 3
+ 
+ if PY3:
+@@ -171,20 +173,20 @@ def setupTools(app):
+     This function is called once, when the builder is initiated.
+     """
+     global dot_cmd, convert_cmd   # pylint: disable=W0603
+-    app.verbose("kfigure: check installed tools ...")
++    kernellog.verbose(app, "kfigure: check installed tools ...")
+ 
+     dot_cmd = which('dot')
+     convert_cmd = which('convert')
+ 
+     if dot_cmd:
+-        app.verbose("use dot(1) from: " + dot_cmd)
++        kernellog.verbose(app, "use dot(1) from: " + dot_cmd)
+     else:
+-        app.warn("dot(1) not found, for better output quality install "
+-                 "graphviz from http://www.graphviz.org";)
++        kernellog.warn(app, "dot(1) not found, for better output quality 
install "
++                       "graphviz from http://www.graphviz.org";)
+     if convert_cmd:
+-        app.verbose("use convert(1) from: " + convert_cmd)
++        kernellog.verbose(app, "use convert(1) from: " + convert_cmd)
+     else:
+-        app.warn(
++        kernellog.warn(app,
+             "convert(1) not found, for SVG to PDF conversion install "
+             "ImageMagick (https://www.imagemagick.org)")
+ 
+@@ -220,12 +222,13 @@ def convert_image(img_node, translator, src_fname=None):
+ 
+     # in kernel builds, use 'make SPHINXOPTS=-v' to see verbose messages
+ 
+-    app.verbose('assert best format for: ' + img_node['uri'])
++    kernellog.verbose(app, 'assert best format for: ' + img_node['uri'])
+ 
+     if in_ext == '.dot':
+ 
+         if not dot_cmd:
+-            app.verbose("dot from graphviz not available / include DOT raw.")
++            kernellog.verbose(app,
++                              "dot from graphviz not available / include DOT 
raw.")
+             img_node.replace_self(file2literal(src_fname))
+ 
+         elif translator.builder.format == 'latex':
+@@ -252,7 +255,8 @@ def convert_image(img_node, translator, src_fname=None):
+ 
+         if translator.builder.format == 'latex':
+             if convert_cmd is None:
+-                app.verbose("no SVG to PDF conversion available / include SVG 
raw.")
++                kernellog.verbose(app,
++                                  "no SVG to PDF conversion available / 
include SVG raw.")
+                 img_node.replace_self(file2literal(src_fname))
+             else:
+                 dst_fname = path.join(translator.builder.outdir, fname + 
'.pdf')
+@@ -265,18 +269,19 @@ def convert_image(img_node, translator, src_fname=None):
+         _name = dst_fname[len(translator.builder.outdir) + 1:]
+ 
+         if isNewer(dst_fname, src_fname):
+-            app.verbose("convert: {out}/%s already exists and is newer" % 
_name)
++            kernellog.verbose(app,
++                              "convert: {out}/%s already exists and is newer" 
% _name)
+ 
+         else:
+             ok = False
+             mkdir(path.dirname(dst_fname))
+ 
+             if in_ext == '.dot':
+-                app.verbose('convert DOT to: {out}/' + _name)
++                kernellog.verbose(app, 'convert DOT to: {out}/' + _name)
+                 ok = dot2format(app, src_fname, dst_fname)
+ 
+             elif in_ext == '.svg':
+-                app.verbose('convert SVG to: {out}/' + _name)
++                kernellog.verbose(app, 'convert SVG to: {out}/' + _name)
+                 ok = svg2pdf(app, src_fname, dst_fname)
+ 
+             if not ok:
+@@ -305,7 +310,8 @@ def dot2format(app, dot_fname, out_fname):
+     with open(out_fname, "w") as out:
+         exit_code = subprocess.call(cmd, stdout = out)
+         if exit_code != 0:
+-            app.warn("Error #%d when calling: %s" % (exit_code, " 
".join(cmd)))
++            kernellog.warn(app,
++                          "Error #%d when calling: %s" % (exit_code, " 
".join(cmd)))
+     return bool(exit_code == 0)
+ 
+ def svg2pdf(app, svg_fname, pdf_fname):
+@@ -322,7 +328,7 @@ def svg2pdf(app, svg_fname, pdf_fname):
+     # use stdout and stderr from parent
+     exit_code = subprocess.call(cmd)
+     if exit_code != 0:
+-        app.warn("Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
++        kernellog.warn(app, "Error #%d when calling: %s" % (exit_code, " 
".join(cmd)))
+     return bool(exit_code == 0)
+ 
+ 
+@@ -415,15 +421,15 @@ def visit_kernel_render(self, node):
+     app = self.builder.app
+     srclang = node.get('srclang')
+ 
+-    app.verbose('visit kernel-render node lang: "%s"' % (srclang))
++    kernellog.verbose('visit kernel-render node lang: "%s"' % (srclang))
+ 
+     tmp_ext = RENDER_MARKUP_EXT.get(srclang, None)
+     if tmp_ext is None:
+-        app.warn('kernel-render: "%s" unknow / include raw.' % (srclang))
++        kernellog.warn('kernel-render: "%s" unknow / include raw.' % 
(srclang))
+         return
+ 
+     if not dot_cmd and tmp_ext == '.dot':
+-        app.verbose("dot from graphviz not available / include raw.")
++        kernellog.verbose("dot from graphviz not available / include raw.")
+         return
+ 
+     literal_block = node[0]
+diff --git a/Makefile b/Makefile
+index a8e8a53cc08b..8416103c15a1 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 123
++SUBLEVEL = 124
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
+index 9730ba734afe..aa6c365f2559 100644
+--- a/arch/mips/kvm/mips.c
++++ b/arch/mips/kvm/mips.c
+@@ -1078,6 +1078,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long 
ext)
+       case KVM_CAP_MAX_VCPUS:
+               r = KVM_MAX_VCPUS;
+               break;
++      case KVM_CAP_MAX_VCPU_ID:
++              r = KVM_MAX_VCPU_ID;
++              break;
+       case KVM_CAP_MIPS_FPU:
+               /* We don't handle systems with inconsistent cpu_has_fpu */
+               r = !!raw_cpu_has_fpu;
+diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c
+index 0d750d274c4e..3c75eee45edf 100644
+--- a/arch/powerpc/kvm/book3s_xive.c
++++ b/arch/powerpc/kvm/book3s_xive.c
+@@ -1675,7 +1675,6 @@ static void kvmppc_xive_cleanup_irq(u32 hw_num, struct 
xive_irq_data *xd)
+ {
+       xive_vm_esb_load(xd, XIVE_ESB_SET_PQ_01);
+       xive_native_configure_irq(hw_num, 0, MASKED, 0);
+-      xive_cleanup_irq_data(xd);
+ }
+ 
+ static void kvmppc_xive_free_sources(struct kvmppc_xive_src_block *sb)
+@@ -1689,9 +1688,10 @@ static void kvmppc_xive_free_sources(struct 
kvmppc_xive_src_block *sb)
+                       continue;
+ 
+               kvmppc_xive_cleanup_irq(state->ipi_number, &state->ipi_data);
++              xive_cleanup_irq_data(&state->ipi_data);
+               xive_native_free_irq(state->ipi_number);
+ 
+-              /* Pass-through, cleanup too */
++              /* Pass-through, cleanup too but keep IRQ hw data */
+               if (state->pt_number)
+                       kvmppc_xive_cleanup_irq(state->pt_number, 
state->pt_data);
+ 
+diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
+index a35995a6b34a..47d45733a346 100644
+--- a/arch/powerpc/kvm/powerpc.c
++++ b/arch/powerpc/kvm/powerpc.c
+@@ -629,6 +629,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
+       case KVM_CAP_MAX_VCPUS:
+               r = KVM_MAX_VCPUS;
+               break;
++      case KVM_CAP_MAX_VCPU_ID:
++              r = KVM_MAX_VCPU_ID;
++              break;
+ #ifdef CONFIG_PPC_BOOK3S_64
+       case KVM_CAP_PPC_GET_SMMU_INFO:
+               r = 1;
+diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
+index b7a6044161e8..3188040022c4 100644
+--- a/arch/powerpc/perf/core-book3s.c
++++ b/arch/powerpc/perf/core-book3s.c
+@@ -1845,6 +1845,7 @@ static int power_pmu_event_init(struct perf_event *event)
+       int n;
+       int err;
+       struct cpu_hw_events *cpuhw;
++      u64 bhrb_filter;
+ 
+       if (!ppmu)
+               return -ENOENT;
+@@ -1941,13 +1942,14 @@ static int power_pmu_event_init(struct perf_event 
*event)
+       err = power_check_constraints(cpuhw, events, cflags, n + 1);
+ 
+       if (has_branch_stack(event)) {
+-              cpuhw->bhrb_filter = ppmu->bhrb_filter_map(
++              bhrb_filter = ppmu->bhrb_filter_map(
+                                       event->attr.branch_sample_type);
+ 
+-              if (cpuhw->bhrb_filter == -1) {
++              if (bhrb_filter == -1) {
+                       put_cpu_var(cpu_hw_events);
+                       return -EOPNOTSUPP;
+               }
++              cpuhw->bhrb_filter = bhrb_filter;
+       }
+ 
+       put_cpu_var(cpu_hw_events);
+diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c
+index c9356955cab4..b12627bb5d34 100644
+--- a/arch/powerpc/perf/power8-pmu.c
++++ b/arch/powerpc/perf/power8-pmu.c
+@@ -29,6 +29,7 @@ enum {
+ #define       POWER8_MMCRA_IFM1               0x0000000040000000UL
+ #define       POWER8_MMCRA_IFM2               0x0000000080000000UL
+ #define       POWER8_MMCRA_IFM3               0x00000000C0000000UL
++#define       POWER8_MMCRA_BHRB_MASK          0x00000000C0000000UL
+ 
+ /* PowerISA v2.07 format attribute structure*/
+ extern struct attribute_group isa207_pmu_format_group;
+@@ -179,6 +180,8 @@ static u64 power8_bhrb_filter_map(u64 branch_sample_type)
+ 
+ static void power8_config_bhrb(u64 pmu_bhrb_filter)
+ {
++      pmu_bhrb_filter &= POWER8_MMCRA_BHRB_MASK;
++
+       /* Enable BHRB filter in PMU */
+       mtspr(SPRN_MMCRA, (mfspr(SPRN_MMCRA) | pmu_bhrb_filter));
+ }
+diff --git a/arch/powerpc/perf/power9-pmu.c b/arch/powerpc/perf/power9-pmu.c
+index 24b5b5b7a206..efb19b089023 100644
+--- a/arch/powerpc/perf/power9-pmu.c
++++ b/arch/powerpc/perf/power9-pmu.c
+@@ -100,6 +100,7 @@ enum {
+ #define POWER9_MMCRA_IFM1             0x0000000040000000UL
+ #define POWER9_MMCRA_IFM2             0x0000000080000000UL
+ #define POWER9_MMCRA_IFM3             0x00000000C0000000UL
++#define POWER9_MMCRA_BHRB_MASK                0x00000000C0000000UL
+ 
+ /* PowerISA v2.07 format attribute structure*/
+ extern struct attribute_group isa207_pmu_format_group;
+@@ -289,6 +290,8 @@ static u64 power9_bhrb_filter_map(u64 branch_sample_type)
+ 
+ static void power9_config_bhrb(u64 pmu_bhrb_filter)
+ {
++      pmu_bhrb_filter &= POWER9_MMCRA_BHRB_MASK;
++
+       /* Enable BHRB filter in PMU */
+       mtspr(SPRN_MMCRA, (mfspr(SPRN_MMCRA) | pmu_bhrb_filter));
+ }
+diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
+index 4f6adbea592b..d6fe229ac20e 100644
+--- a/arch/s390/kvm/kvm-s390.c
++++ b/arch/s390/kvm/kvm-s390.c
+@@ -428,6 +428,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
+               break;
+       case KVM_CAP_NR_VCPUS:
+       case KVM_CAP_MAX_VCPUS:
++      case KVM_CAP_MAX_VCPU_ID:
+               r = KVM_S390_BSCA_CPU_SLOTS;
+               if (!kvm_s390_use_sca_entries())
+                       r = KVM_MAX_VCPUS;
+diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S
+index d245f89d1395..d220b6848746 100644
+--- a/arch/sparc/mm/ultra.S
++++ b/arch/sparc/mm/ultra.S
+@@ -587,7 +587,7 @@ xcall_flush_tlb_kernel_range:      /* 44 insns */
+       sub             %g7, %g1, %g3
+       srlx            %g3, 18, %g2
+       brnz,pn         %g2, 2f
+-       add            %g2, 1, %g2
++       sethi          %hi(PAGE_SIZE), %g2
+       sub             %g3, %g2, %g3
+       or              %g1, 0x20, %g1          ! Nucleus
+ 1:    stxa            %g0, [%g1 + %g3] ASI_DMMU_DEMAP
+@@ -751,7 +751,7 @@ __cheetah_xcall_flush_tlb_kernel_range:    /* 44 insns */
+       sub             %g7, %g1, %g3
+       srlx            %g3, 18, %g2
+       brnz,pn         %g2, 2f
+-       add            %g2, 1, %g2
++       sethi          %hi(PAGE_SIZE), %g2
+       sub             %g3, %g2, %g3
+       or              %g1, 0x20, %g1          ! Nucleus
+ 1:    stxa            %g0, [%g1 + %g3] ASI_DMMU_DEMAP
+diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
+index 23df6eebe82f..2384a2ae5ec3 100644
+--- a/arch/x86/kernel/vmlinux.lds.S
++++ b/arch/x86/kernel/vmlinux.lds.S
+@@ -131,10 +131,10 @@ SECTIONS
+               *(.text.__x86.indirect_thunk)
+               __indirect_thunk_end = .;
+ #endif
+-      } :text = 0x9090
+ 
+-      /* End of text section */
+-      _etext = .;
++              /* End of text section */
++              _etext = .;
++      } :text = 0x9090
+ 
+       NOTES :text :note
+ 
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 00d383e3d87a..858dd0d89b02 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -2825,6 +2825,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long 
ext)
+       case KVM_CAP_MAX_VCPUS:
+               r = KVM_MAX_VCPUS;
+               break;
++      case KVM_CAP_MAX_VCPU_ID:
++              r = KVM_MAX_VCPU_ID;
++              break;
+       case KVM_CAP_NR_MEMSLOTS:
+               r = KVM_USER_MEM_SLOTS;
+               break;
+diff --git a/drivers/crypto/vmx/ghash.c b/drivers/crypto/vmx/ghash.c
+index 1c4b5b889fba..1bfe867c0b7b 100644
+--- a/drivers/crypto/vmx/ghash.c
++++ b/drivers/crypto/vmx/ghash.c
+@@ -1,22 +1,14 @@
++// SPDX-License-Identifier: GPL-2.0
+ /**
+  * GHASH routines supporting VMX instructions on the Power 8
+  *
+- * Copyright (C) 2015 International Business Machines Inc.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; version 2 only.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ * Copyright (C) 2015, 2019 International Business Machines Inc.
+  *
+  * Author: Marcelo Henrique Cerri <[email protected]>
++ *
++ * Extended by Daniel Axtens <[email protected]> to replace the fallback
++ * mechanism. The new approach is based on arm64 code, which is:
++ *   Copyright (C) 2014 - 2018 Linaro Ltd. <[email protected]>
+  */
+ 
+ #include <linux/types.h>
+@@ -39,71 +31,25 @@ void gcm_ghash_p8(u64 Xi[2], const u128 htable[16],
+                 const u8 *in, size_t len);
+ 
+ struct p8_ghash_ctx {
++      /* key used by vector asm */
+       u128 htable[16];
+-      struct crypto_shash *fallback;
++      /* key used by software fallback */
++      be128 key;
+ };
+ 
+ struct p8_ghash_desc_ctx {
+       u64 shash[2];
+       u8 buffer[GHASH_DIGEST_SIZE];
+       int bytes;
+-      struct shash_desc fallback_desc;
+ };
+ 
+-static int p8_ghash_init_tfm(struct crypto_tfm *tfm)
+-{
+-      const char *alg = "ghash-generic";
+-      struct crypto_shash *fallback;
+-      struct crypto_shash *shash_tfm = __crypto_shash_cast(tfm);
+-      struct p8_ghash_ctx *ctx = crypto_tfm_ctx(tfm);
+-
+-      fallback = crypto_alloc_shash(alg, 0, CRYPTO_ALG_NEED_FALLBACK);
+-      if (IS_ERR(fallback)) {
+-              printk(KERN_ERR
+-                     "Failed to allocate transformation for '%s': %ld\n",
+-                     alg, PTR_ERR(fallback));
+-              return PTR_ERR(fallback);
+-      }
+-
+-      crypto_shash_set_flags(fallback,
+-                             crypto_shash_get_flags((struct crypto_shash
+-                                                     *) tfm));
+-
+-      /* Check if the descsize defined in the algorithm is still enough. */
+-      if (shash_tfm->descsize < sizeof(struct p8_ghash_desc_ctx)
+-          + crypto_shash_descsize(fallback)) {
+-              printk(KERN_ERR
+-                     "Desc size of the fallback implementation (%s) does not 
match the expected value: %lu vs %u\n",
+-                     alg,
+-                     shash_tfm->descsize - sizeof(struct p8_ghash_desc_ctx),
+-                     crypto_shash_descsize(fallback));
+-              return -EINVAL;
+-      }
+-      ctx->fallback = fallback;
+-
+-      return 0;
+-}
+-
+-static void p8_ghash_exit_tfm(struct crypto_tfm *tfm)
+-{
+-      struct p8_ghash_ctx *ctx = crypto_tfm_ctx(tfm);
+-
+-      if (ctx->fallback) {
+-              crypto_free_shash(ctx->fallback);
+-              ctx->fallback = NULL;
+-      }
+-}
+-
+ static int p8_ghash_init(struct shash_desc *desc)
+ {
+-      struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm));
+       struct p8_ghash_desc_ctx *dctx = shash_desc_ctx(desc);
+ 
+       dctx->bytes = 0;
+       memset(dctx->shash, 0, GHASH_DIGEST_SIZE);
+-      dctx->fallback_desc.tfm = ctx->fallback;
+-      dctx->fallback_desc.flags = desc->flags;
+-      return crypto_shash_init(&dctx->fallback_desc);
++      return 0;
+ }
+ 
+ static int p8_ghash_setkey(struct crypto_shash *tfm, const u8 *key,
+@@ -121,7 +67,51 @@ static int p8_ghash_setkey(struct crypto_shash *tfm, const 
u8 *key,
+       disable_kernel_vsx();
+       pagefault_enable();
+       preempt_enable();
+-      return crypto_shash_setkey(ctx->fallback, key, keylen);
++
++      memcpy(&ctx->key, key, GHASH_BLOCK_SIZE);
++
++      return 0;
++}
++
++static inline void __ghash_block(struct p8_ghash_ctx *ctx,
++                               struct p8_ghash_desc_ctx *dctx)
++{
++      if (!IN_INTERRUPT) {
++              preempt_disable();
++              pagefault_disable();
++              enable_kernel_vsx();
++              gcm_ghash_p8(dctx->shash, ctx->htable,
++                              dctx->buffer, GHASH_DIGEST_SIZE);
++              disable_kernel_vsx();
++              pagefault_enable();
++              preempt_enable();
++      } else {
++              crypto_xor((u8 *)dctx->shash, dctx->buffer, GHASH_BLOCK_SIZE);
++              gf128mul_lle((be128 *)dctx->shash, &ctx->key);
++      }
++}
++
++static inline void __ghash_blocks(struct p8_ghash_ctx *ctx,
++                                struct p8_ghash_desc_ctx *dctx,
++                                const u8 *src, unsigned int srclen)
++{
++      if (!IN_INTERRUPT) {
++              preempt_disable();
++              pagefault_disable();
++              enable_kernel_vsx();
++              gcm_ghash_p8(dctx->shash, ctx->htable,
++                              src, srclen);
++              disable_kernel_vsx();
++              pagefault_enable();
++              preempt_enable();
++      } else {
++              while (srclen >= GHASH_BLOCK_SIZE) {
++                      crypto_xor((u8 *)dctx->shash, src, GHASH_BLOCK_SIZE);
++                      gf128mul_lle((be128 *)dctx->shash, &ctx->key);
++                      srclen -= GHASH_BLOCK_SIZE;
++                      src += GHASH_BLOCK_SIZE;
++              }
++      }
+ }
+ 
+ static int p8_ghash_update(struct shash_desc *desc,
+@@ -131,49 +121,33 @@ static int p8_ghash_update(struct shash_desc *desc,
+       struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm));
+       struct p8_ghash_desc_ctx *dctx = shash_desc_ctx(desc);
+ 
+-      if (IN_INTERRUPT) {
+-              return crypto_shash_update(&dctx->fallback_desc, src,
+-                                         srclen);
+-      } else {
+-              if (dctx->bytes) {
+-                      if (dctx->bytes + srclen < GHASH_DIGEST_SIZE) {
+-                              memcpy(dctx->buffer + dctx->bytes, src,
+-                                     srclen);
+-                              dctx->bytes += srclen;
+-                              return 0;
+-                      }
++      if (dctx->bytes) {
++              if (dctx->bytes + srclen < GHASH_DIGEST_SIZE) {
+                       memcpy(dctx->buffer + dctx->bytes, src,
+-                             GHASH_DIGEST_SIZE - dctx->bytes);
+-                      preempt_disable();
+-                      pagefault_disable();
+-                      enable_kernel_vsx();
+-                      gcm_ghash_p8(dctx->shash, ctx->htable,
+-                                   dctx->buffer, GHASH_DIGEST_SIZE);
+-                      disable_kernel_vsx();
+-                      pagefault_enable();
+-                      preempt_enable();
+-                      src += GHASH_DIGEST_SIZE - dctx->bytes;
+-                      srclen -= GHASH_DIGEST_SIZE - dctx->bytes;
+-                      dctx->bytes = 0;
+-              }
+-              len = srclen & ~(GHASH_DIGEST_SIZE - 1);
+-              if (len) {
+-                      preempt_disable();
+-                      pagefault_disable();
+-                      enable_kernel_vsx();
+-                      gcm_ghash_p8(dctx->shash, ctx->htable, src, len);
+-                      disable_kernel_vsx();
+-                      pagefault_enable();
+-                      preempt_enable();
+-                      src += len;
+-                      srclen -= len;
+-              }
+-              if (srclen) {
+-                      memcpy(dctx->buffer, src, srclen);
+-                      dctx->bytes = srclen;
++                              srclen);
++                      dctx->bytes += srclen;
++                      return 0;
+               }
+-              return 0;
++              memcpy(dctx->buffer + dctx->bytes, src,
++                      GHASH_DIGEST_SIZE - dctx->bytes);
++
++              __ghash_block(ctx, dctx);
++
++              src += GHASH_DIGEST_SIZE - dctx->bytes;
++              srclen -= GHASH_DIGEST_SIZE - dctx->bytes;
++              dctx->bytes = 0;
++      }
++      len = srclen & ~(GHASH_DIGEST_SIZE - 1);
++      if (len) {
++              __ghash_blocks(ctx, dctx, src, len);
++              src += len;
++              srclen -= len;
+       }
++      if (srclen) {
++              memcpy(dctx->buffer, src, srclen);
++              dctx->bytes = srclen;
++      }
++      return 0;
+ }
+ 
+ static int p8_ghash_final(struct shash_desc *desc, u8 *out)
+@@ -182,25 +156,14 @@ static int p8_ghash_final(struct shash_desc *desc, u8 
*out)
+       struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(desc->tfm));
+       struct p8_ghash_desc_ctx *dctx = shash_desc_ctx(desc);
+ 
+-      if (IN_INTERRUPT) {
+-              return crypto_shash_final(&dctx->fallback_desc, out);
+-      } else {
+-              if (dctx->bytes) {
+-                      for (i = dctx->bytes; i < GHASH_DIGEST_SIZE; i++)
+-                              dctx->buffer[i] = 0;
+-                      preempt_disable();
+-                      pagefault_disable();
+-                      enable_kernel_vsx();
+-                      gcm_ghash_p8(dctx->shash, ctx->htable,
+-                                   dctx->buffer, GHASH_DIGEST_SIZE);
+-                      disable_kernel_vsx();
+-                      pagefault_enable();
+-                      preempt_enable();
+-                      dctx->bytes = 0;
+-              }
+-              memcpy(out, dctx->shash, GHASH_DIGEST_SIZE);
+-              return 0;
++      if (dctx->bytes) {
++              for (i = dctx->bytes; i < GHASH_DIGEST_SIZE; i++)
++                      dctx->buffer[i] = 0;
++              __ghash_block(ctx, dctx);
++              dctx->bytes = 0;
+       }
++      memcpy(out, dctx->shash, GHASH_DIGEST_SIZE);
++      return 0;
+ }
+ 
+ struct shash_alg p8_ghash_alg = {
+@@ -215,11 +178,9 @@ struct shash_alg p8_ghash_alg = {
+                .cra_name = "ghash",
+                .cra_driver_name = "p8_ghash",
+                .cra_priority = 1000,
+-               .cra_flags = CRYPTO_ALG_TYPE_SHASH | CRYPTO_ALG_NEED_FALLBACK,
++               .cra_flags = CRYPTO_ALG_TYPE_SHASH,
+                .cra_blocksize = GHASH_BLOCK_SIZE,
+                .cra_ctxsize = sizeof(struct p8_ghash_ctx),
+                .cra_module = THIS_MODULE,
+-               .cra_init = p8_ghash_init_tfm,
+-               .cra_exit = p8_ghash_exit_tfm,
+       },
+ };
+diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/i2c.h 
b/drivers/gpu/drm/nouveau/include/nvkm/subdev/i2c.h
+index eef54e9b5d77..7957eafa5f0e 100644
+--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/i2c.h
++++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/i2c.h
+@@ -38,6 +38,7 @@ struct nvkm_i2c_bus {
+       struct mutex mutex;
+       struct list_head head;
+       struct i2c_adapter i2c;
++      u8 enabled;
+ };
+ 
+ int nvkm_i2c_bus_acquire(struct nvkm_i2c_bus *);
+@@ -57,6 +58,7 @@ struct nvkm_i2c_aux {
+       struct mutex mutex;
+       struct list_head head;
+       struct i2c_adapter i2c;
++      u8 enabled;
+ 
+       u32 intr;
+ };
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c
+index 4c1f547da463..b4e7404fe660 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c
+@@ -105,9 +105,15 @@ nvkm_i2c_aux_acquire(struct nvkm_i2c_aux *aux)
+ {
+       struct nvkm_i2c_pad *pad = aux->pad;
+       int ret;
++
+       AUX_TRACE(aux, "acquire");
+       mutex_lock(&aux->mutex);
+-      ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_AUX);
++
++      if (aux->enabled)
++              ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_AUX);
++      else
++              ret = -EIO;
++
+       if (ret)
+               mutex_unlock(&aux->mutex);
+       return ret;
+@@ -145,6 +151,24 @@ nvkm_i2c_aux_del(struct nvkm_i2c_aux **paux)
+       }
+ }
+ 
++void
++nvkm_i2c_aux_init(struct nvkm_i2c_aux *aux)
++{
++      AUX_TRACE(aux, "init");
++      mutex_lock(&aux->mutex);
++      aux->enabled = true;
++      mutex_unlock(&aux->mutex);
++}
++
++void
++nvkm_i2c_aux_fini(struct nvkm_i2c_aux *aux)
++{
++      AUX_TRACE(aux, "fini");
++      mutex_lock(&aux->mutex);
++      aux->enabled = false;
++      mutex_unlock(&aux->mutex);
++}
++
+ int
+ nvkm_i2c_aux_ctor(const struct nvkm_i2c_aux_func *func,
+                 struct nvkm_i2c_pad *pad, int id,
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h 
b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h
+index 7d56c4ba693c..08f6b2ee64ab 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h
+@@ -16,6 +16,8 @@ int nvkm_i2c_aux_ctor(const struct nvkm_i2c_aux_func *, 
struct nvkm_i2c_pad *,
+ int nvkm_i2c_aux_new_(const struct nvkm_i2c_aux_func *, struct nvkm_i2c_pad *,
+                     int id, struct nvkm_i2c_aux **);
+ void nvkm_i2c_aux_del(struct nvkm_i2c_aux **);
++void nvkm_i2c_aux_init(struct nvkm_i2c_aux *);
++void nvkm_i2c_aux_fini(struct nvkm_i2c_aux *);
+ int nvkm_i2c_aux_xfer(struct nvkm_i2c_aux *, bool retry, u8 type,
+                     u32 addr, u8 *data, u8 *size);
+ 
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
+index 4f197b15acf6..ecacb22834d7 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
+@@ -160,8 +160,18 @@ nvkm_i2c_fini(struct nvkm_subdev *subdev, bool suspend)
+ {
+       struct nvkm_i2c *i2c = nvkm_i2c(subdev);
+       struct nvkm_i2c_pad *pad;
++      struct nvkm_i2c_bus *bus;
++      struct nvkm_i2c_aux *aux;
+       u32 mask;
+ 
++      list_for_each_entry(aux, &i2c->aux, head) {
++              nvkm_i2c_aux_fini(aux);
++      }
++
++      list_for_each_entry(bus, &i2c->bus, head) {
++              nvkm_i2c_bus_fini(bus);
++      }
++
+       if ((mask = (1 << i2c->func->aux) - 1), i2c->func->aux_stat) {
+               i2c->func->aux_mask(i2c, NVKM_I2C_ANY, mask, 0);
+               i2c->func->aux_stat(i2c, &mask, &mask, &mask, &mask);
+@@ -180,6 +190,7 @@ nvkm_i2c_init(struct nvkm_subdev *subdev)
+       struct nvkm_i2c *i2c = nvkm_i2c(subdev);
+       struct nvkm_i2c_bus *bus;
+       struct nvkm_i2c_pad *pad;
++      struct nvkm_i2c_aux *aux;
+ 
+       list_for_each_entry(pad, &i2c->pad, head) {
+               nvkm_i2c_pad_init(pad);
+@@ -189,6 +200,10 @@ nvkm_i2c_init(struct nvkm_subdev *subdev)
+               nvkm_i2c_bus_init(bus);
+       }
+ 
++      list_for_each_entry(aux, &i2c->aux, head) {
++              nvkm_i2c_aux_init(aux);
++      }
++
+       return 0;
+ }
+ 
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c
+index 807a2b67bd64..ed50cc3736b9 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.c
+@@ -110,6 +110,19 @@ nvkm_i2c_bus_init(struct nvkm_i2c_bus *bus)
+       BUS_TRACE(bus, "init");
+       if (bus->func->init)
+               bus->func->init(bus);
++
++      mutex_lock(&bus->mutex);
++      bus->enabled = true;
++      mutex_unlock(&bus->mutex);
++}
++
++void
++nvkm_i2c_bus_fini(struct nvkm_i2c_bus *bus)
++{
++      BUS_TRACE(bus, "fini");
++      mutex_lock(&bus->mutex);
++      bus->enabled = false;
++      mutex_unlock(&bus->mutex);
+ }
+ 
+ void
+@@ -126,9 +139,15 @@ nvkm_i2c_bus_acquire(struct nvkm_i2c_bus *bus)
+ {
+       struct nvkm_i2c_pad *pad = bus->pad;
+       int ret;
++
+       BUS_TRACE(bus, "acquire");
+       mutex_lock(&bus->mutex);
+-      ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_I2C);
++
++      if (bus->enabled)
++              ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_I2C);
++      else
++              ret = -EIO;
++
+       if (ret)
+               mutex_unlock(&bus->mutex);
+       return ret;
+diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.h 
b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.h
+index bea0dd33961e..465464bba58b 100644
+--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.h
++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.h
+@@ -18,6 +18,7 @@ int nvkm_i2c_bus_new_(const struct nvkm_i2c_bus_func *, 
struct nvkm_i2c_pad *,
+                     int id, struct nvkm_i2c_bus **);
+ void nvkm_i2c_bus_del(struct nvkm_i2c_bus **);
+ void nvkm_i2c_bus_init(struct nvkm_i2c_bus *);
++void nvkm_i2c_bus_fini(struct nvkm_i2c_bus *);
+ 
+ int nvkm_i2c_bit_xfer(struct nvkm_i2c_bus *, struct i2c_msg *, int);
+ 
+diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c 
b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+index ff3d0f5efbb1..7c53d7712dd6 100644
+--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
++++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+@@ -425,6 +425,14 @@ static int rockchip_drm_platform_remove(struct 
platform_device *pdev)
+       return 0;
+ }
+ 
++static void rockchip_drm_platform_shutdown(struct platform_device *pdev)
++{
++      struct drm_device *drm = platform_get_drvdata(pdev);
++
++      if (drm)
++              drm_atomic_helper_shutdown(drm);
++}
++
+ static const struct of_device_id rockchip_drm_dt_ids[] = {
+       { .compatible = "rockchip,display-subsystem", },
+       { /* sentinel */ },
+@@ -434,6 +442,7 @@ MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);
+ static struct platform_driver rockchip_drm_platform_driver = {
+       .probe = rockchip_drm_platform_probe,
+       .remove = rockchip_drm_platform_remove,
++      .shutdown = rockchip_drm_platform_shutdown,
+       .driver = {
+               .name = "rockchip-drm",
+               .of_match_table = rockchip_drm_dt_ids,
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+index 3bc7915097ad..ba1a03a65b2a 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+@@ -1245,7 +1245,13 @@ static int vmw_master_set(struct drm_device *dev,
+       }
+ 
+       dev_priv->active_master = vmaster;
+-      drm_sysfs_hotplug_event(dev);
++
++      /*
++       * Inform a new master that the layout may have changed while
++       * it was gone.
++       */
++      if (!from_open)
++              drm_sysfs_hotplug_event(dev);
+ 
+       return 0;
+ }
+diff --git a/drivers/media/usb/siano/smsusb.c 
b/drivers/media/usb/siano/smsusb.c
+index 8c1f926567ec..ec759f43c634 100644
+--- a/drivers/media/usb/siano/smsusb.c
++++ b/drivers/media/usb/siano/smsusb.c
+@@ -402,6 +402,7 @@ static int smsusb_init_device(struct usb_interface *intf, 
int board_id)
+       struct smsusb_device_t *dev;
+       void *mdev;
+       int i, rc;
++      int align = 0;
+ 
+       /* create device object */
+       dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL);
+@@ -413,6 +414,24 @@ static int smsusb_init_device(struct usb_interface *intf, 
int board_id)
+       dev->udev = interface_to_usbdev(intf);
+       dev->state = SMSUSB_DISCONNECTED;
+ 
++      for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
++              struct usb_endpoint_descriptor *desc =
++                              &intf->cur_altsetting->endpoint[i].desc;
++
++              if (desc->bEndpointAddress & USB_DIR_IN) {
++                      dev->in_ep = desc->bEndpointAddress;
++                      align = usb_endpoint_maxp(desc) - sizeof(struct 
sms_msg_hdr);
++              } else {
++                      dev->out_ep = desc->bEndpointAddress;
++              }
++      }
++
++      pr_debug("in_ep = %02x, out_ep = %02x\n", dev->in_ep, dev->out_ep);
++      if (!dev->in_ep || !dev->out_ep || align < 0) {  /* Missing endpoints? 
*/
++              smsusb_term_device(intf);
++              return -ENODEV;
++      }
++
+       params.device_type = sms_get_board(board_id)->type;
+ 
+       switch (params.device_type) {
+@@ -427,24 +446,12 @@ static int smsusb_init_device(struct usb_interface 
*intf, int board_id)
+               /* fall-thru */
+       default:
+               dev->buffer_size = USB2_BUFFER_SIZE;
+-              dev->response_alignment =
+-                  le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) -
+-                  sizeof(struct sms_msg_hdr);
++              dev->response_alignment = align;
+ 
+               params.flags |= SMS_DEVICE_FAMILY2;
+               break;
+       }
+ 
+-      for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
+-              if (intf->cur_altsetting->endpoint[i].desc. bEndpointAddress & 
USB_DIR_IN)
+-                      dev->in_ep = 
intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
+-              else
+-                      dev->out_ep = 
intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
+-      }
+-
+-      pr_debug("in_ep = %02x, out_ep = %02x\n",
+-              dev->in_ep, dev->out_ep);
+-
+       params.device = &dev->udev->dev;
+       params.buffer_size = dev->buffer_size;
+       params.num_buffers = MAX_BUFFERS;
+diff --git a/drivers/media/usb/uvc/uvc_driver.c 
b/drivers/media/usb/uvc/uvc_driver.c
+index c0176f5d8200..c2939d080997 100644
+--- a/drivers/media/usb/uvc/uvc_driver.c
++++ b/drivers/media/usb/uvc/uvc_driver.c
+@@ -903,7 +903,7 @@ static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id,
+       unsigned int size;
+       unsigned int i;
+ 
+-      extra_size = ALIGN(extra_size, sizeof(*entity->pads));
++      extra_size = roundup(extra_size, sizeof(*entity->pads));
+       num_inputs = (type & UVC_TERM_OUTPUT) ? num_pads : num_pads - 1;
+       size = sizeof(*entity) + extra_size + sizeof(*entity->pads) * num_pads
+            + num_inputs;
+diff --git a/drivers/net/dsa/mv88e6xxx/chip.c 
b/drivers/net/dsa/mv88e6xxx/chip.c
+index 4fbc75b73433..172b13012e10 100644
+--- a/drivers/net/dsa/mv88e6xxx/chip.c
++++ b/drivers/net/dsa/mv88e6xxx/chip.c
+@@ -624,7 +624,7 @@ static uint64_t _mv88e6xxx_get_ethtool_stat(struct 
mv88e6xxx_chip *chip,
+                       err = mv88e6xxx_port_read(chip, port, s->reg + 1, &reg);
+                       if (err)
+                               return UINT64_MAX;
+-                      high = reg;
++                      low |= ((u32)reg) << 16;
+               }
+               break;
+       case STATS_TYPE_BANK1:
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index 687b01bf1ea9..38ee7692132c 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -1583,6 +1583,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi 
*bnapi, u32 *raw_cons,
+               skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr);
+               bnxt_reuse_rx_data(rxr, cons, data);
+               if (!skb) {
++                      if (agg_bufs)
++                              bnxt_reuse_rx_agg_bufs(bnapi, cp_cons, 
agg_bufs);
+                       rc = -ENOMEM;
+                       goto next_rx;
+               }
+diff --git a/drivers/net/ethernet/freescale/fec_main.c 
b/drivers/net/ethernet/freescale/fec_main.c
+index ad3aabc39cc2..98cd53d380f7 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -3539,7 +3539,7 @@ failed_init:
+       if (fep->reg_phy)
+               regulator_disable(fep->reg_phy);
+ failed_reset:
+-      pm_runtime_put(&pdev->dev);
++      pm_runtime_put_noidle(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+ failed_regulator:
+       clk_disable_unprepare(fep->clk_ahb);
+diff --git a/drivers/net/ethernet/marvell/mvneta.c 
b/drivers/net/ethernet/marvell/mvneta.c
+index f76cbefeb3c7..a0c64b30f81a 100644
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -4350,7 +4350,7 @@ static int mvneta_probe(struct platform_device *pdev)
+       err = register_netdev(dev);
+       if (err < 0) {
+               dev_err(&pdev->dev, "failed to register\n");
+-              goto err_free_stats;
++              goto err_netdev;
+       }
+ 
+       netdev_info(dev, "Using %s mac address %pM\n", mac_from,
+@@ -4369,13 +4369,11 @@ static int mvneta_probe(struct platform_device *pdev)
+       return 0;
+ 
+ err_netdev:
+-      unregister_netdev(dev);
+       if (pp->bm_priv) {
+               mvneta_bm_pool_destroy(pp->bm_priv, pp->pool_long, 1 << pp->id);
+               mvneta_bm_pool_destroy(pp->bm_priv, pp->pool_short,
+                                      1 << pp->id);
+       }
+-err_free_stats:
+       free_percpu(pp->stats);
+ err_free_ports:
+       free_percpu(pp->ports);
+diff --git a/drivers/net/ethernet/marvell/mvpp2.c 
b/drivers/net/ethernet/marvell/mvpp2.c
+index 00e6f1d155a6..e9aa8080a67a 100644
+--- a/drivers/net/ethernet/marvell/mvpp2.c
++++ b/drivers/net/ethernet/marvell/mvpp2.c
+@@ -4780,7 +4780,7 @@ static inline void mvpp2_xlg_max_rx_size_set(struct 
mvpp2_port *port)
+ /* Set defaults to the MVPP2 port */
+ static void mvpp2_defaults_set(struct mvpp2_port *port)
+ {
+-      int tx_port_num, val, queue, ptxq, lrxq;
++      int tx_port_num, val, queue, lrxq;
+ 
+       if (port->priv->hw_version == MVPP21) {
+               /* Configure port to loopback if needed */
+@@ -4802,11 +4802,9 @@ static void mvpp2_defaults_set(struct mvpp2_port *port)
+       mvpp2_write(port->priv, MVPP2_TXP_SCHED_CMD_1_REG, 0);
+ 
+       /* Close bandwidth for all queues */
+-      for (queue = 0; queue < MVPP2_MAX_TXQ; queue++) {
+-              ptxq = mvpp2_txq_phys(port->id, queue);
++      for (queue = 0; queue < MVPP2_MAX_TXQ; queue++)
+               mvpp2_write(port->priv,
+-                          MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(ptxq), 0);
+-      }
++                          MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(queue), 0);
+ 
+       /* Set refill period to 1 usec, refill tokens
+        * and bucket size to maximum
+@@ -5645,7 +5643,7 @@ static void mvpp2_txq_deinit(struct mvpp2_port *port,
+       txq->descs_dma         = 0;
+ 
+       /* Set minimum bandwidth for disabled TXQs */
+-      mvpp2_write(port->priv, MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(txq->id), 0);
++      mvpp2_write(port->priv, MVPP2_TXQ_SCHED_TOKEN_CNTR_REG(txq->log_id), 0);
+ 
+       /* Set Tx descriptors queue starting address and size */
+       cpu = get_cpu();
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c 
b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+index 6538b7b943f0..24d1b0be5a68 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+@@ -1960,7 +1960,7 @@ static struct mlx5_flow_root_namespace 
*create_root_ns(struct mlx5_flow_steering
+       struct mlx5_flow_namespace *ns;
+ 
+       /* Create the root namespace */
+-      root_ns = kvzalloc(sizeof(*root_ns), GFP_KERNEL);
++      root_ns = kzalloc(sizeof(*root_ns), GFP_KERNEL);
+       if (!root_ns)
+               return NULL;
+ 
+diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
+index ff2eeddf588e..4c4298f1ebee 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
+@@ -157,7 +157,8 @@ int stmmac_mdio_reset(struct mii_bus *bus)
+                       of_property_read_u32_array(np,
+                               "snps,reset-delays-us", data->delays, 3);
+ 
+-                      if (gpio_request(data->reset_gpio, "mdio-reset"))
++                      if (devm_gpio_request(priv->device, data->reset_gpio,
++                                            "mdio-reset"))
+                               return 0;
+               }
+ 
+diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c
+index 21b3f36e023a..4e1279f2460a 100644
+--- a/drivers/net/phy/marvell10g.c
++++ b/drivers/net/phy/marvell10g.c
+@@ -19,6 +19,9 @@
+ #include <linux/marvell_phy.h>
+ 
+ enum {
++      MV_PMA_BOOT             = 0xc050,
++      MV_PMA_BOOT_FATAL       = BIT(0),
++
+       MV_PCS_BASE_T           = 0x0000,
+       MV_PCS_BASE_R           = 0x1000,
+       MV_PCS_1000BASEX        = 0x2000,
+@@ -59,11 +62,22 @@ static int mv3310_modify(struct phy_device *phydev, int 
devad, u16 reg,
+ static int mv3310_probe(struct phy_device *phydev)
+ {
+       u32 mmd_mask = MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
++      int ret;
+ 
+       if (!phydev->is_c45 ||
+           (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask)
+               return -ENODEV;
+ 
++      ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT);
++      if (ret < 0)
++              return ret;
++
++      if (ret & MV_PMA_BOOT_FATAL) {
++              dev_warn(&phydev->mdio.dev,
++                       "PHY failed to boot firmware, status=%04x\n", ret);
++              return -ENODEV;
++      }
++
+       return 0;
+ }
+ 
+diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
+index 32fc69539126..831a9cec700c 100644
+--- a/drivers/net/usb/usbnet.c
++++ b/drivers/net/usb/usbnet.c
+@@ -508,6 +508,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, 
gfp_t flags)
+ 
+       if (netif_running (dev->net) &&
+           netif_device_present (dev->net) &&
++          test_bit(EVENT_DEV_OPEN, &dev->flags) &&
+           !test_bit (EVENT_RX_HALT, &dev->flags) &&
+           !test_bit (EVENT_DEV_ASLEEP, &dev->flags)) {
+               switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) {
+@@ -1433,6 +1434,11 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
+               spin_unlock_irqrestore(&dev->txq.lock, flags);
+               goto drop;
+       }
++      if (netif_queue_stopped(net)) {
++              usb_autopm_put_interface_async(dev->intf);
++              spin_unlock_irqrestore(&dev->txq.lock, flags);
++              goto drop;
++      }
+ 
+ #ifdef CONFIG_PM
+       /* if this triggers the device is still a sleep */
+diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h
+index 1b2e2541b1de..1b8e5ba1d5f9 100644
+--- a/drivers/s390/scsi/zfcp_ext.h
++++ b/drivers/s390/scsi/zfcp_ext.h
+@@ -161,6 +161,7 @@ extern const struct attribute_group 
*zfcp_port_attr_groups[];
+ extern struct mutex zfcp_sysfs_port_units_mutex;
+ extern struct device_attribute *zfcp_sysfs_sdev_attrs[];
+ extern struct device_attribute *zfcp_sysfs_shost_attrs[];
++bool zfcp_sysfs_port_is_removing(const struct zfcp_port *const port);
+ 
+ /* zfcp_unit.c */
+ extern int zfcp_unit_add(struct zfcp_port *, u64);
+diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c
+index 6f6bc73a3a10..69ffcf221e74 100644
+--- a/drivers/s390/scsi/zfcp_scsi.c
++++ b/drivers/s390/scsi/zfcp_scsi.c
+@@ -125,6 +125,15 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev)
+ 
+       zfcp_sdev->erp_action.port = port;
+ 
++      mutex_lock(&zfcp_sysfs_port_units_mutex);
++      if (zfcp_sysfs_port_is_removing(port)) {
++              /* port is already gone */
++              mutex_unlock(&zfcp_sysfs_port_units_mutex);
++              put_device(&port->dev); /* undo zfcp_get_port_by_wwpn() */
++              return -ENXIO;
++      }
++      mutex_unlock(&zfcp_sysfs_port_units_mutex);
++
+       unit = zfcp_unit_find(port, zfcp_scsi_dev_lun(sdev));
+       if (unit)
+               put_device(&unit->dev);
+diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c
+index 3ac823f2540f..87c1ab79122f 100644
+--- a/drivers/s390/scsi/zfcp_sysfs.c
++++ b/drivers/s390/scsi/zfcp_sysfs.c
+@@ -238,6 +238,53 @@ static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL,
+ 
+ DEFINE_MUTEX(zfcp_sysfs_port_units_mutex);
+ 
++static void zfcp_sysfs_port_set_removing(struct zfcp_port *const port)
++{
++      lockdep_assert_held(&zfcp_sysfs_port_units_mutex);
++      atomic_set(&port->units, -1);
++}
++
++bool zfcp_sysfs_port_is_removing(const struct zfcp_port *const port)
++{
++      lockdep_assert_held(&zfcp_sysfs_port_units_mutex);
++      return atomic_read(&port->units) == -1;
++}
++
++static bool zfcp_sysfs_port_in_use(struct zfcp_port *const port)
++{
++      struct zfcp_adapter *const adapter = port->adapter;
++      unsigned long flags;
++      struct scsi_device *sdev;
++      bool in_use = true;
++
++      mutex_lock(&zfcp_sysfs_port_units_mutex);
++      if (atomic_read(&port->units) > 0)
++              goto unlock_port_units_mutex; /* zfcp_unit(s) under port */
++
++      spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
++      __shost_for_each_device(sdev, adapter->scsi_host) {
++              const struct zfcp_scsi_dev *zsdev = sdev_to_zfcp(sdev);
++
++              if (sdev->sdev_state == SDEV_DEL ||
++                  sdev->sdev_state == SDEV_CANCEL)
++                      continue;
++              if (zsdev->port != port)
++                      continue;
++              /* alive scsi_device under port of interest */
++              goto unlock_host_lock;
++      }
++
++      /* port is about to be removed, so no more unit_add or slave_alloc */
++      zfcp_sysfs_port_set_removing(port);
++      in_use = false;
++
++unlock_host_lock:
++      spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
++unlock_port_units_mutex:
++      mutex_unlock(&zfcp_sysfs_port_units_mutex);
++      return in_use;
++}
++
+ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
+                                           struct device_attribute *attr,
+                                           const char *buf, size_t count)
+@@ -260,15 +307,11 @@ static ssize_t zfcp_sysfs_port_remove_store(struct 
device *dev,
+       else
+               retval = 0;
+ 
+-      mutex_lock(&zfcp_sysfs_port_units_mutex);
+-      if (atomic_read(&port->units) > 0) {
++      if (zfcp_sysfs_port_in_use(port)) {
+               retval = -EBUSY;
+-              mutex_unlock(&zfcp_sysfs_port_units_mutex);
++              put_device(&port->dev); /* undo zfcp_get_port_by_wwpn() */
+               goto out;
+       }
+-      /* port is about to be removed, so no more unit_add */
+-      atomic_set(&port->units, -1);
+-      mutex_unlock(&zfcp_sysfs_port_units_mutex);
+ 
+       write_lock_irq(&adapter->port_list_lock);
+       list_del(&port->list);
+diff --git a/drivers/s390/scsi/zfcp_unit.c b/drivers/s390/scsi/zfcp_unit.c
+index 1bf0a0984a09..e67bf7388cae 100644
+--- a/drivers/s390/scsi/zfcp_unit.c
++++ b/drivers/s390/scsi/zfcp_unit.c
+@@ -124,7 +124,7 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
+       int retval = 0;
+ 
+       mutex_lock(&zfcp_sysfs_port_units_mutex);
+-      if (atomic_read(&port->units) == -1) {
++      if (zfcp_sysfs_port_is_removing(port)) {
+               /* port is already gone */
+               retval = -ENODEV;
+               goto out;
+@@ -168,8 +168,14 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
+       write_lock_irq(&port->unit_list_lock);
+       list_add_tail(&unit->list, &port->unit_list);
+       write_unlock_irq(&port->unit_list_lock);
++      /*
++       * lock order: shost->scan_mutex before zfcp_sysfs_port_units_mutex
++       * due to      zfcp_unit_scsi_scan() => zfcp_scsi_slave_alloc()
++       */
++      mutex_unlock(&zfcp_sysfs_port_units_mutex);
+ 
+       zfcp_unit_scsi_scan(unit);
++      return retval;
+ 
+ out:
+       mutex_unlock(&zfcp_sysfs_port_units_mutex);
+diff --git 
a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 
b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
+index be08849175ea..0634676e6f22 100644
+--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c
+@@ -405,9 +405,18 @@ create_pagelist(char __user *buf, size_t count, unsigned 
short type,
+       int dma_buffers;
+       dma_addr_t dma_addr;
+ 
++      if (count >= INT_MAX - PAGE_SIZE)
++              return NULL;
++
+       offset = ((unsigned int)(unsigned long)buf & (PAGE_SIZE - 1));
+       num_pages = DIV_ROUND_UP(count + offset, PAGE_SIZE);
+ 
++      if (num_pages > (SIZE_MAX - sizeof(PAGELIST_T) -
++                       sizeof(struct vchiq_pagelist_info)) /
++                      (sizeof(u32) + sizeof(pages[0]) +
++                       sizeof(struct scatterlist)))
++              return NULL;
++
+       pagelist_size = sizeof(PAGELIST_T) +
+                       (num_pages * sizeof(u32)) +
+                       (num_pages * sizeof(pages[0]) +
+diff --git a/drivers/staging/wlan-ng/hfa384x_usb.c 
b/drivers/staging/wlan-ng/hfa384x_usb.c
+index d1e8218f96fb..2a22e448a2b3 100644
+--- a/drivers/staging/wlan-ng/hfa384x_usb.c
++++ b/drivers/staging/wlan-ng/hfa384x_usb.c
+@@ -3119,7 +3119,9 @@ static void hfa384x_usbin_callback(struct urb *urb)
+               break;
+       }
+ 
++      /* Save values from the RX URB before reposting overwrites it. */
+       urb_status = urb->status;
++      usbin = (union hfa384x_usbin *)urb->transfer_buffer;
+ 
+       if (action != ABORT) {
+               /* Repost the RX URB */
+@@ -3136,7 +3138,6 @@ static void hfa384x_usbin_callback(struct urb *urb)
+       /* Note: the check of the sw_support field, the type field doesn't
+        *       have bit 12 set like the docs suggest.
+        */
+-      usbin = (union hfa384x_usbin *)urb->transfer_buffer;
+       type = le16_to_cpu(usbin->type);
+       if (HFA384x_USB_ISRXFRM(type)) {
+               if (action == HANDLE) {
+diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
+index 54660002271a..1a98b6631e90 100644
+--- a/drivers/tty/serial/max310x.c
++++ b/drivers/tty/serial/max310x.c
+@@ -579,7 +579,7 @@ static int max310x_set_ref_clk(struct max310x_port *s, 
unsigned long freq,
+       }
+ 
+       /* Configure clock source */
+-      clksrc = xtal ? MAX310X_CLKSRC_CRYST_BIT : MAX310X_CLKSRC_EXTCLK_BIT;
++      clksrc = MAX310X_CLKSRC_EXTCLK_BIT | (xtal ? MAX310X_CLKSRC_CRYST_BIT : 
0);
+ 
+       /* Configure PLL */
+       if (pllcfg) {
+diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c
+index 1db79ee8a886..716aa76abdf9 100644
+--- a/drivers/tty/serial/msm_serial.c
++++ b/drivers/tty/serial/msm_serial.c
+@@ -868,6 +868,7 @@ static void msm_handle_tx(struct uart_port *port)
+       struct circ_buf *xmit = &msm_port->uart.state->xmit;
+       struct msm_dma *dma = &msm_port->tx_dma;
+       unsigned int pio_count, dma_count, dma_min;
++      char buf[4] = { 0 };
+       void __iomem *tf;
+       int err = 0;
+ 
+@@ -877,10 +878,12 @@ static void msm_handle_tx(struct uart_port *port)
+               else
+                       tf = port->membase + UART_TF;
+ 
++              buf[0] = port->x_char;
++
+               if (msm_port->is_uartdm)
+                       msm_reset_dm_count(port, 1);
+ 
+-              iowrite8_rep(tf, &port->x_char, 1);
++              iowrite32_rep(tf, buf, 1);
+               port->icount.tx++;
+               port->x_char = 0;
+               return;
+diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
+index d5f933ec153c..66c8bbea06c4 100644
+--- a/drivers/tty/serial/sh-sci.c
++++ b/drivers/tty/serial/sh-sci.c
+@@ -1479,6 +1479,13 @@ static void sci_request_dma(struct uart_port *port)
+ 
+       dev_dbg(port->dev, "%s: port %d\n", __func__, port->line);
+ 
++      /*
++       * DMA on console may interfere with Kernel log messages which use
++       * plain putchar(). So, simply don't use it with a console.
++       */
++      if (uart_console(port))
++              return;
++
+       if (!port->dev->of_node)
+               return;
+ 
+diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
+index bd749e78df59..f105a5f4927e 100644
+--- a/drivers/usb/core/config.c
++++ b/drivers/usb/core/config.c
+@@ -936,8 +936,8 @@ int usb_get_bos_descriptor(struct usb_device *dev)
+ 
+       /* Get BOS descriptor */
+       ret = usb_get_descriptor(dev, USB_DT_BOS, 0, bos, USB_DT_BOS_SIZE);
+-      if (ret < USB_DT_BOS_SIZE) {
+-              dev_err(ddev, "unable to get BOS descriptor\n");
++      if (ret < USB_DT_BOS_SIZE || bos->bLength < USB_DT_BOS_SIZE) {
++              dev_err(ddev, "unable to get BOS descriptor or descriptor too 
short\n");
+               if (ret >= 0)
+                       ret = -ENOMSG;
+               kfree(bos);
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 733479ddf8a7..38c7676e7a82 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -64,6 +64,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* Microsoft LifeCam-VX700 v2.0 */
+       { USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
++      /* Microsoft Surface Dock Ethernet (RTL8153 GigE) */
++      { USB_DEVICE(0x045e, 0x07c6), .driver_info = USB_QUIRK_NO_LPM },
++
+       /* Cherry Stream G230 2.0 (G85-231) and 3.0 (G85-232) */
+       { USB_DEVICE(0x046a, 0x0023), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
+index 9a7e77a09080..94a7669ccb80 100644
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -667,6 +667,7 @@ static void xhci_unmap_td_bounce_buffer(struct xhci_hcd 
*xhci,
+       struct device *dev = xhci_to_hcd(xhci)->self.controller;
+       struct xhci_segment *seg = td->bounce_seg;
+       struct urb *urb = td->urb;
++      size_t len;
+ 
+       if (!ring || !seg || !urb)
+               return;
+@@ -677,11 +678,14 @@ static void xhci_unmap_td_bounce_buffer(struct xhci_hcd 
*xhci,
+               return;
+       }
+ 
+-      /* for in tranfers we need to copy the data from bounce to sg */
+-      sg_pcopy_from_buffer(urb->sg, urb->num_mapped_sgs, seg->bounce_buf,
+-                           seg->bounce_len, seg->bounce_offs);
+       dma_unmap_single(dev, seg->bounce_dma, ring->bounce_buf_len,
+                        DMA_FROM_DEVICE);
++      /* for in tranfers we need to copy the data from bounce to sg */
++      len = sg_pcopy_from_buffer(urb->sg, urb->num_sgs, seg->bounce_buf,
++                           seg->bounce_len, seg->bounce_offs);
++      if (len != seg->bounce_len)
++              xhci_warn(xhci, "WARN Wrong bounce buffer read length: %zu != 
%d\n",
++                              len, seg->bounce_len);
+       seg->bounce_len = 0;
+       seg->bounce_offs = 0;
+ }
+@@ -3186,6 +3190,7 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct 
urb *urb, u32 enqd_len,
+       unsigned int unalign;
+       unsigned int max_pkt;
+       u32 new_buff_len;
++      size_t len;
+ 
+       max_pkt = usb_endpoint_maxp(&urb->ep->desc);
+       unalign = (enqd_len + *trb_buff_len) % max_pkt;
+@@ -3216,8 +3221,12 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct 
urb *urb, u32 enqd_len,
+ 
+       /* create a max max_pkt sized bounce buffer pointed to by last trb */
+       if (usb_urb_dir_out(urb)) {
+-              sg_pcopy_to_buffer(urb->sg, urb->num_mapped_sgs,
++              len = sg_pcopy_to_buffer(urb->sg, urb->num_sgs,
+                                  seg->bounce_buf, new_buff_len, enqd_len);
++              if (len != seg->bounce_len)
++                      xhci_warn(xhci,
++                              "WARN Wrong bounce buffer write length: %zu != 
%d\n",
++                              len, seg->bounce_len);
+               seg->bounce_dma = dma_map_single(dev, seg->bounce_buf,
+                                                max_pkt, DMA_TO_DEVICE);
+       } else {
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
+index c78de07c4d00..8893d1566765 100644
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -21,6 +21,7 @@
+  */
+ 
+ #include <linux/pci.h>
++#include <linux/iopoll.h>
+ #include <linux/irq.h>
+ #include <linux/log2.h>
+ #include <linux/module.h>
+@@ -62,7 +63,6 @@ static bool td_on_ring(struct xhci_td *td, struct xhci_ring 
*ring)
+       return false;
+ }
+ 
+-/* TODO: copied from ehci-hcd.c - can this be refactored? */
+ /*
+  * xhci_handshake - spin reading hc until handshake completes or fails
+  * @ptr: address of hc register to be read
+@@ -79,18 +79,16 @@ static bool td_on_ring(struct xhci_td *td, struct 
xhci_ring *ring)
+ int xhci_handshake(void __iomem *ptr, u32 mask, u32 done, int usec)
+ {
+       u32     result;
++      int     ret;
+ 
+-      do {
+-              result = readl(ptr);
+-              if (result == ~(u32)0)          /* card removed */
+-                      return -ENODEV;
+-              result &= mask;
+-              if (result == done)
+-                      return 0;
+-              udelay(1);
+-              usec--;
+-      } while (usec > 0);
+-      return -ETIMEDOUT;
++      ret = readl_poll_timeout_atomic(ptr, result,
++                                      (result & mask) == done ||
++                                      result == U32_MAX,
++                                      1, usec);
++      if (result == U32_MAX)          /* card removed */
++              return -ENODEV;
++
++      return ret;
+ }
+ 
+ /*
+@@ -4155,7 +4153,6 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd 
*hcd,
+       pm_addr = port_array[port_num] + PORTPMSC;
+       pm_val = readl(pm_addr);
+       hlpm_addr = port_array[port_num] + PORTHLPMC;
+-      field = le32_to_cpu(udev->bos->ext_cap->bmAttributes);
+ 
+       xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n",
+                       enable ? "enable" : "disable", port_num + 1);
+@@ -4167,6 +4164,7 @@ static int xhci_set_usb2_hardware_lpm(struct usb_hcd 
*hcd,
+                        * default one which works with mixed HIRD and BESL
+                        * systems. See XHCI_DEFAULT_BESL definition in xhci.h
+                        */
++                      field = le32_to_cpu(udev->bos->ext_cap->bmAttributes);
+                       if ((field & USB_BESL_SUPPORT) &&
+                           (field & USB_BESL_BASELINE_VALID))
+                               hird = USB_GET_BESL_BASELINE(field);
+diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c
+index ddfebb144aaa..c652a4fdc546 100644
+--- a/drivers/usb/misc/rio500.c
++++ b/drivers/usb/misc/rio500.c
+@@ -99,9 +99,22 @@ static int close_rio(struct inode *inode, struct file *file)
+ {
+       struct rio_usb_data *rio = &rio_instance;
+ 
+-      rio->isopen = 0;
++      /* against disconnect() */
++      mutex_lock(&rio500_mutex);
++      mutex_lock(&(rio->lock));
+ 
+-      dev_info(&rio->rio_dev->dev, "Rio closed.\n");
++      rio->isopen = 0;
++      if (!rio->present) {
++              /* cleanup has been delayed */
++              kfree(rio->ibuf);
++              kfree(rio->obuf);
++              rio->ibuf = NULL;
++              rio->obuf = NULL;
++      } else {
++              dev_info(&rio->rio_dev->dev, "Rio closed.\n");
++      }
++      mutex_unlock(&(rio->lock));
++      mutex_unlock(&rio500_mutex);
+       return 0;
+ }
+ 
+@@ -460,15 +473,23 @@ static int probe_rio(struct usb_interface *intf,
+ {
+       struct usb_device *dev = interface_to_usbdev(intf);
+       struct rio_usb_data *rio = &rio_instance;
+-      int retval;
++      int retval = 0;
+ 
+-      dev_info(&intf->dev, "USB Rio found at address %d\n", dev->devnum);
++      mutex_lock(&rio500_mutex);
++      if (rio->present) {
++              dev_info(&intf->dev, "Second USB Rio at address %d refused\n", 
dev->devnum);
++              retval = -EBUSY;
++              goto bail_out;
++      } else {
++              dev_info(&intf->dev, "USB Rio found at address %d\n", 
dev->devnum);
++      }
+ 
+       retval = usb_register_dev(intf, &usb_rio_class);
+       if (retval) {
+               dev_err(&dev->dev,
+                       "Not able to get a minor for this device.\n");
+-              return -ENOMEM;
++              retval = -ENOMEM;
++              goto bail_out;
+       }
+ 
+       rio->rio_dev = dev;
+@@ -477,7 +498,8 @@ static int probe_rio(struct usb_interface *intf,
+               dev_err(&dev->dev,
+                       "probe_rio: Not enough memory for the output buffer\n");
+               usb_deregister_dev(intf, &usb_rio_class);
+-              return -ENOMEM;
++              retval = -ENOMEM;
++              goto bail_out;
+       }
+       dev_dbg(&intf->dev, "obuf address:%p\n", rio->obuf);
+ 
+@@ -486,7 +508,8 @@ static int probe_rio(struct usb_interface *intf,
+                       "probe_rio: Not enough memory for the input buffer\n");
+               usb_deregister_dev(intf, &usb_rio_class);
+               kfree(rio->obuf);
+-              return -ENOMEM;
++              retval = -ENOMEM;
++              goto bail_out;
+       }
+       dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf);
+ 
+@@ -494,8 +517,10 @@ static int probe_rio(struct usb_interface *intf,
+ 
+       usb_set_intfdata (intf, rio);
+       rio->present = 1;
++bail_out:
++      mutex_unlock(&rio500_mutex);
+ 
+-      return 0;
++      return retval;
+ }
+ 
+ static void disconnect_rio(struct usb_interface *intf)
+diff --git a/drivers/usb/misc/sisusbvga/sisusb.c 
b/drivers/usb/misc/sisusbvga/sisusb.c
+index 30774e0aeadd..3121fa31aabf 100644
+--- a/drivers/usb/misc/sisusbvga/sisusb.c
++++ b/drivers/usb/misc/sisusbvga/sisusb.c
+@@ -3028,6 +3028,13 @@ static int sisusb_probe(struct usb_interface *intf,
+ 
+       mutex_init(&(sisusb->lock));
+ 
++      sisusb->sisusb_dev = dev;
++      sisusb->vrambase   = SISUSB_PCI_MEMBASE;
++      sisusb->mmiobase   = SISUSB_PCI_MMIOBASE;
++      sisusb->mmiosize   = SISUSB_PCI_MMIOSIZE;
++      sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
++      /* Everything else is zero */
++
+       /* Register device */
+       retval = usb_register_dev(intf, &usb_sisusb_class);
+       if (retval) {
+@@ -3038,13 +3045,7 @@ static int sisusb_probe(struct usb_interface *intf,
+               goto error_1;
+       }
+ 
+-      sisusb->sisusb_dev = dev;
+-      sisusb->minor      = intf->minor;
+-      sisusb->vrambase   = SISUSB_PCI_MEMBASE;
+-      sisusb->mmiobase   = SISUSB_PCI_MMIOBASE;
+-      sisusb->mmiosize   = SISUSB_PCI_MMIOSIZE;
+-      sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
+-      /* Everything else is zero */
++      sisusb->minor = intf->minor;
+ 
+       /* Allocate buffers */
+       sisusb->ibufsize = SISUSB_IBUF_SIZE;
+diff --git a/drivers/usb/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c
+index cc847f2edf38..5691f8948c21 100644
+--- a/drivers/usb/usbip/stub_dev.c
++++ b/drivers/usb/usbip/stub_dev.c
+@@ -315,9 +315,17 @@ static int stub_probe(struct usb_device *udev)
+       const char *udev_busid = dev_name(&udev->dev);
+       struct bus_id_priv *busid_priv;
+       int rc = 0;
++      char save_status;
+ 
+       dev_dbg(&udev->dev, "Enter probe\n");
+ 
++      /* Not sure if this is our device. Allocate here to avoid
++       * calling alloc while holding busid_table lock.
++       */
++      sdev = stub_device_alloc(udev);
++      if (!sdev)
++              return -ENOMEM;
++
+       /* check we should claim or not by busid_table */
+       busid_priv = get_busid_priv(udev_busid);
+       if (!busid_priv || (busid_priv->status == STUB_BUSID_REMOV) ||
+@@ -332,6 +340,9 @@ static int stub_probe(struct usb_device *udev)
+                * See driver_probe_device() in driver/base/dd.c
+                */
+               rc = -ENODEV;
++              if (!busid_priv)
++                      goto sdev_free;
++
+               goto call_put_busid_priv;
+       }
+ 
+@@ -351,12 +362,6 @@ static int stub_probe(struct usb_device *udev)
+               goto call_put_busid_priv;
+       }
+ 
+-      /* ok, this is my device */
+-      sdev = stub_device_alloc(udev);
+-      if (!sdev) {
+-              rc = -ENOMEM;
+-              goto call_put_busid_priv;
+-      }
+ 
+       dev_info(&udev->dev,
+               "usbip-host: register new device (bus %u dev %u)\n",
+@@ -366,9 +371,16 @@ static int stub_probe(struct usb_device *udev)
+ 
+       /* set private data to usb_device */
+       dev_set_drvdata(&udev->dev, sdev);
++
+       busid_priv->sdev = sdev;
+       busid_priv->udev = udev;
+ 
++      save_status = busid_priv->status;
++      busid_priv->status = STUB_BUSID_ALLOC;
++
++      /* release the busid_lock */
++      put_busid_priv(busid_priv);
++
+       /*
+        * Claim this hub port.
+        * It doesn't matter what value we pass as owner
+@@ -386,10 +398,8 @@ static int stub_probe(struct usb_device *udev)
+               dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid);
+               goto err_files;
+       }
+-      busid_priv->status = STUB_BUSID_ALLOC;
+ 
+-      rc = 0;
+-      goto call_put_busid_priv;
++      return 0;
+ 
+ err_files:
+       usb_hub_release_port(udev->parent, udev->portnum,
+@@ -398,23 +408,30 @@ err_port:
+       dev_set_drvdata(&udev->dev, NULL);
+       usb_put_dev(udev);
+ 
++      /* we already have busid_priv, just lock busid_lock */
++      spin_lock(&busid_priv->busid_lock);
+       busid_priv->sdev = NULL;
+-      stub_device_free(sdev);
++      busid_priv->status = save_status;
++      spin_unlock(&busid_priv->busid_lock);
++      /* lock is released - go to free */
++      goto sdev_free;
+ 
+ call_put_busid_priv:
++      /* release the busid_lock */
+       put_busid_priv(busid_priv);
++
++sdev_free:
++      stub_device_free(sdev);
++
+       return rc;
+ }
+ 
+ static void shutdown_busid(struct bus_id_priv *busid_priv)
+ {
+-      if (busid_priv->sdev && !busid_priv->shutdown_busid) {
+-              busid_priv->shutdown_busid = 1;
+-              usbip_event_add(&busid_priv->sdev->ud, SDEV_EVENT_REMOVED);
++      usbip_event_add(&busid_priv->sdev->ud, SDEV_EVENT_REMOVED);
+ 
+-              /* wait for the stop of the event handler */
+-              usbip_stop_eh(&busid_priv->sdev->ud);
+-      }
++      /* wait for the stop of the event handler */
++      usbip_stop_eh(&busid_priv->sdev->ud);
+ }
+ 
+ /*
+@@ -441,11 +458,16 @@ static void stub_disconnect(struct usb_device *udev)
+       /* get stub_device */
+       if (!sdev) {
+               dev_err(&udev->dev, "could not get device");
+-              goto call_put_busid_priv;
++              /* release busid_lock */
++              put_busid_priv(busid_priv);
++              return;
+       }
+ 
+       dev_set_drvdata(&udev->dev, NULL);
+ 
++      /* release busid_lock before call to remove device files */
++      put_busid_priv(busid_priv);
++
+       /*
+        * NOTE: rx/tx threads are invoked for each usb_device.
+        */
+@@ -456,27 +478,36 @@ static void stub_disconnect(struct usb_device *udev)
+                                 (struct usb_dev_state *) udev);
+       if (rc) {
+               dev_dbg(&udev->dev, "unable to release port\n");
+-              goto call_put_busid_priv;
++              return;
+       }
+ 
+       /* If usb reset is called from event handler */
+       if (usbip_in_eh(current))
+-              goto call_put_busid_priv;
++              return;
++
++      /* we already have busid_priv, just lock busid_lock */
++      spin_lock(&busid_priv->busid_lock);
++      if (!busid_priv->shutdown_busid)
++              busid_priv->shutdown_busid = 1;
++      /* release busid_lock */
++      spin_unlock(&busid_priv->busid_lock);
+ 
+       /* shutdown the current connection */
+       shutdown_busid(busid_priv);
+ 
+       usb_put_dev(sdev->udev);
+ 
++      /* we already have busid_priv, just lock busid_lock */
++      spin_lock(&busid_priv->busid_lock);
+       /* free sdev */
+       busid_priv->sdev = NULL;
+       stub_device_free(sdev);
+ 
+       if (busid_priv->status == STUB_BUSID_ALLOC)
+               busid_priv->status = STUB_BUSID_ADDED;
+-
+-call_put_busid_priv:
+-      put_busid_priv(busid_priv);
++      /* release busid_lock */
++      spin_unlock(&busid_priv->busid_lock);
++      return;
+ }
+ 
+ #ifdef CONFIG_PM
+diff --git a/drivers/xen/xen-pciback/pciback_ops.c 
b/drivers/xen/xen-pciback/pciback_ops.c
+index ee2c891b55c6..7af047008ea2 100644
+--- a/drivers/xen/xen-pciback/pciback_ops.c
++++ b/drivers/xen/xen-pciback/pciback_ops.c
+@@ -127,8 +127,6 @@ void xen_pcibk_reset_device(struct pci_dev *dev)
+               if (pci_is_enabled(dev))
+                       pci_disable_device(dev);
+ 
+-              pci_write_config_word(dev, PCI_COMMAND, 0);
+-
+               dev->is_busmaster = 0;
+       } else {
+               pci_read_config_word(dev, PCI_COMMAND, &cmd);
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index 7e288510fd2c..ea7b65c025c2 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -6580,8 +6580,18 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
+       btrfs_i_size_write(parent_inode, parent_inode->vfs_inode.i_size +
+                          name_len * 2);
+       inode_inc_iversion(&parent_inode->vfs_inode);
+-      parent_inode->vfs_inode.i_mtime = parent_inode->vfs_inode.i_ctime =
+-              current_time(&parent_inode->vfs_inode);
++      /*
++       * If we are replaying a log tree, we do not want to update the mtime
++       * and ctime of the parent directory with the current time, since the
++       * log replay procedure is responsible for setting them to their correct
++       * values (the ones it had when the fsync was done).
++       */
++      if (!test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags)) {
++              struct timespec now = current_time(&parent_inode->vfs_inode);
++
++              parent_inode->vfs_inode.i_mtime = now;
++              parent_inode->vfs_inode.i_ctime = now;
++      }
+       ret = btrfs_update_inode(trans, root, &parent_inode->vfs_inode);
+       if (ret)
+               btrfs_abort_transaction(trans, ret);
+diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
+index 3f22af96d63b..14c4062a6e58 100644
+--- a/fs/btrfs/send.c
++++ b/fs/btrfs/send.c
+@@ -5013,6 +5013,12 @@ static int send_hole(struct send_ctx *sctx, u64 end)
+       u64 len;
+       int ret = 0;
+ 
++      /*
++       * Don't go beyond the inode's i_size due to prealloc extents that start
++       * after the i_size.
++       */
++      end = min_t(u64, end, sctx->cur_inode_size);
++
+       if (sctx->flags & BTRFS_SEND_FLAG_NO_FILE_DATA)
+               return send_update_extent(sctx, offset, end - offset);
+ 
+diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
+index d19129e9e7ad..8ac6a64d0422 100644
+--- a/fs/btrfs/tree-log.c
++++ b/fs/btrfs/tree-log.c
+@@ -2906,6 +2906,12 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
+       root->log_transid++;
+       log->log_transid = root->log_transid;
+       root->log_start_pid = 0;
++      /*
++       * Update or create log root item under the root's log_mutex to prevent
++       * races with concurrent log syncs that can lead to failure to update
++       * log root item because it was not created yet.
++       */
++      ret = update_log_root(trans, log);
+       /*
+        * IO has been started, blocks of the log tree have WRITTEN flag set
+        * in their headers. new modifications of the log will be written to
+@@ -2925,8 +2931,6 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
+ 
+       mutex_unlock(&log_root_tree->log_mutex);
+ 
+-      ret = update_log_root(trans, log);
+-
+       mutex_lock(&log_root_tree->log_mutex);
+       if (atomic_dec_and_test(&log_root_tree->log_writers)) {
+               /*
+@@ -5328,7 +5332,6 @@ static noinline int check_parent_dirs_for_sync(struct 
btrfs_trans_handle *trans,
+ {
+       int ret = 0;
+       struct dentry *old_parent = NULL;
+-      struct btrfs_inode *orig_inode = inode;
+ 
+       /*
+        * for regular files, if its inode is already on disk, we don't
+@@ -5348,16 +5351,6 @@ static noinline int check_parent_dirs_for_sync(struct 
btrfs_trans_handle *trans,
+       }
+ 
+       while (1) {
+-              /*
+-               * If we are logging a directory then we start with our inode,
+-               * not our parent's inode, so we need to skip setting the
+-               * logged_trans so that further down in the log code we don't
+-               * think this inode has already been logged.
+-               */
+-              if (inode != orig_inode)
+-                      inode->logged_trans = trans->transid;
+-              smp_mb();
+-
+               if (btrfs_must_commit_transaction(trans, inode)) {
+                       ret = 1;
+                       break;
+@@ -6087,7 +6080,6 @@ void btrfs_record_unlink_dir(struct btrfs_trans_handle 
*trans,
+        * if this directory was already logged any new
+        * names for this file/dir will get recorded
+        */
+-      smp_mb();
+       if (dir->logged_trans == trans->transid)
+               return;
+ 
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index 48ea9dfd5f02..6ee8f9270892 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -2984,7 +2984,9 @@ cifs_read_allocate_pages(struct cifs_readdata *rdata, 
unsigned int nr_pages)
+       }
+ 
+       if (rc) {
+-              for (i = 0; i < nr_pages; i++) {
++              unsigned int nr_page_failed = i;
++
++              for (i = 0; i < nr_page_failed; i++) {
+                       put_page(rdata->pages[i]);
+                       rdata->pages[i] = NULL;
+               }
+diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c
+index 9846f7e95282..7147e4aebecc 100644
+--- a/fs/lockd/xdr.c
++++ b/fs/lockd/xdr.c
+@@ -127,7 +127,7 @@ nlm_decode_lock(__be32 *p, struct nlm_lock *lock)
+ 
+       locks_init_lock(fl);
+       fl->fl_owner = current->files;
+-      fl->fl_pid   = current->tgid;
++      fl->fl_pid   = (pid_t)lock->svid;
+       fl->fl_flags = FL_POSIX;
+       fl->fl_type  = F_RDLCK;         /* as good as anything else */
+       start = ntohl(*p++);
+@@ -269,7 +269,7 @@ nlmsvc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
+       memset(lock, 0, sizeof(*lock));
+       locks_init_lock(&lock->fl);
+       lock->svid = ~(u32) 0;
+-      lock->fl.fl_pid = current->tgid;
++      lock->fl.fl_pid = (pid_t)lock->svid;
+ 
+       if (!(p = nlm_decode_cookie(p, &argp->cookie))
+        || !(p = xdr_decode_string_inplace(p, &lock->caller,
+diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
+index 70154f376695..7ed9edf9aed4 100644
+--- a/fs/lockd/xdr4.c
++++ b/fs/lockd/xdr4.c
+@@ -119,7 +119,7 @@ nlm4_decode_lock(__be32 *p, struct nlm_lock *lock)
+ 
+       locks_init_lock(fl);
+       fl->fl_owner = current->files;
+-      fl->fl_pid   = current->tgid;
++      fl->fl_pid   = (pid_t)lock->svid;
+       fl->fl_flags = FL_POSIX;
+       fl->fl_type  = F_RDLCK;         /* as good as anything else */
+       p = xdr_decode_hyper(p, &start);
+@@ -266,7 +266,7 @@ nlm4svc_decode_shareargs(struct svc_rqst *rqstp, __be32 *p)
+       memset(lock, 0, sizeof(*lock));
+       locks_init_lock(&lock->fl);
+       lock->svid = ~(u32) 0;
+-      lock->fl.fl_pid = current->tgid;
++      lock->fl.fl_pid = (pid_t)lock->svid;
+ 
+       if (!(p = nlm4_decode_cookie(p, &argp->cookie))
+        || !(p = xdr_decode_string_inplace(p, &lock->caller,
+diff --git a/include/linux/bitops.h b/include/linux/bitops.h
+index 43373e41f2f4..b767c7ad65c6 100644
+--- a/include/linux/bitops.h
++++ b/include/linux/bitops.h
+@@ -59,7 +59,7 @@ static __always_inline unsigned long hweight_long(unsigned 
long w)
+  */
+ static inline __u64 rol64(__u64 word, unsigned int shift)
+ {
+-      return (word << shift) | (word >> (64 - shift));
++      return (word << (shift & 63)) | (word >> ((-shift) & 63));
+ }
+ 
+ /**
+@@ -69,7 +69,7 @@ static inline __u64 rol64(__u64 word, unsigned int shift)
+  */
+ static inline __u64 ror64(__u64 word, unsigned int shift)
+ {
+-      return (word >> shift) | (word << (64 - shift));
++      return (word >> (shift & 63)) | (word << ((-shift) & 63));
+ }
+ 
+ /**
+@@ -79,7 +79,7 @@ static inline __u64 ror64(__u64 word, unsigned int shift)
+  */
+ static inline __u32 rol32(__u32 word, unsigned int shift)
+ {
+-      return (word << shift) | (word >> ((-shift) & 31));
++      return (word << (shift & 31)) | (word >> ((-shift) & 31));
+ }
+ 
+ /**
+@@ -89,7 +89,7 @@ static inline __u32 rol32(__u32 word, unsigned int shift)
+  */
+ static inline __u32 ror32(__u32 word, unsigned int shift)
+ {
+-      return (word >> shift) | (word << (32 - shift));
++      return (word >> (shift & 31)) | (word << ((-shift) & 31));
+ }
+ 
+ /**
+@@ -99,7 +99,7 @@ static inline __u32 ror32(__u32 word, unsigned int shift)
+  */
+ static inline __u16 rol16(__u16 word, unsigned int shift)
+ {
+-      return (word << shift) | (word >> (16 - shift));
++      return (word << (shift & 15)) | (word >> ((-shift) & 15));
+ }
+ 
+ /**
+@@ -109,7 +109,7 @@ static inline __u16 rol16(__u16 word, unsigned int shift)
+  */
+ static inline __u16 ror16(__u16 word, unsigned int shift)
+ {
+-      return (word >> shift) | (word << (16 - shift));
++      return (word >> (shift & 15)) | (word << ((-shift) & 15));
+ }
+ 
+ /**
+@@ -119,7 +119,7 @@ static inline __u16 ror16(__u16 word, unsigned int shift)
+  */
+ static inline __u8 rol8(__u8 word, unsigned int shift)
+ {
+-      return (word << shift) | (word >> (8 - shift));
++      return (word << (shift & 7)) | (word >> ((-shift) & 7));
+ }
+ 
+ /**
+@@ -129,7 +129,7 @@ static inline __u8 rol8(__u8 word, unsigned int shift)
+  */
+ static inline __u8 ror8(__u8 word, unsigned int shift)
+ {
+-      return (word >> shift) | (word << (8 - shift));
++      return (word >> (shift & 7)) | (word << ((-shift) & 7));
+ }
+ 
+ /**
+diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
+index 4816355b9875..6d7ead22c1b4 100644
+--- a/include/linux/compiler-gcc.h
++++ b/include/linux/compiler-gcc.h
+@@ -343,6 +343,10 @@
+ #define __designated_init __attribute__((designated_init))
+ #endif
+ 
++#if GCC_VERSION >= 90100
++#define __copy(symbol)                 __attribute__((__copy__(symbol)))
++#endif
++
+ #endif        /* gcc version >= 40000 specific checks */
+ 
+ #if !defined(__noclone)
+diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
+index 4be464a07612..222fcefaa6a7 100644
+--- a/include/linux/compiler_types.h
++++ b/include/linux/compiler_types.h
+@@ -230,6 +230,10 @@ struct ftrace_likely_data {
+ # define __latent_entropy
+ #endif
+ 
++#ifndef __copy
++# define __copy(symbol)
++#endif
++
+ #ifndef __randomize_layout
+ # define __randomize_layout __designated_init
+ #endif
+diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h
+index bb8129a3474d..7fbea46cf9ee 100644
+--- a/include/linux/list_lru.h
++++ b/include/linux/list_lru.h
+@@ -52,6 +52,7 @@ struct list_lru {
+       struct list_lru_node    *node;
+ #if defined(CONFIG_MEMCG) && !defined(CONFIG_SLOB)
+       struct list_head        list;
++      bool                    memcg_aware;
+ #endif
+ };
+ 
+diff --git a/include/linux/module.h b/include/linux/module.h
+index a9d546c5b9aa..c290de08c830 100644
+--- a/include/linux/module.h
++++ b/include/linux/module.h
+@@ -128,13 +128,13 @@ extern void cleanup_module(void);
+ #define module_init(initfn)                                   \
+       static inline initcall_t __maybe_unused __inittest(void)                
\
+       { return initfn; }                                      \
+-      int init_module(void) __attribute__((alias(#initfn)));
++      int init_module(void) __copy(initfn) __attribute__((alias(#initfn)));
+ 
+ /* This is only required if you want to be unloadable. */
+ #define module_exit(exitfn)                                   \
+       static inline exitcall_t __maybe_unused __exittest(void)                
\
+       { return exitfn; }                                      \
+-      void cleanup_module(void) __attribute__((alias(#exitfn)));
++      void cleanup_module(void) __copy(exitfn) 
__attribute__((alias(#exitfn)));
+ 
+ #endif
+ 
+diff --git a/include/linux/siphash.h b/include/linux/siphash.h
+index fa7a6b9cedbf..bf21591a9e5e 100644
+--- a/include/linux/siphash.h
++++ b/include/linux/siphash.h
+@@ -21,6 +21,11 @@ typedef struct {
+       u64 key[2];
+ } siphash_key_t;
+ 
++static inline bool siphash_key_is_zero(const siphash_key_t *key)
++{
++      return !(key->key[0] | key->key[1]);
++}
++
+ u64 __siphash_aligned(const void *data, size_t len, const siphash_key_t *key);
+ #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+ u64 __siphash_unaligned(const void *data, size_t len, const siphash_key_t 
*key);
+diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h
+index 8fcff2837484..a2e4adafd34d 100644
+--- a/include/net/netns/ipv4.h
++++ b/include/net/netns/ipv4.h
+@@ -9,6 +9,7 @@
+ #include <linux/uidgid.h>
+ #include <net/inet_frag.h>
+ #include <linux/rcupdate.h>
++#include <linux/siphash.h>
+ 
+ struct tcpm_hash_bucket;
+ struct ctl_table_header;
+@@ -164,5 +165,6 @@ struct netns_ipv4 {
+       unsigned int    fib_seq;        /* protected by rtnl_mutex */
+ 
+       atomic_t        rt_genid;
++      siphash_key_t   ip_id_key;
+ };
+ #endif
+diff --git a/include/uapi/linux/tipc_config.h 
b/include/uapi/linux/tipc_config.h
+index 3f29e3c8ed06..6206d962390b 100644
+--- a/include/uapi/linux/tipc_config.h
++++ b/include/uapi/linux/tipc_config.h
+@@ -302,8 +302,10 @@ static inline int TLV_SET(void *tlv, __u16 type, void 
*data, __u16 len)
+       tlv_ptr = (struct tlv_desc *)tlv;
+       tlv_ptr->tlv_type = htons(type);
+       tlv_ptr->tlv_len  = htons(tlv_len);
+-      if (len && data)
+-              memcpy(TLV_DATA(tlv_ptr), data, tlv_len);
++      if (len && data) {
++              memcpy(TLV_DATA(tlv_ptr), data, len);
++              memset(TLV_DATA(tlv_ptr) + len, 0, TLV_SPACE(len) - tlv_len);
++      }
+       return TLV_SPACE(len);
+ }
+ 
+@@ -400,8 +402,10 @@ static inline int TCM_SET(void *msg, __u16 cmd, __u16 
flags,
+       tcm_hdr->tcm_len   = htonl(msg_len);
+       tcm_hdr->tcm_type  = htons(cmd);
+       tcm_hdr->tcm_flags = htons(flags);
+-      if (data_len && data)
++      if (data_len && data) {
+               memcpy(TCM_DATA(msg), data, data_len);
++              memset(TCM_DATA(msg) + data_len, 0, TCM_SPACE(data_len) - 
msg_len);
++      }
+       return TCM_SPACE(data_len);
+ }
+ 
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 619c6160f64f..bb801156628e 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -2271,6 +2271,8 @@ relock:
+       if (signal_group_exit(signal)) {
+               ksig->info.si_signo = signr = SIGKILL;
+               sigdelset(&current->pending.signal, SIGKILL);
++              trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
++                              &sighand->action[SIGKILL - 1]);
+               recalc_sigpending();
+               goto fatal;
+       }
+diff --git a/mm/list_lru.c b/mm/list_lru.c
+index f141f0c80ff3..dc19694d0e92 100644
+--- a/mm/list_lru.c
++++ b/mm/list_lru.c
+@@ -42,11 +42,7 @@ static void list_lru_unregister(struct list_lru *lru)
+ #if defined(CONFIG_MEMCG) && !defined(CONFIG_SLOB)
+ static inline bool list_lru_memcg_aware(struct list_lru *lru)
+ {
+-      /*
+-       * This needs node 0 to be always present, even
+-       * in the systems supporting sparse numa ids.
+-       */
+-      return !!lru->node[0].memcg_lrus;
++      return lru->memcg_aware;
+ }
+ 
+ static inline struct list_lru_one *
+@@ -389,6 +385,8 @@ static int memcg_init_list_lru(struct list_lru *lru, bool 
memcg_aware)
+ {
+       int i;
+ 
++      lru->memcg_aware = memcg_aware;
++
+       if (!memcg_aware)
+               return 0;
+ 
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 1212c814b3bc..08c0e7613ef6 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -5067,7 +5067,6 @@ static struct sk_buff *napi_frags_skb(struct napi_struct 
*napi)
+       skb_reset_mac_header(skb);
+       skb_gro_reset_offset(skb);
+ 
+-      eth = skb_gro_header_fast(skb, 0);
+       if (unlikely(skb_gro_header_hard(skb, hlen))) {
+               eth = skb_gro_header_slow(skb, hlen, 0);
+               if (unlikely(!eth)) {
+@@ -5077,6 +5076,7 @@ static struct sk_buff *napi_frags_skb(struct napi_struct 
*napi)
+                       return NULL;
+               }
+       } else {
++              eth = (const struct ethhdr *)skb->data;
+               gro_pull_from_frag0(skb, hlen);
+               NAPI_GRO_CB(skb)->frag0 += hlen;
+               NAPI_GRO_CB(skb)->frag0_len -= hlen;
+diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
+index 502aae3e3ab8..94604f9bd0d7 100644
+--- a/net/ipv4/igmp.c
++++ b/net/ipv4/igmp.c
+@@ -190,6 +190,17 @@ static void ip_ma_put(struct ip_mc_list *im)
+            pmc != NULL;                                       \
+            pmc = rtnl_dereference(pmc->next_rcu))
+ 
++static void ip_sf_list_clear_all(struct ip_sf_list *psf)
++{
++      struct ip_sf_list *next;
++
++      while (psf) {
++              next = psf->sf_next;
++              kfree(psf);
++              psf = next;
++      }
++}
++
+ #ifdef CONFIG_IP_MULTICAST
+ 
+ /*
+@@ -635,6 +646,13 @@ static void igmpv3_clear_zeros(struct ip_sf_list **ppsf)
+       }
+ }
+ 
++static void kfree_pmc(struct ip_mc_list *pmc)
++{
++      ip_sf_list_clear_all(pmc->sources);
++      ip_sf_list_clear_all(pmc->tomb);
++      kfree(pmc);
++}
++
+ static void igmpv3_send_cr(struct in_device *in_dev)
+ {
+       struct ip_mc_list *pmc, *pmc_prev, *pmc_next;
+@@ -671,7 +689,7 @@ static void igmpv3_send_cr(struct in_device *in_dev)
+                       else
+                               in_dev->mc_tomb = pmc_next;
+                       in_dev_put(pmc->interface);
+-                      kfree(pmc);
++                      kfree_pmc(pmc);
+               } else
+                       pmc_prev = pmc;
+       }
+@@ -1203,12 +1221,16 @@ static void igmpv3_del_delrec(struct in_device 
*in_dev, struct ip_mc_list *im)
+               im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
+               if (im->sfmode == MCAST_INCLUDE) {
+                       im->tomb = pmc->tomb;
++                      pmc->tomb = NULL;
++
+                       im->sources = pmc->sources;
++                      pmc->sources = NULL;
++
+                       for (psf = im->sources; psf; psf = psf->sf_next)
+                               psf->sf_crcount = im->crcount;
+               }
+               in_dev_put(pmc->interface);
+-              kfree(pmc);
++              kfree_pmc(pmc);
+       }
+       spin_unlock_bh(&im->lock);
+ }
+@@ -1229,21 +1251,18 @@ static void igmpv3_clear_delrec(struct in_device 
*in_dev)
+               nextpmc = pmc->next;
+               ip_mc_clear_src(pmc);
+               in_dev_put(pmc->interface);
+-              kfree(pmc);
++              kfree_pmc(pmc);
+       }
+       /* clear dead sources, too */
+       rcu_read_lock();
+       for_each_pmc_rcu(in_dev, pmc) {
+-              struct ip_sf_list *psf, *psf_next;
++              struct ip_sf_list *psf;
+ 
+               spin_lock_bh(&pmc->lock);
+               psf = pmc->tomb;
+               pmc->tomb = NULL;
+               spin_unlock_bh(&pmc->lock);
+-              for (; psf; psf = psf_next) {
+-                      psf_next = psf->sf_next;
+-                      kfree(psf);
+-              }
++              ip_sf_list_clear_all(psf);
+       }
+       rcu_read_unlock();
+ }
+@@ -2107,7 +2126,7 @@ static int ip_mc_add_src(struct in_device *in_dev, 
__be32 *pmca, int sfmode,
+ 
+ static void ip_mc_clear_src(struct ip_mc_list *pmc)
+ {
+-      struct ip_sf_list *psf, *nextpsf, *tomb, *sources;
++      struct ip_sf_list *tomb, *sources;
+ 
+       spin_lock_bh(&pmc->lock);
+       tomb = pmc->tomb;
+@@ -2119,14 +2138,8 @@ static void ip_mc_clear_src(struct ip_mc_list *pmc)
+       pmc->sfcount[MCAST_EXCLUDE] = 1;
+       spin_unlock_bh(&pmc->lock);
+ 
+-      for (psf = tomb; psf; psf = nextpsf) {
+-              nextpsf = psf->sf_next;
+-              kfree(psf);
+-      }
+-      for (psf = sources; psf; psf = nextpsf) {
+-              nextpsf = psf->sf_next;
+-              kfree(psf);
+-      }
++      ip_sf_list_clear_all(tomb);
++      ip_sf_list_clear_all(sources);
+ }
+ 
+ /* Join a multicast group
+diff --git a/net/ipv4/route.c b/net/ipv4/route.c
+index 6a7e187dd0a9..3b72990a8bb9 100644
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -517,15 +517,17 @@ EXPORT_SYMBOL(ip_idents_reserve);
+ 
+ void __ip_select_ident(struct net *net, struct iphdr *iph, int segs)
+ {
+-      static u32 ip_idents_hashrnd __read_mostly;
+       u32 hash, id;
+ 
+-      net_get_random_once(&ip_idents_hashrnd, sizeof(ip_idents_hashrnd));
++      /* Note the following code is not safe, but this is okay. */
++      if (unlikely(siphash_key_is_zero(&net->ipv4.ip_id_key)))
++              get_random_bytes(&net->ipv4.ip_id_key,
++                               sizeof(net->ipv4.ip_id_key));
+ 
+-      hash = jhash_3words((__force u32)iph->daddr,
++      hash = siphash_3u32((__force u32)iph->daddr,
+                           (__force u32)iph->saddr,
+-                          iph->protocol ^ net_hash_mix(net),
+-                          ip_idents_hashrnd);
++                          iph->protocol,
++                          &net->ipv4.ip_id_key);
+       id = ip_idents_reserve(hash, segs);
+       iph->id = htons(id);
+ }
+diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
+index 4fe7c90962dd..868ae23dbae1 100644
+--- a/net/ipv6/output_core.c
++++ b/net/ipv6/output_core.c
+@@ -10,15 +10,25 @@
+ #include <net/secure_seq.h>
+ #include <linux/netfilter.h>
+ 
+-static u32 __ipv6_select_ident(struct net *net, u32 hashrnd,
++static u32 __ipv6_select_ident(struct net *net,
+                              const struct in6_addr *dst,
+                              const struct in6_addr *src)
+ {
++      const struct {
++              struct in6_addr dst;
++              struct in6_addr src;
++      } __aligned(SIPHASH_ALIGNMENT) combined = {
++              .dst = *dst,
++              .src = *src,
++      };
+       u32 hash, id;
+ 
+-      hash = __ipv6_addr_jhash(dst, hashrnd);
+-      hash = __ipv6_addr_jhash(src, hash);
+-      hash ^= net_hash_mix(net);
++      /* Note the following code is not safe, but this is okay. */
++      if (unlikely(siphash_key_is_zero(&net->ipv4.ip_id_key)))
++              get_random_bytes(&net->ipv4.ip_id_key,
++                               sizeof(net->ipv4.ip_id_key));
++
++      hash = siphash(&combined, sizeof(combined), &net->ipv4.ip_id_key);
+ 
+       /* Treat id of 0 as unset and if we get 0 back from ip_idents_reserve,
+        * set the hight order instead thus minimizing possible future
+@@ -41,7 +51,6 @@ static u32 __ipv6_select_ident(struct net *net, u32 hashrnd,
+  */
+ __be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb)
+ {
+-      static u32 ip6_proxy_idents_hashrnd __read_mostly;
+       struct in6_addr buf[2];
+       struct in6_addr *addrs;
+       u32 id;
+@@ -53,11 +62,7 @@ __be32 ipv6_proxy_select_ident(struct net *net, struct 
sk_buff *skb)
+       if (!addrs)
+               return 0;
+ 
+-      net_get_random_once(&ip6_proxy_idents_hashrnd,
+-                          sizeof(ip6_proxy_idents_hashrnd));
+-
+-      id = __ipv6_select_ident(net, ip6_proxy_idents_hashrnd,
+-                               &addrs[1], &addrs[0]);
++      id = __ipv6_select_ident(net, &addrs[1], &addrs[0]);
+       return htonl(id);
+ }
+ EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident);
+@@ -66,12 +71,9 @@ __be32 ipv6_select_ident(struct net *net,
+                        const struct in6_addr *daddr,
+                        const struct in6_addr *saddr)
+ {
+-      static u32 ip6_idents_hashrnd __read_mostly;
+       u32 id;
+ 
+-      net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd));
+-
+-      id = __ipv6_select_ident(net, ip6_idents_hashrnd, daddr, saddr);
++      id = __ipv6_select_ident(net, daddr, saddr);
+       return htonl(id);
+ }
+ EXPORT_SYMBOL(ipv6_select_ident);
+diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
+index f08cc6527339..8f409031d245 100644
+--- a/net/ipv6/raw.c
++++ b/net/ipv6/raw.c
+@@ -288,7 +288,9 @@ static int rawv6_bind(struct sock *sk, struct sockaddr 
*uaddr, int addr_len)
+                       /* Binding to link-local address requires an interface 
*/
+                       if (!sk->sk_bound_dev_if)
+                               goto out_unlock;
++              }
+ 
++              if (sk->sk_bound_dev_if) {
+                       err = -ENODEV;
+                       dev = dev_get_by_index_rcu(sock_net(sk),
+                                                  sk->sk_bound_dev_if);
+diff --git a/net/llc/llc_output.c b/net/llc/llc_output.c
+index 94425e421213..9e4b6bcf6920 100644
+--- a/net/llc/llc_output.c
++++ b/net/llc/llc_output.c
+@@ -72,6 +72,8 @@ int llc_build_and_send_ui_pkt(struct llc_sap *sap, struct 
sk_buff *skb,
+       rc = llc_mac_hdr_init(skb, skb->dev->dev_addr, dmac);
+       if (likely(!rc))
+               rc = dev_queue_xmit(skb);
++      else
++              kfree_skb(skb);
+       return rc;
+ }
+ 
+diff --git a/net/tipc/core.c b/net/tipc/core.c
+index 297430beaa7f..7561e64c220e 100644
+--- a/net/tipc/core.c
++++ b/net/tipc/core.c
+@@ -62,10 +62,6 @@ static int __net_init tipc_init_net(struct net *net)
+       INIT_LIST_HEAD(&tn->node_list);
+       spin_lock_init(&tn->node_list_lock);
+ 
+-      err = tipc_socket_init();
+-      if (err)
+-              goto out_socket;
+-
+       err = tipc_sk_rht_init(net);
+       if (err)
+               goto out_sk_rht;
+@@ -75,9 +71,6 @@ static int __net_init tipc_init_net(struct net *net)
+               goto out_nametbl;
+ 
+       INIT_LIST_HEAD(&tn->dist_queue);
+-      err = tipc_topsrv_start(net);
+-      if (err)
+-              goto out_subscr;
+ 
+       err = tipc_bcast_init(net);
+       if (err)
+@@ -86,25 +79,19 @@ static int __net_init tipc_init_net(struct net *net)
+       return 0;
+ 
+ out_bclink:
+-      tipc_bcast_stop(net);
+-out_subscr:
+       tipc_nametbl_stop(net);
+ out_nametbl:
+       tipc_sk_rht_destroy(net);
+ out_sk_rht:
+-      tipc_socket_stop();
+-out_socket:
+       return err;
+ }
+ 
+ static void __net_exit tipc_exit_net(struct net *net)
+ {
+-      tipc_topsrv_stop(net);
+       tipc_net_stop(net);
+       tipc_bcast_stop(net);
+       tipc_nametbl_stop(net);
+       tipc_sk_rht_destroy(net);
+-      tipc_socket_stop();
+ }
+ 
+ static struct pernet_operations tipc_net_ops = {
+@@ -114,6 +101,11 @@ static struct pernet_operations tipc_net_ops = {
+       .size = sizeof(struct tipc_net),
+ };
+ 
++static struct pernet_operations tipc_topsrv_net_ops = {
++      .init = tipc_topsrv_init_net,
++      .exit = tipc_topsrv_exit_net,
++};
++
+ static int __init tipc_init(void)
+ {
+       int err;
+@@ -140,6 +132,14 @@ static int __init tipc_init(void)
+       if (err)
+               goto out_pernet;
+ 
++      err = tipc_socket_init();
++      if (err)
++              goto out_socket;
++
++      err = register_pernet_subsys(&tipc_topsrv_net_ops);
++      if (err)
++              goto out_pernet_topsrv;
++
+       err = tipc_bearer_setup();
+       if (err)
+               goto out_bearer;
+@@ -147,6 +147,10 @@ static int __init tipc_init(void)
+       pr_info("Started in single node mode\n");
+       return 0;
+ out_bearer:
++      unregister_pernet_subsys(&tipc_topsrv_net_ops);
++out_pernet_topsrv:
++      tipc_socket_stop();
++out_socket:
+       unregister_pernet_subsys(&tipc_net_ops);
+ out_pernet:
+       tipc_unregister_sysctl();
+@@ -162,6 +166,8 @@ out_netlink:
+ static void __exit tipc_exit(void)
+ {
+       tipc_bearer_cleanup();
++      unregister_pernet_subsys(&tipc_topsrv_net_ops);
++      tipc_socket_stop();
+       unregister_pernet_subsys(&tipc_net_ops);
+       tipc_netlink_stop();
+       tipc_netlink_compat_stop();
+diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
+index 959c9aea3d1a..144fe993c231 100644
+--- a/net/tipc/subscr.c
++++ b/net/tipc/subscr.c
+@@ -344,7 +344,7 @@ static void *tipc_subscrb_connect_cb(int conid)
+       return (void *)tipc_subscrb_create(conid);
+ }
+ 
+-int tipc_topsrv_start(struct net *net)
++static int tipc_topsrv_start(struct net *net)
+ {
+       struct tipc_net *tn = net_generic(net, tipc_net_id);
+       const char name[] = "topology_server";
+@@ -382,7 +382,7 @@ int tipc_topsrv_start(struct net *net)
+       return tipc_server_start(topsrv);
+ }
+ 
+-void tipc_topsrv_stop(struct net *net)
++static void tipc_topsrv_stop(struct net *net)
+ {
+       struct tipc_net *tn = net_generic(net, tipc_net_id);
+       struct tipc_server *topsrv = tn->topsrv;
+@@ -391,3 +391,13 @@ void tipc_topsrv_stop(struct net *net)
+       kfree(topsrv->saddr);
+       kfree(topsrv);
+ }
++
++int __net_init tipc_topsrv_init_net(struct net *net)
++{
++      return tipc_topsrv_start(net);
++}
++
++void __net_exit tipc_topsrv_exit_net(struct net *net)
++{
++      tipc_topsrv_stop(net);
++}
+diff --git a/net/tipc/subscr.h b/net/tipc/subscr.h
+index ee52957dc952..1caed50a8c3a 100644
+--- a/net/tipc/subscr.h
++++ b/net/tipc/subscr.h
+@@ -75,8 +75,9 @@ void tipc_subscrp_report_overlap(struct tipc_subscription 
*sub,
+ void tipc_subscrp_convert_seq(struct tipc_name_seq *in, int swap,
+                             struct tipc_name_seq *out);
+ u32 tipc_subscrp_convert_seq_type(u32 type, int swap);
+-int tipc_topsrv_start(struct net *net);
+-void tipc_topsrv_stop(struct net *net);
++
++int __net_init tipc_topsrv_init_net(struct net *net);
++void __net_exit tipc_topsrv_exit_net(struct net *net);
+ 
+ void tipc_subscrp_put(struct tipc_subscription *subscription);
+ void tipc_subscrp_get(struct tipc_subscription *subscription);
+diff --git a/scripts/gcc-plugins/gcc-common.h 
b/scripts/gcc-plugins/gcc-common.h
+index f46750053377..797e3786b415 100644
+--- a/scripts/gcc-plugins/gcc-common.h
++++ b/scripts/gcc-plugins/gcc-common.h
+@@ -150,8 +150,12 @@ void print_gimple_expr(FILE *, gimple, int, int);
+ void dump_gimple_stmt(pretty_printer *, gimple, int, int);
+ #endif
+ 
++#ifndef __unused
+ #define __unused __attribute__((__unused__))
++#endif
++#ifndef __visible
+ #define __visible __attribute__((visibility("default")))
++#endif
+ 
+ #define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
+ #define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
+diff --git a/security/integrity/ima/ima_policy.c 
b/security/integrity/ima/ima_policy.c
+index 8daf16e1d421..4c160bee67f7 100644
+--- a/security/integrity/ima/ima_policy.c
++++ b/security/integrity/ima/ima_policy.c
+@@ -964,10 +964,10 @@ enum {
+ };
+ 
+ static const char *const mask_tokens[] = {
+-      "MAY_EXEC",
+-      "MAY_WRITE",
+-      "MAY_READ",
+-      "MAY_APPEND"
++      "^MAY_EXEC",
++      "^MAY_WRITE",
++      "^MAY_READ",
++      "^MAY_APPEND"
+ };
+ 
+ #define __ima_hook_stringify(str)     (#str),
+@@ -1027,6 +1027,7 @@ int ima_policy_show(struct seq_file *m, void *v)
+       struct ima_rule_entry *entry = v;
+       int i;
+       char tbuf[64] = {0,};
++      int offset = 0;
+ 
+       rcu_read_lock();
+ 
+@@ -1046,15 +1047,17 @@ int ima_policy_show(struct seq_file *m, void *v)
+       if (entry->flags & IMA_FUNC)
+               policy_func_show(m, entry->func);
+ 
+-      if (entry->flags & IMA_MASK) {
++      if ((entry->flags & IMA_MASK) || (entry->flags & IMA_INMASK)) {
++              if (entry->flags & IMA_MASK)
++                      offset = 1;
+               if (entry->mask & MAY_EXEC)
+-                      seq_printf(m, pt(Opt_mask), mt(mask_exec));
++                      seq_printf(m, pt(Opt_mask), mt(mask_exec) + offset);
+               if (entry->mask & MAY_WRITE)
+-                      seq_printf(m, pt(Opt_mask), mt(mask_write));
++                      seq_printf(m, pt(Opt_mask), mt(mask_write) + offset);
+               if (entry->mask & MAY_READ)
+-                      seq_printf(m, pt(Opt_mask), mt(mask_read));
++                      seq_printf(m, pt(Opt_mask), mt(mask_read) + offset);
+               if (entry->mask & MAY_APPEND)
+-                      seq_printf(m, pt(Opt_mask), mt(mask_append));
++                      seq_printf(m, pt(Opt_mask), mt(mask_append) + offset);
+               seq_puts(m, " ");
+       }
+ 
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index dc62c800cba4..a9e3ee233833 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -7078,7 +7078,7 @@ static int patch_alc269(struct hda_codec *codec)
+ 
+       spec = codec->spec;
+       spec->gen.shared_mic_vref_pin = 0x18;
+-      codec->power_save_node = 1;
++      codec->power_save_node = 0;
+ 
+ #ifdef CONFIG_PM
+       codec->patch_ops.suspend = alc269_suspend;
+diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
+index 4154f98b337c..f574d02ac860 100644
+--- a/virt/kvm/arm/arm.c
++++ b/virt/kvm/arm/arm.c
+@@ -217,6 +217,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
+       case KVM_CAP_MAX_VCPUS:
+               r = KVM_MAX_VCPUS;
+               break;
++      case KVM_CAP_MAX_VCPU_ID:
++              r = KVM_MAX_VCPU_ID;
++              break;
+       case KVM_CAP_NR_MEMSLOTS:
+               r = KVM_USER_MEM_SLOTS;
+               break;
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index b91716b1b428..dbbfcd082513 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -2964,8 +2964,6 @@ static long kvm_vm_ioctl_check_extension_generic(struct 
kvm *kvm, long arg)
+       case KVM_CAP_MULTI_ADDRESS_SPACE:
+               return KVM_ADDRESS_SPACE_NUM;
+ #endif
+-      case KVM_CAP_MAX_VCPU_ID:
+-              return KVM_MAX_VCPU_ID;
+       default:
+               break;
+       }

Reply via email to