commit:     9abebf404153847abc1f7099dcf84b575579e415
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 27 16:59:32 2018 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Nov 27 16:59:32 2018 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=9abebf40

proj/linux-patches: Linux patch 4.4.165

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

 0000_README              |    4 +
 1164_linux-4.4.165.patch | 1675 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1679 insertions(+)

diff --git a/0000_README b/0000_README
index aeea8d7..d3f97eb 100644
--- a/0000_README
+++ b/0000_README
@@ -699,6 +699,10 @@ Patch:  1163_linux-4.4.164.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.4.164
 
+Patch:  1164_linux-4.4.165.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.4.165
+
 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/1164_linux-4.4.165.patch b/1164_linux-4.4.165.patch
new file mode 100644
index 0000000..87f666b
--- /dev/null
+++ b/1164_linux-4.4.165.patch
@@ -0,0 +1,1675 @@
+diff --git a/.gitignore b/.gitignore
+index fd3a35592543..34fe1346aa87 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -33,6 +33,7 @@
+ *.lzo
+ *.patch
+ *.gcno
++*.ll
+ modules.builtin
+ Module.symvers
+ *.dwo
+diff --git a/Kbuild b/Kbuild
+index f55cefd9bf29..f56ed561a284 100644
+--- a/Kbuild
++++ b/Kbuild
+@@ -6,31 +6,6 @@
+ # 3) Generate asm-offsets.h (may need bounds.h and timeconst.h)
+ # 4) Check for missing system calls
+ 
+-# Default sed regexp - multiline due to syntax constraints
+-define sed-y
+-      "/^->/{s:->#\(.*\):/* \1 */:; \
+-      s:^->\([^ ]*\) [\$$#]*\([-0-9]*\) \(.*\):#define \1 \2 /* \3 */:; \
+-      s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
+-      s:->::; p;}"
+-endef
+-
+-# Use filechk to avoid rebuilds when a header changes, but the resulting file
+-# does not
+-define filechk_offsets
+-      (set -e; \
+-       echo "#ifndef $2"; \
+-       echo "#define $2"; \
+-       echo "/*"; \
+-       echo " * DO NOT MODIFY."; \
+-       echo " *"; \
+-       echo " * This file was generated by Kbuild"; \
+-       echo " */"; \
+-       echo ""; \
+-       sed -ne $(sed-y); \
+-       echo ""; \
+-       echo "#endif" )
+-endef
+-
+ #####
+ # 1) Generate bounds.h
+ 
+diff --git a/Makefile b/Makefile
+index 9382e7e4e750..441a760dc5a4 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 4
+-SUBLEVEL = 164
++SUBLEVEL = 165
+ EXTRAVERSION =
+ NAME = Blurry Fish Butt
+ 
+@@ -303,14 +303,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo 
$$BASH; \
+ 
+ HOSTCC       = gcc
+ HOSTCXX      = g++
+-HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 
-fomit-frame-pointer -std=gnu89
++HOSTCFLAGS   := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 
-fomit-frame-pointer -std=gnu89
+ HOSTCXXFLAGS = -O2
+ 
+-ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
+-HOSTCFLAGS  += -Wno-unused-value -Wno-unused-parameter \
+-              -Wno-missing-field-initializers -fno-delete-null-pointer-checks
+-endif
+-
+ # Decide whether to build built-in, modular, or both.
+ # Normally, just do built-in.
+ 
+@@ -612,6 +607,22 @@ endif # $(dot-config)
+ # Defaults to vmlinux, but the arch makefile usually adds further targets
+ all: vmlinux
+ 
++ifeq ($(cc-name),clang)
++ifneq ($(CROSS_COMPILE),)
++CLANG_TARGET  := --target=$(notdir $(CROSS_COMPILE:%-=%))
++GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
++CLANG_PREFIX  := --prefix=$(GCC_TOOLCHAIN_DIR)
++GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
++endif
++ifneq ($(GCC_TOOLCHAIN),)
++CLANG_GCC_TC  := --gcc-toolchain=$(GCC_TOOLCHAIN)
++endif
++KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
++KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
++KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
++KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
++endif
++
+ # The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
+ # values of the respective KBUILD_* variables
+ ARCH_CPPFLAGS :=
+@@ -628,7 +639,7 @@ KBUILD_CFLAGS      += $(call cc-disable-warning, 
int-in-bool-context)
+ KBUILD_CFLAGS += $(call cc-disable-warning, attribute-alias)
+ 
+ ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+-KBUILD_CFLAGS += -Os
++KBUILD_CFLAGS += $(call cc-option,-Oz,-Os)
+ else
+ ifdef CONFIG_PROFILE_ALL_BRANCHES
+ KBUILD_CFLAGS += -O2
+@@ -699,10 +710,9 @@ KBUILD_CFLAGS += $(stackp-flag)
+ 
+ ifeq ($(cc-name),clang)
+ KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
+-KBUILD_CPPFLAGS += $(call cc-option,-Wno-unknown-warning-option,)
+-KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
+ KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
+ KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
++KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
+ # Quiet clang warning: comparison of unsigned expression < 0 is always false
+ KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
+ # CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
+@@ -713,11 +723,11 @@ KBUILD_CFLAGS += $(call cc-option, 
-fcatch-undefined-behavior)
+ else
+ 
+ # These warnings generated too much noise in a regular build.
+-# Use make W=1 to enable them (see scripts/Makefile.build)
++# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
+ KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
+-KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
+ endif
+ 
++KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
+ ifdef CONFIG_FRAME_POINTER
+ KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
+ else
+@@ -1297,6 +1307,8 @@ help:
+       @echo  '                    (default: 
$$(INSTALL_MOD_PATH)/lib/firmware)'
+       @echo  '  dir/            - Build all files in dir and below'
+       @echo  '  dir/file.[ois]  - Build specified target only'
++      @echo  '  dir/file.ll     - Build the LLVM assembly file'
++      @echo  '                    (requires compiler support for LLVM 
assembly generation)'
+       @echo  '  dir/file.lst    - Build specified mixed source/assembly 
target only'
+       @echo  '                    (requires a recent binutils and recent 
build (System.map))'
+       @echo  '  dir/file.ko     - Build module including final link'
+@@ -1472,6 +1484,7 @@ clean: $(clean-dirs)
+               -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
+               -o -name '*.symtypes' -o -name 'modules.order' \
+               -o -name modules.builtin -o -name '.tmp_*.o.*' \
++              -o -name '*.ll' \
+               -o -name '*.gcno' \) -type f -print | xargs rm -f
+ 
+ # Generate tags for editors
+@@ -1575,6 +1588,8 @@ endif
+       $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ %.symtypes: %.c prepare scripts FORCE
+       $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
++%.ll: %.c prepare scripts FORCE
++      $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+ 
+ # Modules
+ /: prepare scripts FORCE
+diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
+index b6c90e5006e4..c10bb98144b0 100644
+--- a/arch/arm64/Makefile
++++ b/arch/arm64/Makefile
+@@ -56,6 +56,10 @@ else
+ TEXT_OFFSET := 0x00080000
+ endif
+ 
++ifeq ($(cc-name),clang)
++KBUILD_CFLAGS += $(call cc-disable-warning, asm-operand-widths)
++endif
++
+ # KASAN_SHADOW_OFFSET = VA_START + (1 << (VA_BITS - 3)) - (1 << 61)
+ # in 32-bit arithmetic
+ KASAN_SHADOW_OFFSET := $(shell printf "0x%08x00000000\n" $$(( \
+diff --git a/arch/arm64/crypto/sha1-ce-core.S 
b/arch/arm64/crypto/sha1-ce-core.S
+index c98e7e849f06..8550408735a0 100644
+--- a/arch/arm64/crypto/sha1-ce-core.S
++++ b/arch/arm64/crypto/sha1-ce-core.S
+@@ -82,7 +82,8 @@ ENTRY(sha1_ce_transform)
+       ldr             dgb, [x0, #16]
+ 
+       /* load sha1_ce_state::finalize */
+-      ldr             w4, [x0, #:lo12:sha1_ce_offsetof_finalize]
++      ldr_l           w4, sha1_ce_offsetof_finalize, x4
++      ldr             w4, [x0, x4]
+ 
+       /* load input */
+ 0:    ld1             {v8.4s-v11.4s}, [x1], #64
+@@ -132,7 +133,8 @@ CPU_LE(    rev32           v11.16b, v11.16b        )
+        * the padding is handled by the C code in that case.
+        */
+       cbz             x4, 3f
+-      ldr             x4, [x0, #:lo12:sha1_ce_offsetof_count]
++      ldr_l           w4, sha1_ce_offsetof_count, x4
++      ldr             x4, [x0, x4]
+       movi            v9.2d, #0
+       mov             x8, #0x80000000
+       movi            v10.2d, #0
+diff --git a/arch/arm64/crypto/sha1-ce-glue.c 
b/arch/arm64/crypto/sha1-ce-glue.c
+index aefda9868627..ea319c055f5d 100644
+--- a/arch/arm64/crypto/sha1-ce-glue.c
++++ b/arch/arm64/crypto/sha1-ce-glue.c
+@@ -17,9 +17,6 @@
+ #include <linux/crypto.h>
+ #include <linux/module.h>
+ 
+-#define ASM_EXPORT(sym, val) \
+-      asm(".globl " #sym "; .set " #sym ", %0" :: "I"(val));
+-
+ MODULE_DESCRIPTION("SHA1 secure hash using ARMv8 Crypto Extensions");
+ MODULE_AUTHOR("Ard Biesheuvel <ard.biesheu...@linaro.org>");
+ MODULE_LICENSE("GPL v2");
+@@ -32,6 +29,9 @@ struct sha1_ce_state {
+ asmlinkage void sha1_ce_transform(struct sha1_ce_state *sst, u8 const *src,
+                                 int blocks);
+ 
++const u32 sha1_ce_offsetof_count = offsetof(struct sha1_ce_state, sst.count);
++const u32 sha1_ce_offsetof_finalize = offsetof(struct sha1_ce_state, 
finalize);
++
+ static int sha1_ce_update(struct shash_desc *desc, const u8 *data,
+                         unsigned int len)
+ {
+@@ -52,11 +52,6 @@ static int sha1_ce_finup(struct shash_desc *desc, const u8 
*data,
+       struct sha1_ce_state *sctx = shash_desc_ctx(desc);
+       bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE);
+ 
+-      ASM_EXPORT(sha1_ce_offsetof_count,
+-                 offsetof(struct sha1_ce_state, sst.count));
+-      ASM_EXPORT(sha1_ce_offsetof_finalize,
+-                 offsetof(struct sha1_ce_state, finalize));
+-
+       /*
+        * Allow the asm code to perform the finalization if there is no
+        * partial data and the input is a round multiple of the block size.
+diff --git a/arch/arm64/crypto/sha2-ce-core.S 
b/arch/arm64/crypto/sha2-ce-core.S
+index 01cfee066837..679c6c002f4f 100644
+--- a/arch/arm64/crypto/sha2-ce-core.S
++++ b/arch/arm64/crypto/sha2-ce-core.S
+@@ -88,7 +88,8 @@ ENTRY(sha2_ce_transform)
+       ld1             {dgav.4s, dgbv.4s}, [x0]
+ 
+       /* load sha256_ce_state::finalize */
+-      ldr             w4, [x0, #:lo12:sha256_ce_offsetof_finalize]
++      ldr_l           w4, sha256_ce_offsetof_finalize, x4
++      ldr             w4, [x0, x4]
+ 
+       /* load input */
+ 0:    ld1             {v16.4s-v19.4s}, [x1], #64
+@@ -136,7 +137,8 @@ CPU_LE(    rev32           v19.16b, v19.16b        )
+        * the padding is handled by the C code in that case.
+        */
+       cbz             x4, 3f
+-      ldr             x4, [x0, #:lo12:sha256_ce_offsetof_count]
++      ldr_l           w4, sha256_ce_offsetof_count, x4
++      ldr             x4, [x0, x4]
+       movi            v17.2d, #0
+       mov             x8, #0x80000000
+       movi            v18.2d, #0
+diff --git a/arch/arm64/crypto/sha2-ce-glue.c 
b/arch/arm64/crypto/sha2-ce-glue.c
+index 7cd587564a41..0ed9486f75dd 100644
+--- a/arch/arm64/crypto/sha2-ce-glue.c
++++ b/arch/arm64/crypto/sha2-ce-glue.c
+@@ -17,9 +17,6 @@
+ #include <linux/crypto.h>
+ #include <linux/module.h>
+ 
+-#define ASM_EXPORT(sym, val) \
+-      asm(".globl " #sym "; .set " #sym ", %0" :: "I"(val));
+-
+ MODULE_DESCRIPTION("SHA-224/SHA-256 secure hash using ARMv8 Crypto 
Extensions");
+ MODULE_AUTHOR("Ard Biesheuvel <ard.biesheu...@linaro.org>");
+ MODULE_LICENSE("GPL v2");
+@@ -32,6 +29,11 @@ struct sha256_ce_state {
+ asmlinkage void sha2_ce_transform(struct sha256_ce_state *sst, u8 const *src,
+                                 int blocks);
+ 
++const u32 sha256_ce_offsetof_count = offsetof(struct sha256_ce_state,
++                                            sst.count);
++const u32 sha256_ce_offsetof_finalize = offsetof(struct sha256_ce_state,
++                                               finalize);
++
+ static int sha256_ce_update(struct shash_desc *desc, const u8 *data,
+                           unsigned int len)
+ {
+@@ -52,11 +54,6 @@ static int sha256_ce_finup(struct shash_desc *desc, const 
u8 *data,
+       struct sha256_ce_state *sctx = shash_desc_ctx(desc);
+       bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE);
+ 
+-      ASM_EXPORT(sha256_ce_offsetof_count,
+-                 offsetof(struct sha256_ce_state, sst.count));
+-      ASM_EXPORT(sha256_ce_offsetof_finalize,
+-                 offsetof(struct sha256_ce_state, finalize));
+-
+       /*
+        * Allow the asm code to perform the finalization if there is no
+        * partial data and the input is a round multiple of the block size.
+diff --git a/arch/arm64/include/asm/percpu.h b/arch/arm64/include/asm/percpu.h
+index 8a336852eeba..aea904713d0f 100644
+--- a/arch/arm64/include/asm/percpu.h
++++ b/arch/arm64/include/asm/percpu.h
+@@ -84,6 +84,7 @@ static inline unsigned long __percpu_##op(void *ptr,         
        \
+               : [val] "Ir" (val));                                    \
+               break;                                                  \
+       default:                                                        \
++              ret = 0;                                                \
+               BUILD_BUG();                                            \
+       }                                                               \
+                                                                       \
+@@ -113,6 +114,7 @@ static inline unsigned long __percpu_read(void *ptr, int 
size)
+               ret = ACCESS_ONCE(*(u64 *)ptr);
+               break;
+       default:
++              ret = 0;
+               BUILD_BUG();
+       }
+ 
+@@ -182,6 +184,7 @@ static inline unsigned long __percpu_xchg(void *ptr, 
unsigned long val,
+               : [val] "r" (val));
+               break;
+       default:
++              ret = 0;
+               BUILD_BUG();
+       }
+ 
+diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
+index 3686d6abafde..9edda5466020 100644
+--- a/arch/ia64/kernel/Makefile
++++ b/arch/ia64/kernel/Makefile
+@@ -50,32 +50,10 @@ CFLAGS_traps.o  += -mfixed-range=f2-f5,f16-f31
+ # The gate DSO image is built using a special linker script.
+ include $(src)/Makefile.gate
+ 
+-# Calculate NR_IRQ = max(IA64_NATIVE_NR_IRQS, XEN_NR_IRQS, ...) based on 
config
+-define sed-y
+-      "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; 
s:->::; p;}"
+-endef
+-quiet_cmd_nr_irqs = GEN     $@
+-define cmd_nr_irqs
+-      (set -e; \
+-       echo "#ifndef __ASM_NR_IRQS_H__"; \
+-       echo "#define __ASM_NR_IRQS_H__"; \
+-       echo "/*"; \
+-       echo " * DO NOT MODIFY."; \
+-       echo " *"; \
+-       echo " * This file was generated by Kbuild"; \
+-       echo " *"; \
+-       echo " */"; \
+-       echo ""; \
+-       sed -ne $(sed-y) $<; \
+-       echo ""; \
+-       echo "#endif" ) > $@
+-endef
+-
+ # We use internal kbuild rules to avoid the "is up to date" message from make
+ arch/$(SRCARCH)/kernel/nr-irqs.s: arch/$(SRCARCH)/kernel/nr-irqs.c
+       $(Q)mkdir -p $(dir $@)
+       $(call if_changed_dep,cc_s_c)
+ 
+-include/generated/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s
+-      $(Q)mkdir -p $(dir $@)
+-      $(call cmd,nr_irqs)
++include/generated/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s FORCE
++      $(call filechk,offsets,__ASM_NR_IRQS_H__)
+diff --git a/arch/s390/kernel/vdso32/Makefile 
b/arch/s390/kernel/vdso32/Makefile
+index ee8a18e50a25..29b72c46284d 100644
+--- a/arch/s390/kernel/vdso32/Makefile
++++ b/arch/s390/kernel/vdso32/Makefile
+@@ -29,7 +29,7 @@ GCOV_PROFILE := n
+ $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
+ 
+ # link rule for the .so file, .lds has to be first
+-$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32)
++$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) FORCE
+       $(call if_changed,vdso32ld)
+ 
+ # strip rule for the .so file
+@@ -38,12 +38,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
+       $(call if_changed,objcopy)
+ 
+ # assembly rules for the .S files
+-$(obj-vdso32): %.o: %.S
++$(obj-vdso32): %.o: %.S FORCE
+       $(call if_changed_dep,vdso32as)
+ 
+ # actual build commands
+ quiet_cmd_vdso32ld = VDSO32L $@
+-      cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
++      cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
+ quiet_cmd_vdso32as = VDSO32A $@
+       cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
+ 
+diff --git a/arch/s390/kernel/vdso64/Makefile 
b/arch/s390/kernel/vdso64/Makefile
+index c4b03f9ed228..1b083d80de50 100644
+--- a/arch/s390/kernel/vdso64/Makefile
++++ b/arch/s390/kernel/vdso64/Makefile
+@@ -29,7 +29,7 @@ GCOV_PROFILE := n
+ $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
+ 
+ # link rule for the .so file, .lds has to be first
+-$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64)
++$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE
+       $(call if_changed,vdso64ld)
+ 
+ # strip rule for the .so file
+@@ -38,12 +38,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
+       $(call if_changed,objcopy)
+ 
+ # assembly rules for the .S files
+-$(obj-vdso64): %.o: %.S
++$(obj-vdso64): %.o: %.S FORCE
+       $(call if_changed_dep,vdso64as)
+ 
+ # actual build commands
+ quiet_cmd_vdso64ld = VDSO64L $@
+-      cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
++      cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
+ quiet_cmd_vdso64as = VDSO64A $@
+       cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
+ 
+diff --git a/arch/s390/numa/numa.c b/arch/s390/numa/numa.c
+index 43f32ce60aa3..734f56d774bb 100644
+--- a/arch/s390/numa/numa.c
++++ b/arch/s390/numa/numa.c
+@@ -47,6 +47,7 @@ int __node_distance(int a, int b)
+ {
+       return mode->distance ? mode->distance(a, b) : 0;
+ }
++EXPORT_SYMBOL(__node_distance);
+ 
+ int numa_debug_enabled;
+ 
+diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
+index b856c66ebd3a..6dbf27ffafc8 100644
+--- a/arch/um/os-Linux/skas/process.c
++++ b/arch/um/os-Linux/skas/process.c
+@@ -585,6 +585,11 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
+               fatal_sigsegv();
+       }
+       longjmp(*switch_buf, 1);
++
++      /* unreachable */
++      printk(UM_KERN_ERR "impossible long jump!");
++      fatal_sigsegv();
++      return 0;
+ }
+ 
+ void initial_thread_cb_skas(void (*proc)(void *), void *arg)
+diff --git a/arch/x86/Makefile b/arch/x86/Makefile
+index d2c663aeccba..e26560cd1844 100644
+--- a/arch/x86/Makefile
++++ b/arch/x86/Makefile
+@@ -11,6 +11,16 @@ else
+         KBUILD_DEFCONFIG := $(ARCH)_defconfig
+ endif
+ 
++# For gcc stack alignment is specified with -mpreferred-stack-boundary,
++# clang has the option -mstack-alignment for that purpose.
++ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
++      cc_stack_align4 := -mpreferred-stack-boundary=2
++      cc_stack_align8 := -mpreferred-stack-boundary=3
++else ifneq ($(call cc-option, -mstack-alignment=16),)
++      cc_stack_align4 := -mstack-alignment=4
++      cc_stack_align8 := -mstack-alignment=8
++endif
++
+ # How to compile the 16-bit code.  Note we always compile for -march=i386;
+ # that way we can complain to the user if the CPU is insufficient.
+ #
+@@ -24,10 +34,11 @@ REALMODE_CFLAGS    := $(M16_CFLAGS) -g -Os -D__KERNEL__ \
+                  -DDISABLE_BRANCH_PROFILING \
+                  -Wall -Wstrict-prototypes -march=i386 -mregparm=3 \
+                  -fno-strict-aliasing -fomit-frame-pointer -fno-pic \
+-                 -mno-mmx -mno-sse \
+-                 $(call cc-option, -ffreestanding) \
+-                 $(call cc-option, -fno-stack-protector) \
+-                 $(call cc-option, -mpreferred-stack-boundary=2)
++                 -mno-mmx -mno-sse
++
++REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), 
-ffreestanding)
++REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), 
-fno-stack-protector)
++REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), 
$(cc_stack_align4))
+ export REALMODE_CFLAGS
+ 
+ # BITS is used as extension for files which are available in a 32 bit
+@@ -64,8 +75,10 @@ ifeq ($(CONFIG_X86_32),y)
+         # with nonstandard options
+         KBUILD_CFLAGS += -fno-pic
+ 
+-        # prevent gcc from keeping the stack 16 byte aligned
+-        KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
++        # Align the stack to the register width instead of using the default
++        # alignment of 16 bytes. This reduces stack usage and the number of
++        # alignment instructions.
++        KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align4))
+ 
+         # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc 
use
+         # a lot more stack due to the lack of sharing of stacklots:
+@@ -88,17 +101,23 @@ else
+         KBUILD_CFLAGS += -m64
+ 
+         # Align jump targets to 1 byte, not the default 16 bytes:
+-        KBUILD_CFLAGS += -falign-jumps=1
++        KBUILD_CFLAGS += $(call cc-option,-falign-jumps=1)
+ 
+         # Pack loops tightly as well:
+-        KBUILD_CFLAGS += -falign-loops=1
++        KBUILD_CFLAGS += $(call cc-option,-falign-loops=1)
+ 
+         # Don't autogenerate traditional x87 instructions
+         KBUILD_CFLAGS += $(call cc-option,-mno-80387)
+         KBUILD_CFLAGS += $(call cc-option,-mno-fp-ret-in-387)
+ 
+-      # Use -mpreferred-stack-boundary=3 if supported.
+-      KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3)
++        # By default gcc and clang use a stack alignment of 16 bytes for x86.
++        # However the standard kernel entry on x86-64 leaves the stack on an
++        # 8-byte boundary. If the compiler isn't informed about the actual
++        # alignment it will generate extra alignment instructions for the
++        # default alignment which keep the stack *mis*aligned.
++        # Furthermore an alignment to the register width reduces stack usage
++        # and the number of alignment instructions.
++        KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align8))
+ 
+       # Use -mskip-rax-setup if supported.
+       KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)
+diff --git a/arch/x86/boot/compressed/aslr.c b/arch/x86/boot/compressed/aslr.c
+index 6a9b96b4624d..31dab2135188 100644
+--- a/arch/x86/boot/compressed/aslr.c
++++ b/arch/x86/boot/compressed/aslr.c
+@@ -1,5 +1,6 @@
+ #include "misc.h"
+ 
++#include <asm/asm.h>
+ #include <asm/msr.h>
+ #include <asm/archrandom.h>
+ #include <asm/e820.h>
+@@ -94,7 +95,7 @@ static unsigned long get_random_long(void)
+       }
+ 
+       /* Circular multiply for better bit diffusion */
+-      asm("mul %3"
++      asm(_ASM_MUL "%3"
+           : "=a" (random), "=d" (raw)
+           : "a" (random), "rm" (mix_const));
+       random += raw;
+diff --git a/arch/x86/boot/string.c b/arch/x86/boot/string.c
+index 06ceddb3a22e..1d56adea8a7c 100644
+--- a/arch/x86/boot/string.c
++++ b/arch/x86/boot/string.c
+@@ -16,6 +16,15 @@
+ #include "ctype.h"
+ #include "string.h"
+ 
++/*
++ * Undef these macros so that the functions that we provide
++ * here will have the correct names regardless of how string.h
++ * may have chosen to #define them.
++ */
++#undef memcpy
++#undef memset
++#undef memcmp
++
+ int memcmp(const void *s1, const void *s2, size_t len)
+ {
+       u8 diff;
+diff --git a/arch/x86/crypto/aes_ctrby8_avx-x86_64.S 
b/arch/x86/crypto/aes_ctrby8_avx-x86_64.S
+index a916c4a61165..5f6a5af9c489 100644
+--- a/arch/x86/crypto/aes_ctrby8_avx-x86_64.S
++++ b/arch/x86/crypto/aes_ctrby8_avx-x86_64.S
+@@ -65,7 +65,6 @@
+ #include <linux/linkage.h>
+ #include <asm/inst.h>
+ 
+-#define CONCAT(a,b)   a##b
+ #define VMOVDQ                vmovdqu
+ 
+ #define xdata0                %xmm0
+@@ -92,8 +91,6 @@
+ #define num_bytes     %r8
+ 
+ #define tmp           %r10
+-#define       DDQ(i)          CONCAT(ddq_add_,i)
+-#define       XMM(i)          CONCAT(%xmm, i)
+ #define       DDQ_DATA        0
+ #define       XDATA           1
+ #define KEY_128               1
+@@ -131,12 +128,12 @@ ddq_add_8:
+ /* generate a unique variable for ddq_add_x */
+ 
+ .macro setddq n
+-      var_ddq_add = DDQ(\n)
++      var_ddq_add = ddq_add_\n
+ .endm
+ 
+ /* generate a unique variable for xmm register */
+ .macro setxdata n
+-      var_xdata = XMM(\n)
++      var_xdata = %xmm\n
+ .endm
+ 
+ /* club the numeric 'id' to the symbol 'name' */
+diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
+index 21e84a31d211..f3d4f1edc947 100644
+--- a/arch/x86/include/asm/asm.h
++++ b/arch/x86/include/asm/asm.h
+@@ -34,6 +34,7 @@
+ #define _ASM_ADD      __ASM_SIZE(add)
+ #define _ASM_SUB      __ASM_SIZE(sub)
+ #define _ASM_XADD     __ASM_SIZE(xadd)
++#define _ASM_MUL      __ASM_SIZE(mul)
+ 
+ #define _ASM_AX               __ASM_REG(ax)
+ #define _ASM_BX               __ASM_REG(bx)
+diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
+index 5365ff6e69c1..ee565b23795b 100644
+--- a/drivers/acpi/acpi_platform.c
++++ b/drivers/acpi/acpi_platform.c
+@@ -29,6 +29,7 @@ static const struct acpi_device_id forbidden_id_list[] = {
+       {"PNP0200",  0},        /* AT DMA Controller */
+       {"ACPI0009", 0},        /* IOxAPIC */
+       {"ACPI000A", 0},        /* IOAPIC */
++      {"SMB0001",  0},        /* ACPI SMBUS virtual device */
+       {"", 0},
+ };
+ 
+diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
+index 502406c9e6e1..616ee4f9c233 100644
+--- a/drivers/block/zram/zram_drv.c
++++ b/drivers/block/zram/zram_drv.c
+@@ -1184,6 +1184,11 @@ static struct attribute_group zram_disk_attr_group = {
+       .attrs = zram_disk_attrs,
+ };
+ 
++static const struct attribute_group *zram_disk_attr_groups[] = {
++      &zram_disk_attr_group,
++      NULL,
++};
++
+ /*
+  * Allocate and initialize new zram device. the function returns
+  * '>= 0' device_id upon success, and negative value otherwise.
+@@ -1264,15 +1269,9 @@ static int zram_add(void)
+               zram->disk->queue->limits.discard_zeroes_data = 0;
+       queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, zram->disk->queue);
+ 
++      disk_to_dev(zram->disk)->groups = zram_disk_attr_groups;
+       add_disk(zram->disk);
+ 
+-      ret = sysfs_create_group(&disk_to_dev(zram->disk)->kobj,
+-                              &zram_disk_attr_group);
+-      if (ret < 0) {
+-              pr_err("Error creating sysfs group for device %d\n",
+-                              device_id);
+-              goto out_free_disk;
+-      }
+       strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor));
+       zram->meta = NULL;
+       zram->max_comp_streams = 1;
+@@ -1280,9 +1279,6 @@ static int zram_add(void)
+       pr_info("Added device: %s\n", zram->disk->disk_name);
+       return device_id;
+ 
+-out_free_disk:
+-      del_gendisk(zram->disk);
+-      put_disk(zram->disk);
+ out_free_queue:
+       blk_cleanup_queue(queue);
+ out_free_idr:
+@@ -1310,16 +1306,6 @@ static int zram_remove(struct zram *zram)
+       zram->claim = true;
+       mutex_unlock(&bdev->bd_mutex);
+ 
+-      /*
+-       * Remove sysfs first, so no one will perform a disksize
+-       * store while we destroy the devices. This also helps during
+-       * hot_remove -- zram_reset_device() is the last holder of
+-       * ->init_lock, no later/concurrent disksize_store() or any
+-       * other sysfs handlers are possible.
+-       */
+-      sysfs_remove_group(&disk_to_dev(zram->disk)->kobj,
+-                      &zram_disk_attr_group);
+-
+       /* Make sure all the pending I/O are finished */
+       fsync_bdev(bdev);
+       zram_reset_device(zram);
+diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
+index 4685bd10c473..ec6af1595062 100644
+--- a/drivers/bluetooth/Kconfig
++++ b/drivers/bluetooth/Kconfig
+@@ -125,7 +125,6 @@ config BT_HCIUART_LL
+ config BT_HCIUART_3WIRE
+       bool "Three-wire UART (H5) protocol support"
+       depends on BT_HCIUART
+-      depends on BT_HCIUART_SERDEV
+       help
+         The HCI Three-wire UART Transport Layer makes it possible to
+         user the Bluetooth HCI over a serial port interface. The HCI
+diff --git a/drivers/clk/samsung/clk-exynos5420.c 
b/drivers/clk/samsung/clk-exynos5420.c
+index 389af3c15ec4..bde71b07f15e 100644
+--- a/drivers/clk/samsung/clk-exynos5420.c
++++ b/drivers/clk/samsung/clk-exynos5420.c
+@@ -273,6 +273,7 @@ static const struct samsung_clk_reg_dump 
exynos5420_set_clksrc[] = {
+       { .offset = GATE_BUS_TOP,               .value = 0xffffffff, },
+       { .offset = GATE_BUS_DISP1,             .value = 0xffffffff, },
+       { .offset = GATE_IP_PERIC,              .value = 0xffffffff, },
++      { .offset = GATE_IP_PERIS,              .value = 0xffffffff, },
+ };
+ 
+ static int exynos5420_clk_suspend(void)
+diff --git a/drivers/firmware/efi/libstub/Makefile 
b/drivers/firmware/efi/libstub/Makefile
+index 3c0467d3688c..88bd6829a358 100644
+--- a/drivers/firmware/efi/libstub/Makefile
++++ b/drivers/firmware/efi/libstub/Makefile
+@@ -10,7 +10,7 @@ cflags-$(CONFIG_X86)         += -m$(BITS) -D__KERNEL__ 
$(LINUX_INCLUDE) -O2 \
+                                  -fPIC -fno-strict-aliasing -mno-red-zone \
+                                  -mno-mmx -mno-sse -DDISABLE_BRANCH_PROFILING
+ 
+-cflags-$(CONFIG_ARM64)                := $(subst -pg,,$(KBUILD_CFLAGS))
++cflags-$(CONFIG_ARM64)                := $(subst -pg,,$(KBUILD_CFLAGS)) -fpie
+ cflags-$(CONFIG_ARM)          := $(subst -pg,,$(KBUILD_CFLAGS)) \
+                                  -fno-builtin -fpic -mno-single-pic-base
+ 
+diff --git a/drivers/firmware/efi/libstub/arm64-stub.c 
b/drivers/firmware/efi/libstub/arm64-stub.c
+index 78dfbd34b6bf..044efb779ed1 100644
+--- a/drivers/firmware/efi/libstub/arm64-stub.c
++++ b/drivers/firmware/efi/libstub/arm64-stub.c
+@@ -9,9 +9,17 @@
+  * published by the Free Software Foundation.
+  *
+  */
++
++/*
++ * To prevent the compiler from emitting GOT-indirected (and thus absolute)
++ * references to the section markers, override their visibility as 'hidden'
++ */
++#pragma GCC visibility push(hidden)
++#include <asm/sections.h>
++#pragma GCC visibility pop
++
+ #include <linux/efi.h>
+ #include <asm/efi.h>
+-#include <asm/sections.h>
+ 
+ efi_status_t __init handle_kernel_image(efi_system_table_t *sys_table_arg,
+                                       unsigned long *image_addr,
+diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
+index 1a2032c2c1fb..f6863adc15ad 100644
+--- a/drivers/hid/uhid.c
++++ b/drivers/hid/uhid.c
+@@ -12,6 +12,7 @@
+ 
+ #include <linux/atomic.h>
+ #include <linux/compat.h>
++#include <linux/cred.h>
+ #include <linux/device.h>
+ #include <linux/fs.h>
+ #include <linux/hid.h>
+@@ -24,6 +25,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/uhid.h>
+ #include <linux/wait.h>
++#include <linux/uaccess.h>
+ 
+ #define UHID_NAME     "uhid"
+ #define UHID_BUFSIZE  32
+@@ -721,6 +723,17 @@ static ssize_t uhid_char_write(struct file *file, const 
char __user *buffer,
+ 
+       switch (uhid->input_buf.type) {
+       case UHID_CREATE:
++              /*
++               * 'struct uhid_create_req' contains a __user pointer which is
++               * copied from, so it's unsafe to allow this with elevated
++               * privileges (e.g. from a setuid binary) or via kernel_write().
++               */
++              if (file->f_cred != current_cred() || uaccess_kernel()) {
++                      pr_err_once("UHID_CREATE from different security 
context by process %d (%s), this is not allowed.\n",
++                                  task_tgid_vnr(current), current->comm);
++                      ret = -EACCES;
++                      goto unlock;
++              }
+               ret = uhid_dev_create(uhid, &uhid->input_buf);
+               break;
+       case UHID_CREATE2:
+diff --git a/drivers/hwmon/ibmpowernv.c b/drivers/hwmon/ibmpowernv.c
+index 55b5a8ff1cfe..ca3aa28977bc 100644
+--- a/drivers/hwmon/ibmpowernv.c
++++ b/drivers/hwmon/ibmpowernv.c
+@@ -114,7 +114,7 @@ static ssize_t show_label(struct device *dev, struct 
device_attribute *devattr,
+       return sprintf(buf, "%s\n", sdata->label);
+ }
+ 
+-static int __init get_logical_cpu(int hwcpu)
++static int get_logical_cpu(int hwcpu)
+ {
+       int cpu;
+ 
+@@ -125,9 +125,8 @@ static int __init get_logical_cpu(int hwcpu)
+       return -ENOENT;
+ }
+ 
+-static void __init make_sensor_label(struct device_node *np,
+-                                   struct sensor_data *sdata,
+-                                   const char *label)
++static void make_sensor_label(struct device_node *np,
++                            struct sensor_data *sdata, const char *label)
+ {
+       u32 id;
+       size_t n;
+diff --git a/drivers/media/v4l2-core/v4l2-event.c 
b/drivers/media/v4l2-core/v4l2-event.c
+index b47ac4e053d0..f5c8a952f0aa 100644
+--- a/drivers/media/v4l2-core/v4l2-event.c
++++ b/drivers/media/v4l2-core/v4l2-event.c
+@@ -197,6 +197,22 @@ int v4l2_event_pending(struct v4l2_fh *fh)
+ }
+ EXPORT_SYMBOL_GPL(v4l2_event_pending);
+ 
++static void __v4l2_event_unsubscribe(struct v4l2_subscribed_event *sev)
++{
++      struct v4l2_fh *fh = sev->fh;
++      unsigned int i;
++
++      lockdep_assert_held(&fh->subscribe_lock);
++      assert_spin_locked(&fh->vdev->fh_lock);
++
++      /* Remove any pending events for this subscription */
++      for (i = 0; i < sev->in_use; i++) {
++              list_del(&sev->events[sev_pos(sev, i)].list);
++              fh->navailable--;
++      }
++      list_del(&sev->list);
++}
++
+ int v4l2_event_subscribe(struct v4l2_fh *fh,
+                        const struct v4l2_event_subscription *sub, unsigned 
elems,
+                        const struct v4l2_subscribed_event_ops *ops)
+@@ -228,27 +244,23 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
+ 
+       spin_lock_irqsave(&fh->vdev->fh_lock, flags);
+       found_ev = v4l2_event_subscribed(fh, sub->type, sub->id);
++      if (!found_ev)
++              list_add(&sev->list, &fh->subscribed);
+       spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
+ 
+       if (found_ev) {
+               /* Already listening */
+               kfree(sev);
+-              goto out_unlock;
+-      }
+-
+-      if (sev->ops && sev->ops->add) {
++      } else if (sev->ops && sev->ops->add) {
+               ret = sev->ops->add(sev, elems);
+               if (ret) {
++                      spin_lock_irqsave(&fh->vdev->fh_lock, flags);
++                      __v4l2_event_unsubscribe(sev);
++                      spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
+                       kfree(sev);
+-                      goto out_unlock;
+               }
+       }
+ 
+-      spin_lock_irqsave(&fh->vdev->fh_lock, flags);
+-      list_add(&sev->list, &fh->subscribed);
+-      spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
+-
+-out_unlock:
+       mutex_unlock(&fh->subscribe_lock);
+ 
+       return ret;
+@@ -283,7 +295,6 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
+ {
+       struct v4l2_subscribed_event *sev;
+       unsigned long flags;
+-      int i;
+ 
+       if (sub->type == V4L2_EVENT_ALL) {
+               v4l2_event_unsubscribe_all(fh);
+@@ -295,14 +306,8 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
+       spin_lock_irqsave(&fh->vdev->fh_lock, flags);
+ 
+       sev = v4l2_event_subscribed(fh, sub->type, sub->id);
+-      if (sev != NULL) {
+-              /* Remove any pending events for this subscription */
+-              for (i = 0; i < sev->in_use; i++) {
+-                      list_del(&sev->events[sev_pos(sev, i)].list);
+-                      fh->navailable--;
+-              }
+-              list_del(&sev->list);
+-      }
++      if (sev != NULL)
++              __v4l2_event_unsubscribe(sev);
+ 
+       spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
+ 
+diff --git a/drivers/media/v4l2-core/videobuf2-core.c 
b/drivers/media/v4l2-core/videobuf2-core.c
+index 1c37d5a78822..8ce9c63dfc59 100644
+--- a/drivers/media/v4l2-core/videobuf2-core.c
++++ b/drivers/media/v4l2-core/videobuf2-core.c
+@@ -870,12 +870,9 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum 
vb2_buffer_state state)
+       dprintk(4, "done processing on buffer %d, state: %d\n",
+                       vb->index, state);
+ 
+-      if (state != VB2_BUF_STATE_QUEUED &&
+-          state != VB2_BUF_STATE_REQUEUEING) {
+-              /* sync buffers */
+-              for (plane = 0; plane < vb->num_planes; ++plane)
+-                      call_void_memop(vb, finish, vb->planes[plane].mem_priv);
+-      }
++      /* sync buffers */
++      for (plane = 0; plane < vb->num_planes; ++plane)
++              call_void_memop(vb, finish, vb->planes[plane].mem_priv);
+ 
+       spin_lock_irqsave(&q->done_lock, flags);
+       if (state == VB2_BUF_STATE_QUEUED ||
+diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c
+index e11a0bd6c66e..e2474af7386a 100644
+--- a/drivers/misc/atmel-ssc.c
++++ b/drivers/misc/atmel-ssc.c
+@@ -129,7 +129,7 @@ static const struct of_device_id atmel_ssc_dt_ids[] = {
+ MODULE_DEVICE_TABLE(of, atmel_ssc_dt_ids);
+ #endif
+ 
+-static inline const struct atmel_ssc_platform_data * __init
++static inline const struct atmel_ssc_platform_data *
+       atmel_ssc_get_driver_data(struct platform_device *pdev)
+ {
+       if (pdev->dev.of_node) {
+diff --git a/drivers/misc/sgi-gru/grukdump.c b/drivers/misc/sgi-gru/grukdump.c
+index 313da3150262..1540a7785e14 100644
+--- a/drivers/misc/sgi-gru/grukdump.c
++++ b/drivers/misc/sgi-gru/grukdump.c
+@@ -27,6 +27,9 @@
+ #include <linux/delay.h>
+ #include <linux/bitops.h>
+ #include <asm/uv/uv_hub.h>
++
++#include <linux/nospec.h>
++
+ #include "gru.h"
+ #include "grutables.h"
+ #include "gruhandles.h"
+@@ -196,6 +199,7 @@ int gru_dump_chiplet_request(unsigned long arg)
+       /* Currently, only dump by gid is implemented */
+       if (req.gid >= gru_max_gids)
+               return -EINVAL;
++      req.gid = array_index_nospec(req.gid, gru_max_gids);
+ 
+       gru = GID_TO_GRU(req.gid);
+       ubuf = req.buf;
+diff --git a/drivers/net/ethernet/broadcom/tg3.c 
b/drivers/net/ethernet/broadcom/tg3.c
+index ce3a56bea6e6..58102e96ac5c 100644
+--- a/drivers/net/ethernet/broadcom/tg3.c
++++ b/drivers/net/ethernet/broadcom/tg3.c
+@@ -12379,6 +12379,7 @@ static int tg3_set_ringparam(struct net_device *dev, 
struct ethtool_ringparam *e
+ {
+       struct tg3 *tp = netdev_priv(dev);
+       int i, irq_sync = 0, err = 0;
++      bool reset_phy = false;
+ 
+       if ((ering->rx_pending > tp->rx_std_ring_mask) ||
+           (ering->rx_jumbo_pending > tp->rx_jmb_ring_mask) ||
+@@ -12410,7 +12411,13 @@ static int tg3_set_ringparam(struct net_device *dev, 
struct ethtool_ringparam *e
+ 
+       if (netif_running(dev)) {
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
+-              err = tg3_restart_hw(tp, false);
++              /* Reset PHY to avoid PHY lock up */
++              if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
++                  tg3_asic_rev(tp) == ASIC_REV_5719 ||
++                  tg3_asic_rev(tp) == ASIC_REV_5720)
++                      reset_phy = true;
++
++              err = tg3_restart_hw(tp, reset_phy);
+               if (!err)
+                       tg3_netif_start(tp);
+       }
+@@ -12444,6 +12451,7 @@ static int tg3_set_pauseparam(struct net_device *dev, 
struct ethtool_pauseparam
+ {
+       struct tg3 *tp = netdev_priv(dev);
+       int err = 0;
++      bool reset_phy = false;
+ 
+       if (tp->link_config.autoneg == AUTONEG_ENABLE)
+               tg3_warn_mgmt_link_flap(tp);
+@@ -12534,7 +12542,13 @@ static int tg3_set_pauseparam(struct net_device *dev, 
struct ethtool_pauseparam
+ 
+               if (netif_running(dev)) {
+                       tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
+-                      err = tg3_restart_hw(tp, false);
++                      /* Reset PHY to avoid PHY lock up */
++                      if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
++                          tg3_asic_rev(tp) == ASIC_REV_5719 ||
++                          tg3_asic_rev(tp) == ASIC_REV_5720)
++                              reset_phy = true;
++
++                      err = tg3_restart_hw(tp, reset_phy);
+                       if (!err)
+                               tg3_netif_start(tp);
+               }
+diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
+index 460fa6708bfc..3c4b107aba78 100644
+--- a/drivers/platform/x86/acerhdf.c
++++ b/drivers/platform/x86/acerhdf.c
+@@ -233,6 +233,7 @@ static const struct bios_settings bios_tbl[] = {
+       {"Gateway", "LT31",   "v1.3201",  0x55, 0x58, {0x9e, 0x00}, 0},
+       {"Gateway", "LT31",   "v1.3302",  0x55, 0x58, {0x9e, 0x00}, 0},
+       {"Gateway", "LT31",   "v1.3303t", 0x55, 0x58, {0x9e, 0x00}, 0},
++      {"Gateway", "LT31",   "v1.3307",  0x55, 0x58, {0x9e, 0x00}, 0},
+       /* Packard Bell */
+       {"Packard Bell", "DOA150",  "v0.3104",  0x55, 0x58, {0x21, 0x00}, 0},
+       {"Packard Bell", "DOA150",  "v0.3105",  0x55, 0x58, {0x20, 0x00}, 0},
+diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
+index 0ab15d833d1b..50fe1f76ea42 100644
+--- a/drivers/uio/uio.c
++++ b/drivers/uio/uio.c
+@@ -842,6 +842,8 @@ int __uio_register_device(struct module *owner,
+       if (ret)
+               goto err_uio_dev_add_attributes;
+ 
++      info->uio_dev = idev;
++
+       if (info->irq && (info->irq != UIO_IRQ_CUSTOM)) {
+               /*
+                * Note that we deliberately don't use devm_request_irq
+@@ -853,11 +855,12 @@ int __uio_register_device(struct module *owner,
+                */
+               ret = request_irq(info->irq, uio_interrupt,
+                                 info->irq_flags, info->name, idev);
+-              if (ret)
++              if (ret) {
++                      info->uio_dev = NULL;
+                       goto err_request_irq;
++              }
+       }
+ 
+-      info->uio_dev = idev;
+       return 0;
+ 
+ err_request_irq:
+diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
+index 3cbf6aa10f2c..0a8e5ac891d4 100644
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -1716,6 +1716,9 @@ static const struct usb_device_id acm_ids[] = {
+       { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
+       .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+       },
++      { USB_DEVICE(0x0572, 0x1349), /* Hiro (Conexant) USB MODEM H50228 */
++      .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
++      },
+       { USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */
+       .driver_info = QUIRK_CONTROL_LINE_STATE, },
+       { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 37a5e07b3488..1e8f68960014 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -243,6 +243,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+       { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT |
+         USB_QUIRK_DELAY_CTRL_MSG },
+ 
++      /* Corsair K70 LUX RGB */
++      { USB_DEVICE(0x1b1c, 0x1b33), .driver_info = USB_QUIRK_DELAY_INIT },
++
+       /* Corsair K70 LUX */
+       { USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT },
+ 
+@@ -263,6 +266,11 @@ static const struct usb_device_id usb_quirk_list[] = {
+       { USB_DEVICE(0x2040, 0x7200), .driver_info =
+                       USB_QUIRK_CONFIG_INTF_STRINGS },
+ 
++      /* Raydium Touchscreen */
++      { USB_DEVICE(0x2386, 0x3114), .driver_info = USB_QUIRK_NO_LPM },
++
++      { USB_DEVICE(0x2386, 0x3119), .driver_info = USB_QUIRK_NO_LPM },
++
+       /* DJI CineSSD */
+       { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
+ 
+diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
+index f788f80fe1aa..aee29604bd79 100644
+--- a/drivers/usb/host/xhci-hub.c
++++ b/drivers/usb/host/xhci-hub.c
+@@ -348,7 +348,7 @@ int xhci_find_slot_id_by_port(struct usb_hcd *hcd, struct 
xhci_hcd *xhci,
+ 
+       slot_id = 0;
+       for (i = 0; i < MAX_HC_SLOTS; i++) {
+-              if (!xhci->devs[i])
++              if (!xhci->devs[i] || !xhci->devs[i]->udev)
+                       continue;
+               speed = xhci->devs[i]->udev->speed;
+               if (((speed >= USB_SPEED_SUPER) == (hcd->speed >= HCD_USB3))
+diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c
+index a0a3827b4aff..b15842c6f916 100644
+--- a/drivers/usb/misc/appledisplay.c
++++ b/drivers/usb/misc/appledisplay.c
+@@ -63,6 +63,7 @@ static const struct usb_device_id appledisplay_table[] = {
+       { APPLEDISPLAY_DEVICE(0x9219) },
+       { APPLEDISPLAY_DEVICE(0x921c) },
+       { APPLEDISPLAY_DEVICE(0x921d) },
++      { APPLEDISPLAY_DEVICE(0x9222) },
+       { APPLEDISPLAY_DEVICE(0x9236) },
+ 
+       /* Terminating entry */
+diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
+index 8dbb00fbb00b..b0875ef48522 100644
+--- a/fs/btrfs/disk-io.c
++++ b/fs/btrfs/disk-io.c
+@@ -4333,6 +4333,7 @@ static int btrfs_destroy_marked_extents(struct 
btrfs_root *root,
+ static int btrfs_destroy_pinned_extent(struct btrfs_root *root,
+                                      struct extent_io_tree *pinned_extents)
+ {
++      struct btrfs_fs_info *fs_info = root->fs_info;
+       struct extent_io_tree *unpin;
+       u64 start;
+       u64 end;
+@@ -4342,21 +4343,31 @@ static int btrfs_destroy_pinned_extent(struct 
btrfs_root *root,
+       unpin = pinned_extents;
+ again:
+       while (1) {
++              /*
++               * The btrfs_finish_extent_commit() may get the same range as
++               * ours between find_first_extent_bit and clear_extent_dirty.
++               * Hence, hold the unused_bg_unpin_mutex to avoid double unpin
++               * the same extent range.
++               */
++              mutex_lock(&fs_info->unused_bg_unpin_mutex);
+               ret = find_first_extent_bit(unpin, 0, &start, &end,
+                                           EXTENT_DIRTY, NULL);
+-              if (ret)
++              if (ret) {
++                      mutex_unlock(&fs_info->unused_bg_unpin_mutex);
+                       break;
++              }
+ 
+               clear_extent_dirty(unpin, start, end, GFP_NOFS);
+               btrfs_error_unpin_extent_range(root, start, end);
++              mutex_unlock(&fs_info->unused_bg_unpin_mutex);
+               cond_resched();
+       }
+ 
+       if (loop) {
+-              if (unpin == &root->fs_info->freed_extents[0])
+-                      unpin = &root->fs_info->freed_extents[1];
++              if (unpin == &fs_info->freed_extents[0])
++                      unpin = &fs_info->freed_extents[1];
+               else
+-                      unpin = &root->fs_info->freed_extents[0];
++                      unpin = &fs_info->freed_extents[0];
+               loop = false;
+               goto again;
+       }
+diff --git a/fs/exofs/super.c b/fs/exofs/super.c
+index b795c567b5e1..360ba74e04e6 100644
+--- a/fs/exofs/super.c
++++ b/fs/exofs/super.c
+@@ -100,6 +100,7 @@ static int parse_options(char *options, struct 
exofs_mountopt *opts)
+               token = match_token(p, tokens, args);
+               switch (token) {
+               case Opt_name:
++                      kfree(opts->dev_name);
+                       opts->dev_name = match_strdup(&args[0]);
+                       if (unlikely(!opts->dev_name)) {
+                               EXOFS_ERR("Error allocating dev_name");
+@@ -868,8 +869,10 @@ static struct dentry *exofs_mount(struct file_system_type 
*type,
+       int ret;
+ 
+       ret = parse_options(data, &opts);
+-      if (ret)
++      if (ret) {
++              kfree(opts.dev_name);
+               return ERR_PTR(ret);
++      }
+ 
+       if (!opts.dev_name)
+               opts.dev_name = dev_name;
+diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
+index c134c0462cee..ef24894edecc 100644
+--- a/fs/gfs2/rgrp.c
++++ b/fs/gfs2/rgrp.c
+@@ -732,6 +732,7 @@ void gfs2_clear_rgrpd(struct gfs2_sbd *sdp)
+                       spin_lock(&gl->gl_lockref.lock);
+                       gl->gl_object = NULL;
+                       spin_unlock(&gl->gl_lockref.lock);
++                      gfs2_rgrp_brelse(rgd);
+                       gfs2_glock_add_to_lru(gl);
+                       gfs2_glock_put(gl);
+               }
+@@ -1139,7 +1140,7 @@ static u32 count_unlinked(struct gfs2_rgrpd *rgd)
+  * @rgd: the struct gfs2_rgrpd describing the RG to read in
+  *
+  * Read in all of a Resource Group's header and bitmap blocks.
+- * Caller must eventually call gfs2_rgrp_relse() to free the bitmaps.
++ * Caller must eventually call gfs2_rgrp_brelse() to free the bitmaps.
+  *
+  * Returns: errno
+  */
+diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c
+index 2a6f3c67cb3f..2e713673df42 100644
+--- a/fs/hfs/brec.c
++++ b/fs/hfs/brec.c
+@@ -424,6 +424,10 @@ skip:
+       if (new_node) {
+               __be32 cnid;
+ 
++              if (!new_node->parent) {
++                      hfs_btree_inc_height(tree);
++                      new_node->parent = tree->root;
++              }
+               fd->bnode = hfs_bnode_find(tree, new_node->parent);
+               /* create index key and entry */
+               hfs_bnode_read_key(new_node, fd->search_key, 14);
+diff --git a/fs/hfsplus/brec.c b/fs/hfsplus/brec.c
+index 754fdf8c6356..1002a0c08319 100644
+--- a/fs/hfsplus/brec.c
++++ b/fs/hfsplus/brec.c
+@@ -427,6 +427,10 @@ skip:
+       if (new_node) {
+               __be32 cnid;
+ 
++              if (!new_node->parent) {
++                      hfs_btree_inc_height(tree);
++                      new_node->parent = tree->root;
++              }
+               fd->bnode = hfs_bnode_find(tree, new_node->parent);
+               /* create index key and entry */
+               hfs_bnode_read_key(new_node, fd->search_key, 14);
+diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c
+index 8b32fdaad468..d424b3d4bf3b 100644
+--- a/fs/reiserfs/xattr.c
++++ b/fs/reiserfs/xattr.c
+@@ -184,6 +184,7 @@ struct reiserfs_dentry_buf {
+       struct dir_context ctx;
+       struct dentry *xadir;
+       int count;
++      int err;
+       struct dentry *dentries[8];
+ };
+ 
+@@ -206,6 +207,7 @@ fill_with_dentries(struct dir_context *ctx, const char 
*name, int namelen,
+ 
+       dentry = lookup_one_len(name, dbuf->xadir, namelen);
+       if (IS_ERR(dentry)) {
++              dbuf->err = PTR_ERR(dentry);
+               return PTR_ERR(dentry);
+       } else if (d_really_is_negative(dentry)) {
+               /* A directory entry exists, but no file? */
+@@ -214,6 +216,7 @@ fill_with_dentries(struct dir_context *ctx, const char 
*name, int namelen,
+                              "not found for file %pd.\n",
+                              dentry, dbuf->xadir);
+               dput(dentry);
++              dbuf->err = -EIO;
+               return -EIO;
+       }
+ 
+@@ -261,6 +264,10 @@ static int reiserfs_for_each_xattr(struct inode *inode,
+               err = reiserfs_readdir_inode(d_inode(dir), &buf.ctx);
+               if (err)
+                       break;
++              if (buf.err) {
++                      err = buf.err;
++                      break;
++              }
+               if (!buf.count)
+                       break;
+               for (i = 0; !err && i < buf.count && buf.dentries[i]; i++) {
+diff --git a/include/linux/kbuild.h b/include/linux/kbuild.h
+index 22a72198c14b..4e80f3a9ad58 100644
+--- a/include/linux/kbuild.h
++++ b/include/linux/kbuild.h
+@@ -2,14 +2,14 @@
+ #define __LINUX_KBUILD_H
+ 
+ #define DEFINE(sym, val) \
+-        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
++      asm volatile("\n.ascii \"->" #sym " %0 " #val "\"" : : "i" (val))
+ 
+-#define BLANK() asm volatile("\n->" : : )
++#define BLANK() asm volatile("\n.ascii \"->\"" : : )
+ 
+ #define OFFSET(sym, str, mem) \
+       DEFINE(sym, offsetof(struct str, mem))
+ 
+ #define COMMENT(x) \
+-      asm volatile("\n->#" x)
++      asm volatile("\n.ascii \"->#" x "\"")
+ 
+ #endif
+diff --git a/include/linux/module.h b/include/linux/module.h
+index c9f2f85017ad..dfe5c2e25ba1 100644
+--- a/include/linux/module.h
++++ b/include/linux/module.h
+@@ -125,13 +125,13 @@ extern void cleanup_module(void);
+ 
+ /* Each module must use one module_init(). */
+ #define module_init(initfn)                                   \
+-      static inline initcall_t __inittest(void)               \
++      static inline initcall_t __maybe_unused __inittest(void)                
\
+       { return initfn; }                                      \
+       int init_module(void) __attribute__((alias(#initfn)));
+ 
+ /* This is only required if you want to be unloadable. */
+ #define module_exit(exitfn)                                   \
+-      static inline exitcall_t __exittest(void)               \
++      static inline exitcall_t __maybe_unused __exittest(void)                
\
+       { return exitfn; }                                      \
+       void cleanup_module(void) __attribute__((alias(#exitfn)));
+ 
+diff --git a/include/linux/netfilter/ipset/ip_set_comment.h 
b/include/linux/netfilter/ipset/ip_set_comment.h
+index 8d0248525957..9f34204978e4 100644
+--- a/include/linux/netfilter/ipset/ip_set_comment.h
++++ b/include/linux/netfilter/ipset/ip_set_comment.h
+@@ -41,11 +41,11 @@ ip_set_init_comment(struct ip_set_comment *comment,
+       rcu_assign_pointer(comment->c, c);
+ }
+ 
+-/* Used only when dumping a set, protected by rcu_read_lock_bh() */
++/* Used only when dumping a set, protected by rcu_read_lock() */
+ static inline int
+ ip_set_put_comment(struct sk_buff *skb, struct ip_set_comment *comment)
+ {
+-      struct ip_set_comment_rcu *c = rcu_dereference_bh(comment->c);
++      struct ip_set_comment_rcu *c = rcu_dereference(comment->c);
+ 
+       if (!c)
+               return 0;
+diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h
+index 558129af828a..15c7b5420d8a 100644
+--- a/include/linux/uaccess.h
++++ b/include/linux/uaccess.h
+@@ -2,6 +2,9 @@
+ #define __LINUX_UACCESS_H__
+ 
+ #include <linux/sched.h>
++
++#define uaccess_kernel() segment_eq(get_fs(), KERNEL_DS)
++
+ #include <asm/uaccess.h>
+ 
+ static __always_inline void pagefault_disabled_inc(void)
+diff --git a/lib/raid6/test/Makefile b/lib/raid6/test/Makefile
+index 29090f3db677..28c089cb13f1 100644
+--- a/lib/raid6/test/Makefile
++++ b/lib/raid6/test/Makefile
+@@ -26,7 +26,7 @@ ifeq ($(ARCH),arm)
+         CFLAGS += -I../../../arch/arm/include -mfpu=neon
+         HAS_NEON = yes
+ endif
+-ifeq ($(ARCH),arm64)
++ifeq ($(ARCH),aarch64)
+         CFLAGS += -I../../../arch/arm64/include
+         HAS_NEON = yes
+ endif
+@@ -37,7 +37,7 @@ ifeq ($(IS_X86),yes)
+                     gcc -c -x assembler - >&/dev/null &&      \
+                     rm ./-.o && echo -DCONFIG_AS_AVX2=1)
+ else ifeq ($(HAS_NEON),yes)
+-        OBJS   += neon.o neon1.o neon2.o neon4.o neon8.o
++        OBJS   += neon.o neon1.o neon2.o neon4.o neon8.o recov_neon.o 
recov_neon_inner.o
+         CFLAGS += -DCONFIG_KERNEL_MODE_NEON=1
+ else
+         HAS_ALTIVEC := $(shell printf '\#include <altivec.h>\nvector int 
a;\n' |\
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 7366feb8b5b3..e03c1d2f6707 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -4481,6 +4481,10 @@ static void napi_reuse_skb(struct napi_struct *napi, 
struct sk_buff *skb)
+       skb->vlan_tci = 0;
+       skb->dev = napi->dev;
+       skb->skb_iif = 0;
++
++      /* eth_type_trans() assumes pkt_type is PACKET_HOST */
++      skb->pkt_type = PACKET_HOST;
++
+       skb->encapsulation = 0;
+       skb_shinfo(skb)->gso_type = 0;
+       skb->truesize = SKB_TRUESIZE(skb_end_offset(skb));
+diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
+index 4d14908afaec..697c4212129a 100644
+--- a/net/core/flow_dissector.c
++++ b/net/core/flow_dissector.c
+@@ -480,8 +480,8 @@ ip_proto_again:
+               break;
+       }
+ 
+-      if (dissector_uses_key(flow_dissector,
+-                             FLOW_DISSECTOR_KEY_PORTS)) {
++      if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS) &&
++          !(key_control->flags & FLOW_DIS_IS_FRAGMENT)) {
+               key_ports = skb_flow_dissector_target(flow_dissector,
+                                                     FLOW_DISSECTOR_KEY_PORTS,
+                                                     target_container);
+diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c
+index dbda0565781c..4916d1857b75 100644
+--- a/net/ipv4/ip_tunnel_core.c
++++ b/net/ipv4/ip_tunnel_core.c
+@@ -71,7 +71,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct 
sk_buff *skb,
+ 
+       iph->version    =       4;
+       iph->ihl        =       sizeof(struct iphdr) >> 2;
+-      iph->frag_off   =       df;
++      iph->frag_off   =       ip_mtu_locked(&rt->dst) ? 0 : df;
+       iph->protocol   =       proto;
+       iph->tos        =       tos;
+       iph->daddr      =       dst;
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c
+index 2f6d8f57fdd4..1cb8954885ec 100644
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -1420,8 +1420,12 @@ EXPORT_SYMBOL_GPL(ip6_update_pmtu);
+ 
+ void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu)
+ {
+-      ip6_update_pmtu(skb, sock_net(sk), mtu,
+-                      sk->sk_bound_dev_if, sk->sk_mark);
++      int oif = sk->sk_bound_dev_if;
++
++      if (!oif && skb->dev)
++              oif = l3mdev_master_ifindex(skb->dev);
++
++      ip6_update_pmtu(skb, sock_net(sk), mtu, oif, sk->sk_mark);
+ }
+ EXPORT_SYMBOL_GPL(ip6_sk_update_pmtu);
+ 
+diff --git a/net/netfilter/ipset/ip_set_hash_netportnet.c 
b/net/netfilter/ipset/ip_set_hash_netportnet.c
+index 9a14c237830f..b259a5814965 100644
+--- a/net/netfilter/ipset/ip_set_hash_netportnet.c
++++ b/net/netfilter/ipset/ip_set_hash_netportnet.c
+@@ -213,13 +213,13 @@ hash_netportnet4_uadt(struct ip_set *set, struct nlattr 
*tb[],
+ 
+       if (tb[IPSET_ATTR_CIDR]) {
+               e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]);
+-              if (!e.cidr[0] || e.cidr[0] > HOST_MASK)
++              if (e.cidr[0] > HOST_MASK)
+                       return -IPSET_ERR_INVALID_CIDR;
+       }
+ 
+       if (tb[IPSET_ATTR_CIDR2]) {
+               e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]);
+-              if (!e.cidr[1] || e.cidr[1] > HOST_MASK)
++              if (e.cidr[1] > HOST_MASK)
+                       return -IPSET_ERR_INVALID_CIDR;
+       }
+ 
+@@ -492,13 +492,13 @@ hash_netportnet6_uadt(struct ip_set *set, struct nlattr 
*tb[],
+ 
+       if (tb[IPSET_ATTR_CIDR]) {
+               e.cidr[0] = nla_get_u8(tb[IPSET_ATTR_CIDR]);
+-              if (!e.cidr[0] || e.cidr[0] > HOST_MASK)
++              if (e.cidr[0] > HOST_MASK)
+                       return -IPSET_ERR_INVALID_CIDR;
+       }
+ 
+       if (tb[IPSET_ATTR_CIDR2]) {
+               e.cidr[1] = nla_get_u8(tb[IPSET_ATTR_CIDR2]);
+-              if (!e.cidr[1] || e.cidr[1] > HOST_MASK)
++              if (e.cidr[1] > HOST_MASK)
+                       return -IPSET_ERR_INVALID_CIDR;
+       }
+ 
+diff --git a/net/netfilter/xt_IDLETIMER.c b/net/netfilter/xt_IDLETIMER.c
+index 1718f536689f..8a1d2af3eed0 100644
+--- a/net/netfilter/xt_IDLETIMER.c
++++ b/net/netfilter/xt_IDLETIMER.c
+@@ -116,6 +116,22 @@ static void idletimer_tg_expired(unsigned long data)
+       schedule_work(&timer->work);
+ }
+ 
++static int idletimer_check_sysfs_name(const char *name, unsigned int size)
++{
++      int ret;
++
++      ret = xt_check_proc_name(name, size);
++      if (ret < 0)
++              return ret;
++
++      if (!strcmp(name, "power") ||
++          !strcmp(name, "subsystem") ||
++          !strcmp(name, "uevent"))
++              return -EINVAL;
++
++      return 0;
++}
++
+ static int idletimer_tg_create(struct idletimer_tg_info *info)
+ {
+       int ret;
+@@ -126,6 +142,10 @@ static int idletimer_tg_create(struct idletimer_tg_info 
*info)
+               goto out;
+       }
+ 
++      ret = idletimer_check_sysfs_name(info->label, sizeof(info->label));
++      if (ret < 0)
++              goto out_free_timer;
++
+       sysfs_attr_init(&info->timer->attr.attr);
+       info->timer->attr.attr.name = kstrdup(info->label, GFP_KERNEL);
+       if (!info->timer->attr.attr.name) {
+diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c
+index 9b8d855e4a87..ed9bbd383f7d 100644
+--- a/net/sunrpc/xdr.c
++++ b/net/sunrpc/xdr.c
+@@ -512,7 +512,7 @@ EXPORT_SYMBOL_GPL(xdr_commit_encode);
+ static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr,
+               size_t nbytes)
+ {
+-      static __be32 *p;
++      __be32 *p;
+       int space_left;
+       int frag1bytes, frag2bytes;
+ 
+diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
+index 5897fc3857a0..5e9cf7d146f0 100644
+--- a/scripts/Kbuild.include
++++ b/scripts/Kbuild.include
+@@ -108,16 +108,21 @@ as-option = $(call try-run,\
+ as-instr = $(call try-run,\
+       printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o 
"$$TMP" -,$(2),$(3))
+ 
++# __cc-option
++# Usage: MY_CFLAGS += $(call 
__cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
++__cc-option = $(call try-run,\
++      $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4))
++
+ # cc-option
+ # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
+ 
+-cc-option = $(call try-run,\
+-      $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o 
"$$TMP",$(1),$(2))
++cc-option = $(call __cc-option, $(CC),\
++      $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2))
+ 
+ # cc-option-yn
+ # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
+ cc-option-yn = $(call try-run,\
+-      $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o 
"$$TMP",y,n)
++      $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c 
/dev/null -o "$$TMP",y,n)
+ 
+ # cc-option-align
+ # Prefix align with either -falign or -malign
+@@ -127,7 +132,7 @@ cc-option-align = $(subst -functions=0,,\
+ # cc-disable-warning
+ # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
+ cc-disable-warning = $(call try-run,\
+-      $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c 
/dev/null -o "$$TMP",-Wno-$(strip $(1)))
++      $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x 
c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
+ 
+ # cc-name
+ # Expands to either gcc or clang
+@@ -147,12 +152,13 @@ cc-ifversion = $(shell [ $(cc-version) $(1) $(2) ] && 
echo $(3) || echo $(4))
+ # cc-ldoption
+ # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
+ cc-ldoption = $(call try-run,\
+-      $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
++      $(CC) $(1) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -nostdlib -x c /dev/null 
-o "$$TMP",$(1),$(2))
+ 
+ # ld-option
+ # Usage: LDFLAGS += $(call ld-option, -X)
+ ld-option = $(call try-run,\
+-      $(CC) -x c /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o 
"$$TMP",$(1),$(2))
++      $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -x c /dev/null -c -o 
"$$TMPO"; \
++      $(LD) $(LDFLAGS) $(1) "$$TMPO" -o "$$TMP",$(1),$(2))
+ 
+ # ar-option
+ # Usage: KBUILD_ARFLAGS := $(call ar-option,D)
+diff --git a/scripts/Makefile.build b/scripts/Makefile.build
+index 18209917e379..42aef001dfdd 100644
+--- a/scripts/Makefile.build
++++ b/scripts/Makefile.build
+@@ -175,6 +175,14 @@ cmd_cc_symtypes_c =                                       
                  \
+ $(obj)/%.symtypes : $(src)/%.c FORCE
+       $(call cmd,cc_symtypes_c)
+ 
++# LLVM assembly
++# Generate .ll files from .c
++quiet_cmd_cc_ll_c = CC $(quiet_modtag)  $@
++      cmd_cc_ll_c = $(CC) $(c_flags) -emit-llvm -S -o $@ $<
++
++$(obj)/%.ll: $(src)/%.c FORCE
++      $(call if_changed_dep,cc_ll_c)
++
+ # C (.c) files
+ # The C file is compiled and updated dependency information is generated.
+ # (See cmd_cc_o_c + relevant part of rule_cc_o_c)
+diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
+index da3386a9d244..abe5f47b1ab0 100644
+--- a/scripts/Makefile.extrawarn
++++ b/scripts/Makefile.extrawarn
+@@ -61,7 +61,6 @@ ifeq ($(cc-name),clang)
+ KBUILD_CFLAGS += $(call cc-disable-warning, initializer-overrides)
+ KBUILD_CFLAGS += $(call cc-disable-warning, unused-value)
+ KBUILD_CFLAGS += $(call cc-disable-warning, format)
+-KBUILD_CFLAGS += $(call cc-disable-warning, unknown-warning-option)
+ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare)
+ KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length)
+ KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized)
+diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
+index a2d0e6d32659..27c56b5874f8 100644
+--- a/scripts/Makefile.lib
++++ b/scripts/Makefile.lib
+@@ -388,3 +388,34 @@ quiet_cmd_xzmisc = XZMISC  $@
+ cmd_xzmisc = (cat $(filter-out FORCE,$^) | \
+       xz --check=crc32 --lzma2=dict=1MiB) > $@ || \
+       (rm -f $@ ; false)
++
++# ASM offsets
++# ---------------------------------------------------------------------------
++
++# Default sed regexp - multiline due to syntax constraints
++#
++# Use [:space:] because LLVM's integrated assembler inserts <tab> around
++# the .ascii directive whereas GCC keeps the <space> as-is.
++define sed-offsets
++      's:^[[:space:]]*\.ascii[[:space:]]*"\(.*\)".*:\1:; \
++      /^->/{s:->#\(.*\):/* \1 */:; \
++      s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
++      s:->::; p;}'
++endef
++
++# Use filechk to avoid rebuilds when a header changes, but the resulting file
++# does not
++define filechk_offsets
++      (set -e; \
++       echo "#ifndef $2"; \
++       echo "#define $2"; \
++       echo "/*"; \
++       echo " * DO NOT MODIFY."; \
++       echo " *"; \
++       echo " * This file was generated by Kbuild"; \
++       echo " */"; \
++       echo ""; \
++       sed -ne $(sed-offsets); \
++       echo ""; \
++       echo "#endif" )
++endef
+diff --git a/scripts/mod/Makefile b/scripts/mod/Makefile
+index c11212ff3510..e0cb2e4a3b15 100644
+--- a/scripts/mod/Makefile
++++ b/scripts/mod/Makefile
+@@ -5,32 +5,8 @@ modpost-objs  := modpost.o file2alias.o sumversion.o
+ 
+ devicetable-offsets-file := devicetable-offsets.h
+ 
+-define sed-y
+-      "/^->/{s:->#\(.*\):/* \1 */:; \
+-      s:^->\([^ ]*\) [\$$#]*\([-0-9]*\) \(.*\):#define \1 \2 /* \3 */:; \
+-      s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
+-      s:->::; p;}"
+-endef
+-
+-quiet_cmd_offsets = GEN     $@
+-define cmd_offsets
+-      (set -e; \
+-       echo "#ifndef __DEVICETABLE_OFFSETS_H__"; \
+-       echo "#define __DEVICETABLE_OFFSETS_H__"; \
+-       echo "/*"; \
+-       echo " * DO NOT MODIFY."; \
+-       echo " *"; \
+-       echo " * This file was generated by Kbuild"; \
+-       echo " *"; \
+-       echo " */"; \
+-       echo ""; \
+-       sed -ne $(sed-y) $<; \
+-       echo ""; \
+-       echo "#endif" ) > $@
+-endef
+-
+-$(obj)/$(devicetable-offsets-file): $(obj)/devicetable-offsets.s
+-      $(call if_changed,offsets)
++$(obj)/$(devicetable-offsets-file): $(obj)/devicetable-offsets.s FORCE
++      $(call filechk,offsets,__DEVICETABLE_OFFSETS_H__)
+ 
+ targets += $(devicetable-offsets-file) devicetable-offsets.s
+ 

Reply via email to