public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/hardened-patchset:master commit in: 4.8.15/
@ 2017-01-01 19:58 Anthony G. Basile
  0 siblings, 0 replies; 2+ messages in thread
From: Anthony G. Basile @ 2017-01-01 19:58 UTC (permalink / raw
  To: gentoo-commits

commit:     1b413d517df92fadb5758bba4463c8bd6f73fb25
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Sun Jan  1 19:54:26 2017 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Sun Jan  1 19:54:26 2017 +0000
URL:        https://gitweb.gentoo.org/proj/hardened-patchset.git/commit/?id=1b413d51

grsecurity-3.1-4.8.15-201612301949

 4.8.15/0000_README                                 |   18 +-
 4.8.15/1012_linux-4.8.13.patch                     | 1063 ------------
 4.8.15/1013_linux-4.8.14.patch                     | 1725 --------------------
 4.8.15/1014_linux-4.8.15.patch                     | 1042 ------------
 ... 4420_grsecurity-3.1-4.8.15-201612301949.patch} |   14 +-
 4.8.15/4426_default_XATTR_PAX_FLAGS.patch          |   36 +
 6 files changed, 50 insertions(+), 3848 deletions(-)

diff --git a/4.8.15/0000_README b/4.8.15/0000_README
index cd91d08..97a03a1 100644
--- a/4.8.15/0000_README
+++ b/4.8.15/0000_README
@@ -2,19 +2,7 @@ README
 -----------------------------------------------------------------------------
 Individual Patch Descriptions:
 -----------------------------------------------------------------------------
-Patch:	1012_linux-4.8.13.patch
-From:	http://www.kernel.org
-Desc:	Linux 4.8.13
-
-Patch:	1013_linux-4.8.14.patch
-From:	http://www.kernel.org
-Desc:	Linux 4.8.14
-
-Patch:	1014_linux-4.8.15.patch
-From:	http://www.kernel.org
-Desc:	Linux 4.8.15
-
-Patch:	4420_grsecurity-3.1-4.8.15-201612151923.patch
+Patch:	4420_grsecurity-3.1-4.8.15-201612301949.patch
 From:	http://www.grsecurity.net
 Desc:	hardened-sources base patch from upstream grsecurity
 
@@ -22,6 +10,10 @@ Patch:	4425_grsec_remove_EI_PAX.patch
 From:	Anthony G. Basile <blueness@gentoo.org>
 Desc:	Remove EI_PAX option and force off
 
+Patch:	4426_default_XATTR_PAX_FLAGS.patch
+From:	Anthony G. Basile <blueness@gentoo.org>
+Desc:	Defalut PT_PAX_FLAGS off and XATTR_PAX_FLAGS on
+
 Patch:	4427_force_XATTR_PAX_tmpfs.patch
 From:	Anthony G. Basile <blueness@gentoo.org>
 Desc:	Force XATTR_PAX on tmpfs

diff --git a/4.8.15/1012_linux-4.8.13.patch b/4.8.15/1012_linux-4.8.13.patch
deleted file mode 100644
index c742393..0000000
--- a/4.8.15/1012_linux-4.8.13.patch
+++ /dev/null
@@ -1,1063 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 7b0c92f..b38abe9 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 8
--SUBLEVEL = 12
-+SUBLEVEL = 13
- EXTRAVERSION =
- NAME = Psychotic Stoned Sheep
- 
-diff --git a/arch/arc/include/asm/delay.h b/arch/arc/include/asm/delay.h
-index 08e7e2a..a36e860 100644
---- a/arch/arc/include/asm/delay.h
-+++ b/arch/arc/include/asm/delay.h
-@@ -22,10 +22,11 @@
- static inline void __delay(unsigned long loops)
- {
- 	__asm__ __volatile__(
--	"	lp  1f	\n"
--	"	nop	\n"
--	"1:		\n"
--	: "+l"(loops));
-+	"	mov lp_count, %0	\n"
-+	"	lp  1f			\n"
-+	"	nop			\n"
-+	"1:				\n"
-+	: : "r"(loops));
- }
- 
- extern void __bad_udelay(void);
-diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
-index 89eeb37..e94ca72 100644
---- a/arch/arc/include/asm/pgtable.h
-+++ b/arch/arc/include/asm/pgtable.h
-@@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
- 
- #define pte_page(pte)		pfn_to_page(pte_pfn(pte))
- #define mk_pte(page, prot)	pfn_pte(page_to_pfn(page), prot)
--#define pfn_pte(pfn, prot)	__pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-+#define pfn_pte(pfn, prot)	__pte(__pfn_to_phys(pfn) | pgprot_val(prot))
- 
- /* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
- #define pte_pfn(pte)		(pte_val(pte) >> PAGE_SHIFT)
-diff --git a/arch/arm64/boot/dts/arm/juno-r1.dts b/arch/arm64/boot/dts/arm/juno-r1.dts
-index 123a58b..f0b857d 100644
---- a/arch/arm64/boot/dts/arm/juno-r1.dts
-+++ b/arch/arm64/boot/dts/arm/juno-r1.dts
-@@ -76,7 +76,7 @@
- 				compatible = "arm,idle-state";
- 				arm,psci-suspend-param = <0x1010000>;
- 				local-timer-stop;
--				entry-latency-us = <300>;
-+				entry-latency-us = <400>;
- 				exit-latency-us = <1200>;
- 				min-residency-us = <2500>;
- 			};
-diff --git a/arch/arm64/boot/dts/arm/juno-r2.dts b/arch/arm64/boot/dts/arm/juno-r2.dts
-index 007be82..26aaa6a 100644
---- a/arch/arm64/boot/dts/arm/juno-r2.dts
-+++ b/arch/arm64/boot/dts/arm/juno-r2.dts
-@@ -76,7 +76,7 @@
- 				compatible = "arm,idle-state";
- 				arm,psci-suspend-param = <0x1010000>;
- 				local-timer-stop;
--				entry-latency-us = <300>;
-+				entry-latency-us = <400>;
- 				exit-latency-us = <1200>;
- 				min-residency-us = <2500>;
- 			};
-diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts
-index a7270ef..6e154d9 100644
---- a/arch/arm64/boot/dts/arm/juno.dts
-+++ b/arch/arm64/boot/dts/arm/juno.dts
-@@ -76,7 +76,7 @@
- 				compatible = "arm,idle-state";
- 				arm,psci-suspend-param = <0x1010000>;
- 				local-timer-stop;
--				entry-latency-us = <300>;
-+				entry-latency-us = <400>;
- 				exit-latency-us = <1200>;
- 				min-residency-us = <2500>;
- 			};
-diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
-index 7099f26..b96346b 100644
---- a/arch/arm64/include/asm/cpufeature.h
-+++ b/arch/arm64/include/asm/cpufeature.h
-@@ -90,7 +90,7 @@ struct arm64_cpu_capabilities {
- 	u16 capability;
- 	int def_scope;			/* default scope */
- 	bool (*matches)(const struct arm64_cpu_capabilities *caps, int scope);
--	void (*enable)(void *);		/* Called on all active CPUs */
-+	int (*enable)(void *);		/* Called on all active CPUs */
- 	union {
- 		struct {	/* To be used for erratum handling only */
- 			u32 midr_model;
-diff --git a/arch/arm64/include/asm/exec.h b/arch/arm64/include/asm/exec.h
-index db0563c..f7865dd 100644
---- a/arch/arm64/include/asm/exec.h
-+++ b/arch/arm64/include/asm/exec.h
-@@ -18,6 +18,9 @@
- #ifndef __ASM_EXEC_H
- #define __ASM_EXEC_H
- 
-+#include <linux/sched.h>
-+
- extern unsigned long arch_align_stack(unsigned long sp);
-+void uao_thread_switch(struct task_struct *next);
- 
- #endif	/* __ASM_EXEC_H */
-diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
-index ace0a96..3be0ab0 100644
---- a/arch/arm64/include/asm/processor.h
-+++ b/arch/arm64/include/asm/processor.h
-@@ -190,8 +190,8 @@ static inline void spin_lock_prefetch(const void *ptr)
- 
- #endif
- 
--void cpu_enable_pan(void *__unused);
--void cpu_enable_uao(void *__unused);
--void cpu_enable_cache_maint_trap(void *__unused);
-+int cpu_enable_pan(void *__unused);
-+int cpu_enable_uao(void *__unused);
-+int cpu_enable_cache_maint_trap(void *__unused);
- 
- #endif /* __ASM_PROCESSOR_H */
-diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
-index 62272ea..94a0330 100644
---- a/arch/arm64/kernel/cpufeature.c
-+++ b/arch/arm64/kernel/cpufeature.c
-@@ -19,7 +19,9 @@
- #define pr_fmt(fmt) "CPU features: " fmt
- 
- #include <linux/bsearch.h>
-+#include <linux/cpumask.h>
- #include <linux/sort.h>
-+#include <linux/stop_machine.h>
- #include <linux/types.h>
- #include <asm/cpu.h>
- #include <asm/cpufeature.h>
-@@ -936,7 +938,13 @@ void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps)
- {
- 	for (; caps->matches; caps++)
- 		if (caps->enable && cpus_have_cap(caps->capability))
--			on_each_cpu(caps->enable, NULL, true);
-+			/*
-+			 * Use stop_machine() as it schedules the work allowing
-+			 * us to modify PSTATE, instead of on_each_cpu() which
-+			 * uses an IPI, giving us a PSTATE that disappears when
-+			 * we return.
-+			 */
-+			stop_machine(caps->enable, NULL, cpu_online_mask);
- }
- 
- /*
-diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
-index 6cd2612..9cc8667 100644
---- a/arch/arm64/kernel/process.c
-+++ b/arch/arm64/kernel/process.c
-@@ -49,6 +49,7 @@
- #include <asm/alternative.h>
- #include <asm/compat.h>
- #include <asm/cacheflush.h>
-+#include <asm/exec.h>
- #include <asm/fpsimd.h>
- #include <asm/mmu_context.h>
- #include <asm/processor.h>
-@@ -303,7 +304,7 @@ static void tls_thread_switch(struct task_struct *next)
- }
- 
- /* Restore the UAO state depending on next's addr_limit */
--static void uao_thread_switch(struct task_struct *next)
-+void uao_thread_switch(struct task_struct *next)
- {
- 	if (IS_ENABLED(CONFIG_ARM64_UAO)) {
- 		if (task_thread_info(next)->addr_limit == KERNEL_DS)
-diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c
-index b616e365..23ddf55 100644
---- a/arch/arm64/kernel/suspend.c
-+++ b/arch/arm64/kernel/suspend.c
-@@ -1,8 +1,11 @@
- #include <linux/ftrace.h>
- #include <linux/percpu.h>
- #include <linux/slab.h>
-+#include <asm/alternative.h>
- #include <asm/cacheflush.h>
-+#include <asm/cpufeature.h>
- #include <asm/debug-monitors.h>
-+#include <asm/exec.h>
- #include <asm/pgtable.h>
- #include <asm/memory.h>
- #include <asm/mmu_context.h>
-@@ -48,6 +51,14 @@ void notrace __cpu_suspend_exit(void)
- 	set_my_cpu_offset(per_cpu_offset(smp_processor_id()));
- 
- 	/*
-+	 * PSTATE was not saved over suspend/resume, re-enable any detected
-+	 * features that might not have been set correctly.
-+	 */
-+	asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN,
-+			CONFIG_ARM64_PAN));
-+	uao_thread_switch(current);
-+
-+	/*
- 	 * Restore HW breakpoint registers to sane values
- 	 * before debug exceptions are possibly reenabled
- 	 * through local_dbg_restore.
-diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
-index 771a01a7f..9595d3d 100644
---- a/arch/arm64/kernel/traps.c
-+++ b/arch/arm64/kernel/traps.c
-@@ -428,9 +428,10 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
- 	force_signal_inject(SIGILL, ILL_ILLOPC, regs, 0);
- }
- 
--void cpu_enable_cache_maint_trap(void *__unused)
-+int cpu_enable_cache_maint_trap(void *__unused)
- {
- 	config_sctlr_el1(SCTLR_EL1_UCI, 0);
-+	return 0;
- }
- 
- #define __user_cache_maint(insn, address, res)			\
-diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
-index 05d2bd7..67506c3 100644
---- a/arch/arm64/mm/fault.c
-+++ b/arch/arm64/mm/fault.c
-@@ -29,7 +29,9 @@
- #include <linux/sched.h>
- #include <linux/highmem.h>
- #include <linux/perf_event.h>
-+#include <linux/preempt.h>
- 
-+#include <asm/bug.h>
- #include <asm/cpufeature.h>
- #include <asm/exception.h>
- #include <asm/debug-monitors.h>
-@@ -671,9 +673,17 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
- NOKPROBE_SYMBOL(do_debug_exception);
- 
- #ifdef CONFIG_ARM64_PAN
--void cpu_enable_pan(void *__unused)
-+int cpu_enable_pan(void *__unused)
- {
-+	/*
-+	 * We modify PSTATE. This won't work from irq context as the PSTATE
-+	 * is discarded once we return from the exception.
-+	 */
-+	WARN_ON_ONCE(in_interrupt());
-+
- 	config_sctlr_el1(SCTLR_EL1_SPAN, 0);
-+	asm(SET_PSTATE_PAN(1));
-+	return 0;
- }
- #endif /* CONFIG_ARM64_PAN */
- 
-@@ -684,8 +694,9 @@ void cpu_enable_pan(void *__unused)
-  * We need to enable the feature at runtime (instead of adding it to
-  * PSR_MODE_EL1h) as the feature may not be implemented by the cpu.
-  */
--void cpu_enable_uao(void *__unused)
-+int cpu_enable_uao(void *__unused)
- {
- 	asm(SET_PSTATE_UAO(1));
-+	return 0;
- }
- #endif /* CONFIG_ARM64_UAO */
-diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
-index d0efb5c..a4e070a 100644
---- a/arch/x86/events/core.c
-+++ b/arch/x86/events/core.c
-@@ -2344,7 +2344,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
- 		frame.next_frame     = 0;
- 		frame.return_address = 0;
- 
--		if (!access_ok(VERIFY_READ, fp, 8))
-+		if (!valid_user_frame(fp, sizeof(frame)))
- 			break;
- 
- 		bytes = __copy_from_user_nmi(&frame.next_frame, fp, 4);
-@@ -2354,9 +2354,6 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
- 		if (bytes != 0)
- 			break;
- 
--		if (!valid_user_frame(fp, sizeof(frame)))
--			break;
--
- 		perf_callchain_store(entry, cs_base + frame.return_address);
- 		fp = compat_ptr(ss_base + frame.next_frame);
- 	}
-@@ -2405,7 +2402,7 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
- 		frame.next_frame	     = NULL;
- 		frame.return_address = 0;
- 
--		if (!access_ok(VERIFY_READ, fp, sizeof(*fp) * 2))
-+		if (!valid_user_frame(fp, sizeof(frame)))
- 			break;
- 
- 		bytes = __copy_from_user_nmi(&frame.next_frame, fp, sizeof(*fp));
-@@ -2415,9 +2412,6 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
- 		if (bytes != 0)
- 			break;
- 
--		if (!valid_user_frame(fp, sizeof(frame)))
--			break;
--
- 		perf_callchain_store(entry, frame.return_address);
- 		fp = (void __user *)frame.next_frame;
- 	}
-diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
-index e207b33..1e007a9 100644
---- a/drivers/ata/libata-scsi.c
-+++ b/drivers/ata/libata-scsi.c
-@@ -1088,7 +1088,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
- 		desc[1] = tf->command; /* status */
- 		desc[2] = tf->device;
- 		desc[3] = tf->nsect;
--		desc[0] = 0;
-+		desc[7] = 0;
- 		if (tf->flags & ATA_TFLAG_LBA48)  {
- 			desc[8] |= 0x80;
- 			if (tf->hob_nsect)
-diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
-index 04365b1..5163c8f 100644
---- a/drivers/block/zram/zram_drv.c
-+++ b/drivers/block/zram/zram_drv.c
-@@ -1403,7 +1403,8 @@ static ssize_t hot_remove_store(struct class *class,
- 	zram = idr_find(&zram_index_idr, dev_id);
- 	if (zram) {
- 		ret = zram_remove(zram);
--		idr_remove(&zram_index_idr, dev_id);
-+		if (!ret)
-+			idr_remove(&zram_index_idr, dev_id);
- 	} else {
- 		ret = -ENODEV;
- 	}
-diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
-index 838b22a..f2c9274 100644
---- a/drivers/clk/sunxi/clk-sunxi.c
-+++ b/drivers/clk/sunxi/clk-sunxi.c
-@@ -373,7 +373,7 @@ static void sun4i_get_apb1_factors(struct factors_request *req)
- 	else
- 		calcp = 3;
- 
--	calcm = (req->parent_rate >> calcp) - 1;
-+	calcm = (div >> calcp) - 1;
- 
- 	req->rate = (req->parent_rate >> calcp) / (calcm + 1);
- 	req->m = calcm;
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
-index 10b5ddf..1ed085f 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
-@@ -33,6 +33,7 @@ struct amdgpu_atpx {
- 
- static struct amdgpu_atpx_priv {
- 	bool atpx_detected;
-+	bool bridge_pm_usable;
- 	/* handle for device - and atpx */
- 	acpi_handle dhandle;
- 	acpi_handle other_handle;
-@@ -200,7 +201,11 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)
- 	atpx->is_hybrid = false;
- 	if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {
- 		printk("ATPX Hybrid Graphics\n");
--		atpx->functions.power_cntl = false;
-+		/*
-+		 * Disable legacy PM methods only when pcie port PM is usable,
-+		 * otherwise the device might fail to power off or power on.
-+		 */
-+		atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable;
- 		atpx->is_hybrid = true;
- 	}
- 
-@@ -546,17 +551,25 @@ static bool amdgpu_atpx_detect(void)
- 	struct pci_dev *pdev = NULL;
- 	bool has_atpx = false;
- 	int vga_count = 0;
-+	bool d3_supported = false;
-+	struct pci_dev *parent_pdev;
- 
- 	while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
- 		vga_count++;
- 
- 		has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
-+
-+		parent_pdev = pci_upstream_bridge(pdev);
-+		d3_supported |= parent_pdev && parent_pdev->bridge_d3;
- 	}
- 
- 	while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {
- 		vga_count++;
- 
- 		has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
-+
-+		parent_pdev = pci_upstream_bridge(pdev);
-+		d3_supported |= parent_pdev && parent_pdev->bridge_d3;
- 	}
- 
- 	if (has_atpx && vga_count == 2) {
-@@ -564,6 +577,7 @@ static bool amdgpu_atpx_detect(void)
- 		printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
- 		       acpi_method_name);
- 		amdgpu_atpx_priv.atpx_detected = true;
-+		amdgpu_atpx_priv.bridge_pm_usable = d3_supported;
- 		amdgpu_atpx_init();
- 		return true;
- 	}
-diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
-index a77ce99..b8e3854 100644
---- a/drivers/gpu/drm/i915/i915_gem.c
-+++ b/drivers/gpu/drm/i915/i915_gem.c
-@@ -2540,7 +2540,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
- 			page = shmem_read_mapping_page(mapping, i);
- 			if (IS_ERR(page)) {
- 				ret = PTR_ERR(page);
--				goto err_pages;
-+				goto err_sg;
- 			}
- 		}
- #ifdef CONFIG_SWIOTLB
-@@ -2583,8 +2583,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
- 
- 	return 0;
- 
--err_pages:
-+err_sg:
- 	sg_mark_end(sg);
-+err_pages:
- 	for_each_sgt_page(page, sgt_iter, st)
- 		put_page(page);
- 	sg_free_table(st);
-diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index e26f889..35d385d 100644
---- a/drivers/gpu/drm/i915/intel_display.c
-+++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -11791,7 +11791,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
- 	intel_crtc->reset_counter = i915_reset_counter(&dev_priv->gpu_error);
- 	if (__i915_reset_in_progress_or_wedged(intel_crtc->reset_counter)) {
- 		ret = -EIO;
--		goto cleanup;
-+		goto unlock;
- 	}
- 
- 	atomic_inc(&intel_crtc->unpin_work_count);
-@@ -11877,6 +11877,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
- 	if (!IS_ERR_OR_NULL(request))
- 		i915_add_request_no_flush(request);
- 	atomic_dec(&intel_crtc->unpin_work_count);
-+unlock:
- 	mutex_unlock(&dev->struct_mutex);
- cleanup:
- 	crtc->primary->fb = old_fb;
-diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
-index 8f62671f..54acfcc 100644
---- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
-+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
-@@ -249,13 +249,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
- 	if (irq < 0)
- 		return irq;
- 
--	ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
--			       IRQF_TRIGGER_NONE, dev_name(dev), priv);
--	if (ret < 0) {
--		dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
--		return ret;
--	}
--
- 	comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL);
- 	if (comp_id < 0) {
- 		dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
-@@ -271,6 +264,13 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
- 
- 	platform_set_drvdata(pdev, priv);
- 
-+	ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
-+			       IRQF_TRIGGER_NONE, dev_name(dev), priv);
-+	if (ret < 0) {
-+		dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
-+		return ret;
-+	}
-+
- 	ret = component_add(dev, &mtk_disp_ovl_component_ops);
- 	if (ret)
- 		dev_err(dev, "Failed to add component: %d\n", ret);
-diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
-index ddef0d4..34b4ace 100644
---- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c
-+++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
-@@ -33,6 +33,7 @@ struct radeon_atpx {
- 
- static struct radeon_atpx_priv {
- 	bool atpx_detected;
-+	bool bridge_pm_usable;
- 	/* handle for device - and atpx */
- 	acpi_handle dhandle;
- 	struct radeon_atpx atpx;
-@@ -198,7 +199,11 @@ static int radeon_atpx_validate(struct radeon_atpx *atpx)
- 	atpx->is_hybrid = false;
- 	if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {
- 		printk("ATPX Hybrid Graphics\n");
--		atpx->functions.power_cntl = false;
-+		/*
-+		 * Disable legacy PM methods only when pcie port PM is usable,
-+		 * otherwise the device might fail to power off or power on.
-+		 */
-+		atpx->functions.power_cntl = !radeon_atpx_priv.bridge_pm_usable;
- 		atpx->is_hybrid = true;
- 	}
- 
-@@ -543,11 +548,16 @@ static bool radeon_atpx_detect(void)
- 	struct pci_dev *pdev = NULL;
- 	bool has_atpx = false;
- 	int vga_count = 0;
-+	bool d3_supported = false;
-+	struct pci_dev *parent_pdev;
- 
- 	while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
- 		vga_count++;
- 
- 		has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
-+
-+		parent_pdev = pci_upstream_bridge(pdev);
-+		d3_supported |= parent_pdev && parent_pdev->bridge_d3;
- 	}
- 
- 	/* some newer PX laptops mark the dGPU as a non-VGA display device */
-@@ -555,6 +565,9 @@ static bool radeon_atpx_detect(void)
- 		vga_count++;
- 
- 		has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
-+
-+		parent_pdev = pci_upstream_bridge(pdev);
-+		d3_supported |= parent_pdev && parent_pdev->bridge_d3;
- 	}
- 
- 	if (has_atpx && vga_count == 2) {
-@@ -562,6 +575,7 @@ static bool radeon_atpx_detect(void)
- 		printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
- 		       acpi_method_name);
- 		radeon_atpx_priv.atpx_detected = true;
-+		radeon_atpx_priv.bridge_pm_usable = d3_supported;
- 		radeon_atpx_init();
- 		return true;
- 	}
-diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
-index 5784e20..9f6203c 100644
---- a/drivers/input/mouse/psmouse-base.c
-+++ b/drivers/input/mouse/psmouse-base.c
-@@ -1115,10 +1115,6 @@ static int psmouse_extensions(struct psmouse *psmouse,
- 		if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2,
- 					 &max_proto, set_properties, true))
- 			return PSMOUSE_TOUCHKIT_PS2;
--
--		if (psmouse_try_protocol(psmouse, PSMOUSE_BYD,
--					 &max_proto, set_properties, true))
--			return PSMOUSE_BYD;
- 	}
- 
- 	/*
-diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
-index a8ff969..cbc7dfa 100644
---- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
-+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
-@@ -2203,8 +2203,9 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len,
- 			is_scanning_required = 1;
- 		} else {
- 			mwifiex_dbg(priv->adapter, MSG,
--				    "info: trying to associate to '%s' bssid %pM\n",
--				    (char *)req_ssid.ssid, bss->bssid);
-+				    "info: trying to associate to '%.*s' bssid %pM\n",
-+				    req_ssid.ssid_len, (char *)req_ssid.ssid,
-+				    bss->bssid);
- 			memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN);
- 			break;
- 		}
-@@ -2264,8 +2265,8 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
- 	}
- 
- 	mwifiex_dbg(adapter, INFO,
--		    "info: Trying to associate to %s and bssid %pM\n",
--		    (char *)sme->ssid, sme->bssid);
-+		    "info: Trying to associate to %.*s and bssid %pM\n",
-+		    (int)sme->ssid_len, (char *)sme->ssid, sme->bssid);
- 
- 	if (!mwifiex_stop_bg_scan(priv))
- 		cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy);
-@@ -2398,8 +2399,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
- 	}
- 
- 	mwifiex_dbg(priv->adapter, MSG,
--		    "info: trying to join to %s and bssid %pM\n",
--		    (char *)params->ssid, params->bssid);
-+		    "info: trying to join to %.*s and bssid %pM\n",
-+		    params->ssid_len, (char *)params->ssid, params->bssid);
- 
- 	mwifiex_set_ibss_params(priv, params);
- 
-diff --git a/drivers/pci/pcie/aer/aer_inject.c b/drivers/pci/pcie/aer/aer_inject.c
-index db553dc..2b6a592 100644
---- a/drivers/pci/pcie/aer/aer_inject.c
-+++ b/drivers/pci/pcie/aer/aer_inject.c
-@@ -307,20 +307,6 @@ static int pci_bus_set_aer_ops(struct pci_bus *bus)
- 	return 0;
- }
- 
--static struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
--{
--	while (1) {
--		if (!pci_is_pcie(dev))
--			break;
--		if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
--			return dev;
--		if (!dev->bus->self)
--			break;
--		dev = dev->bus->self;
--	}
--	return NULL;
--}
--
- static int find_aer_device_iter(struct device *device, void *data)
- {
- 	struct pcie_device **result = data;
-diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
-index 93f280d..f6eff4a 100644
---- a/drivers/pci/probe.c
-+++ b/drivers/pci/probe.c
-@@ -1439,6 +1439,21 @@ static void program_hpp_type1(struct pci_dev *dev, struct hpp_type1 *hpp)
- 		dev_warn(&dev->dev, "PCI-X settings not supported\n");
- }
- 
-+static bool pcie_root_rcb_set(struct pci_dev *dev)
-+{
-+	struct pci_dev *rp = pcie_find_root_port(dev);
-+	u16 lnkctl;
-+
-+	if (!rp)
-+		return false;
-+
-+	pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &lnkctl);
-+	if (lnkctl & PCI_EXP_LNKCTL_RCB)
-+		return true;
-+
-+	return false;
-+}
-+
- static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
- {
- 	int pos;
-@@ -1468,9 +1483,20 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
- 			~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or);
- 
- 	/* Initialize Link Control Register */
--	if (pcie_cap_has_lnkctl(dev))
-+	if (pcie_cap_has_lnkctl(dev)) {
-+
-+		/*
-+		 * If the Root Port supports Read Completion Boundary of
-+		 * 128, set RCB to 128.  Otherwise, clear it.
-+		 */
-+		hpp->pci_exp_lnkctl_and |= PCI_EXP_LNKCTL_RCB;
-+		hpp->pci_exp_lnkctl_or &= ~PCI_EXP_LNKCTL_RCB;
-+		if (pcie_root_rcb_set(dev))
-+			hpp->pci_exp_lnkctl_or |= PCI_EXP_LNKCTL_RCB;
-+
- 		pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL,
- 			~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or);
-+	}
- 
- 	/* Find Advanced Error Reporting Enhanced Capability */
- 	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
-diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c
-index 0296d81..a813239 100644
---- a/drivers/pwm/sysfs.c
-+++ b/drivers/pwm/sysfs.c
-@@ -425,6 +425,8 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
- 		if (test_bit(PWMF_EXPORTED, &pwm->flags))
- 			pwm_unexport_child(parent, pwm);
- 	}
-+
-+	put_device(parent);
- }
- 
- static int __init pwm_sysfs_init(void)
-diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
-index 030d002..5138a84 100644
---- a/drivers/scsi/hpsa.c
-+++ b/drivers/scsi/hpsa.c
-@@ -2007,7 +2007,7 @@ static struct hpsa_scsi_dev_t *lookup_hpsa_scsi_dev(struct ctlr_info *h,
- 
- static int hpsa_slave_alloc(struct scsi_device *sdev)
- {
--	struct hpsa_scsi_dev_t *sd;
-+	struct hpsa_scsi_dev_t *sd = NULL;
- 	unsigned long flags;
- 	struct ctlr_info *h;
- 
-@@ -2024,7 +2024,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev)
- 			sd->target = sdev_id(sdev);
- 			sd->lun = sdev->lun;
- 		}
--	} else
-+	}
-+	if (!sd)
- 		sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev),
- 					sdev_id(sdev), sdev->lun);
- 
-@@ -3805,6 +3806,7 @@ static int hpsa_update_device_info(struct ctlr_info *h,
- 		sizeof(this_device->vendor));
- 	memcpy(this_device->model, &inq_buff[16],
- 		sizeof(this_device->model));
-+	this_device->rev = inq_buff[2];
- 	memset(this_device->device_id, 0,
- 		sizeof(this_device->device_id));
- 	hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
-@@ -3887,10 +3889,14 @@ static void figure_bus_target_lun(struct ctlr_info *h,
- 
- 	if (!is_logical_dev_addr_mode(lunaddrbytes)) {
- 		/* physical device, target and lun filled in later */
--		if (is_hba_lunid(lunaddrbytes))
-+		if (is_hba_lunid(lunaddrbytes)) {
-+			int bus = HPSA_HBA_BUS;
-+
-+			if (!device->rev)
-+				bus = HPSA_LEGACY_HBA_BUS;
- 			hpsa_set_bus_target_lun(device,
--					HPSA_HBA_BUS, 0, lunid & 0x3fff);
--		else
-+					bus, 0, lunid & 0x3fff);
-+		} else
- 			/* defer target, lun assignment for physical devices */
- 			hpsa_set_bus_target_lun(device,
- 					HPSA_PHYSICAL_DEVICE_BUS, -1, -1);
-diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
-index a1487e6..9d45dde 100644
---- a/drivers/scsi/hpsa.h
-+++ b/drivers/scsi/hpsa.h
-@@ -69,6 +69,7 @@ struct hpsa_scsi_dev_t {
- 	u64 sas_address;
- 	unsigned char vendor[8];        /* bytes 8-15 of inquiry data */
- 	unsigned char model[16];        /* bytes 16-31 of inquiry data */
-+	unsigned char rev;		/* byte 2 of inquiry data */
- 	unsigned char raid_level;	/* from inquiry page 0xC1 */
- 	unsigned char volume_offline;	/* discovered via TUR or VPD */
- 	u16 queue_depth;		/* max queue_depth for this device */
-@@ -403,6 +404,7 @@ struct offline_device_entry {
- #define HPSA_RAID_VOLUME_BUS		1
- #define HPSA_EXTERNAL_RAID_VOLUME_BUS	2
- #define HPSA_HBA_BUS			0
-+#define HPSA_LEGACY_HBA_BUS		3
- 
- /*
- 	Send the command to the hardware
-diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
-index 04ce7cf..50c7167 100644
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -308,7 +308,7 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
- 	fc_stats = &lport->host_stats;
- 	memset(fc_stats, 0, sizeof(struct fc_host_statistics));
- 
--	fc_stats->seconds_since_last_reset = (lport->boot_time - jiffies) / HZ;
-+	fc_stats->seconds_since_last_reset = (jiffies - lport->boot_time) / HZ;
- 
- 	for_each_possible_cpu(cpu) {
- 		struct fc_stats *stats;
-diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
-index a78415d..78be4ae 100644
---- a/fs/overlayfs/super.c
-+++ b/fs/overlayfs/super.c
-@@ -329,11 +329,11 @@ static struct dentry *ovl_d_real(struct dentry *dentry,
- 	if (!real)
- 		goto bug;
- 
-+	/* Handle recursion */
-+	real = d_real(real, inode, open_flags);
-+
- 	if (!inode || inode == d_inode(real))
- 		return real;
--
--	/* Handle recursion */
--	return d_real(real, inode, open_flags);
- bug:
- 	WARN(1, "ovl_d_real(%pd4, %s:%lu): real dentry not found\n", dentry,
- 	     inode ? inode->i_sb->s_id : "NULL", inode ? inode->i_ino : 0);
-diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
-index 573c5a1..0a0b2d5 100644
---- a/include/linux/compiler-gcc.h
-+++ b/include/linux/compiler-gcc.h
-@@ -256,7 +256,9 @@
- #endif
- #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP && !__CHECKER__ */
- 
--#if GCC_VERSION >= 50000
-+#if GCC_VERSION >= 70000
-+#define KASAN_ABI_VERSION 5
-+#elif GCC_VERSION >= 50000
- #define KASAN_ABI_VERSION 4
- #elif GCC_VERSION >= 40902
- #define KASAN_ABI_VERSION 3
-diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
-index 01e8443..d47cc4a 100644
---- a/include/linux/pagemap.h
-+++ b/include/linux/pagemap.h
-@@ -364,16 +364,13 @@ static inline struct page *read_mapping_page(struct address_space *mapping,
- }
- 
- /*
-- * Get the offset in PAGE_SIZE.
-- * (TODO: hugepage should have ->index in PAGE_SIZE)
-+ * Get index of the page with in radix-tree
-+ * (TODO: remove once hugetlb pages will have ->index in PAGE_SIZE)
-  */
--static inline pgoff_t page_to_pgoff(struct page *page)
-+static inline pgoff_t page_to_index(struct page *page)
- {
- 	pgoff_t pgoff;
- 
--	if (unlikely(PageHeadHuge(page)))
--		return page->index << compound_order(page);
--
- 	if (likely(!PageTransTail(page)))
- 		return page->index;
- 
-@@ -387,6 +384,18 @@ static inline pgoff_t page_to_pgoff(struct page *page)
- }
- 
- /*
-+ * Get the offset in PAGE_SIZE.
-+ * (TODO: hugepage should have ->index in PAGE_SIZE)
-+ */
-+static inline pgoff_t page_to_pgoff(struct page *page)
-+{
-+	if (unlikely(PageHeadHuge(page)))
-+		return page->index << compound_order(page);
-+
-+	return page_to_index(page);
-+}
-+
-+/*
-  * Return byte-offset into filesystem object for page.
-  */
- static inline loff_t page_offset(struct page *page)
-diff --git a/include/linux/pci.h b/include/linux/pci.h
-index 0ab8359..03f3df0 100644
---- a/include/linux/pci.h
-+++ b/include/linux/pci.h
-@@ -1896,6 +1896,20 @@ static inline int pci_pcie_type(const struct pci_dev *dev)
- 	return (pcie_caps_reg(dev) & PCI_EXP_FLAGS_TYPE) >> 4;
- }
- 
-+static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
-+{
-+	while (1) {
-+		if (!pci_is_pcie(dev))
-+			break;
-+		if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
-+			return dev;
-+		if (!dev->bus->self)
-+			break;
-+		dev = dev->bus->self;
-+	}
-+	return NULL;
-+}
-+
- void pci_request_acs(void);
- bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags);
- bool pci_acs_path_enabled(struct pci_dev *start,
-diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
-index d6d071f..3af60ee 100644
---- a/include/uapi/linux/input-event-codes.h
-+++ b/include/uapi/linux/input-event-codes.h
-@@ -640,7 +640,7 @@
-  * Control a data application associated with the currently viewed channel,
-  * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.)
-  */
--#define KEY_DATA			0x275
-+#define KEY_DATA			0x277
- 
- #define BTN_TRIGGER_HAPPY		0x2c0
- #define BTN_TRIGGER_HAPPY1		0x2c0
-diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
-index 0082fce..85c5a88 100644
---- a/kernel/rcu/tree_plugin.h
-+++ b/kernel/rcu/tree_plugin.h
-@@ -2173,6 +2173,7 @@ static int rcu_nocb_kthread(void *arg)
- 				cl++;
- 			c++;
- 			local_bh_enable();
-+			cond_resched_rcu_qs();
- 			list = next;
- 		}
- 		trace_rcu_batch_end(rdp->rsp->name, c, !!list, 0, 0, 1);
-diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
-index e5c2181f..03f4545 100644
---- a/mm/kasan/kasan.h
-+++ b/mm/kasan/kasan.h
-@@ -53,6 +53,9 @@ struct kasan_global {
- #if KASAN_ABI_VERSION >= 4
- 	struct kasan_source_location *location;
- #endif
-+#if KASAN_ABI_VERSION >= 5
-+	char *odr_indicator;
-+#endif
- };
- 
- /**
-diff --git a/mm/khugepaged.c b/mm/khugepaged.c
-index 728d779..87e1a7ca 100644
---- a/mm/khugepaged.c
-+++ b/mm/khugepaged.c
-@@ -103,6 +103,7 @@ static struct khugepaged_scan khugepaged_scan = {
- 	.mm_head = LIST_HEAD_INIT(khugepaged_scan.mm_head),
- };
- 
-+#ifdef CONFIG_SYSFS
- static ssize_t scan_sleep_millisecs_show(struct kobject *kobj,
- 					 struct kobj_attribute *attr,
- 					 char *buf)
-@@ -295,6 +296,7 @@ struct attribute_group khugepaged_attr_group = {
- 	.attrs = khugepaged_attr,
- 	.name = "khugepaged",
- };
-+#endif /* CONFIG_SYSFS */
- 
- #define VM_NO_KHUGEPAGED (VM_SPECIAL | VM_HUGETLB)
- 
-diff --git a/mm/mlock.c b/mm/mlock.c
-index 14645be..9c91acc 100644
---- a/mm/mlock.c
-+++ b/mm/mlock.c
-@@ -190,10 +190,13 @@ unsigned int munlock_vma_page(struct page *page)
- 	 */
- 	spin_lock_irq(zone_lru_lock(zone));
- 
--	nr_pages = hpage_nr_pages(page);
--	if (!TestClearPageMlocked(page))
-+	if (!TestClearPageMlocked(page)) {
-+		/* Potentially, PTE-mapped THP: do not skip the rest PTEs */
-+		nr_pages = 1;
- 		goto unlock_out;
-+	}
- 
-+	nr_pages = hpage_nr_pages(page);
- 	__mod_zone_page_state(zone, NR_MLOCK, -nr_pages);
- 
- 	if (__munlock_isolate_lru_page(page, true)) {
-diff --git a/mm/truncate.c b/mm/truncate.c
-index a01cce4..8d8c62d 100644
---- a/mm/truncate.c
-+++ b/mm/truncate.c
-@@ -283,7 +283,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
- 
- 			if (!trylock_page(page))
- 				continue;
--			WARN_ON(page_to_pgoff(page) != index);
-+			WARN_ON(page_to_index(page) != index);
- 			if (PageWriteback(page)) {
- 				unlock_page(page);
- 				continue;
-@@ -371,7 +371,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
- 			}
- 
- 			lock_page(page);
--			WARN_ON(page_to_pgoff(page) != index);
-+			WARN_ON(page_to_index(page) != index);
- 			wait_on_page_writeback(page);
- 			truncate_inode_page(mapping, page);
- 			unlock_page(page);
-@@ -492,7 +492,7 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
- 			if (!trylock_page(page))
- 				continue;
- 
--			WARN_ON(page_to_pgoff(page) != index);
-+			WARN_ON(page_to_index(page) != index);
- 
- 			/* Middle of THP: skip */
- 			if (PageTransTail(page)) {
-@@ -612,7 +612,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
- 			}
- 
- 			lock_page(page);
--			WARN_ON(page_to_pgoff(page) != index);
-+			WARN_ON(page_to_index(page) != index);
- 			if (page->mapping != mapping) {
- 				unlock_page(page);
- 				continue;
-diff --git a/mm/workingset.c b/mm/workingset.c
-index 617475f..fb1f918 100644
---- a/mm/workingset.c
-+++ b/mm/workingset.c
-@@ -348,7 +348,7 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker,
- 	shadow_nodes = list_lru_shrink_count(&workingset_shadow_nodes, sc);
- 	local_irq_enable();
- 
--	if (memcg_kmem_enabled()) {
-+	if (sc->memcg) {
- 		pages = mem_cgroup_node_nr_lru_pages(sc->memcg, sc->nid,
- 						     LRU_ALL_FILE);
- 	} else {
-diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
-index 2333777..8af1611 100644
---- a/net/batman-adv/tp_meter.c
-+++ b/net/batman-adv/tp_meter.c
-@@ -837,6 +837,7 @@ static int batadv_tp_send(void *arg)
- 	primary_if = batadv_primary_if_get_selected(bat_priv);
- 	if (unlikely(!primary_if)) {
- 		err = BATADV_TP_REASON_DST_UNREACHABLE;
-+		tp_vars->reason = err;
- 		goto out;
- 	}
- 
-diff --git a/virt/kvm/arm/vgic/vgic-v2.c b/virt/kvm/arm/vgic/vgic-v2.c
-index 0bf6709..6fb4314 100644
---- a/virt/kvm/arm/vgic/vgic-v2.c
-+++ b/virt/kvm/arm/vgic/vgic-v2.c
-@@ -50,8 +50,10 @@ void vgic_v2_process_maintenance(struct kvm_vcpu *vcpu)
- 
- 			WARN_ON(cpuif->vgic_lr[lr] & GICH_LR_STATE);
- 
--			kvm_notify_acked_irq(vcpu->kvm, 0,
--					     intid - VGIC_NR_PRIVATE_IRQS);
-+			/* Only SPIs require notification */
-+			if (vgic_valid_spi(vcpu->kvm, intid))
-+				kvm_notify_acked_irq(vcpu->kvm, 0,
-+						     intid - VGIC_NR_PRIVATE_IRQS);
- 		}
- 	}
- 
-diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c
-index 9f0dae3..5c9f974 100644
---- a/virt/kvm/arm/vgic/vgic-v3.c
-+++ b/virt/kvm/arm/vgic/vgic-v3.c
-@@ -41,8 +41,10 @@ void vgic_v3_process_maintenance(struct kvm_vcpu *vcpu)
- 
- 			WARN_ON(cpuif->vgic_lr[lr] & ICH_LR_STATE);
- 
--			kvm_notify_acked_irq(vcpu->kvm, 0,
--					     intid - VGIC_NR_PRIVATE_IRQS);
-+			/* Only SPIs require notification */
-+			if (vgic_valid_spi(vcpu->kvm, intid))
-+				kvm_notify_acked_irq(vcpu->kvm, 0,
-+						     intid - VGIC_NR_PRIVATE_IRQS);
- 		}
- 
- 		/*
-diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
-index 1950782..690d15e 100644
---- a/virt/kvm/kvm_main.c
-+++ b/virt/kvm/kvm_main.c
-@@ -2852,10 +2852,10 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
- 
- 	ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC);
- 	if (ret < 0) {
--		ops->destroy(dev);
- 		mutex_lock(&kvm->lock);
- 		list_del(&dev->vm_node);
- 		mutex_unlock(&kvm->lock);
-+		ops->destroy(dev);
- 		return ret;
- 	}
- 

diff --git a/4.8.15/1013_linux-4.8.14.patch b/4.8.15/1013_linux-4.8.14.patch
deleted file mode 100644
index 63d837b..0000000
--- a/4.8.15/1013_linux-4.8.14.patch
+++ /dev/null
@@ -1,1725 +0,0 @@
-diff --git a/Makefile b/Makefile
-index b38abe9..6a74924 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 8
--SUBLEVEL = 13
-+SUBLEVEL = 14
- EXTRAVERSION =
- NAME = Psychotic Stoned Sheep
- 
-diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c
-index c3c12ef..9c0c8fd 100644
---- a/arch/sparc/kernel/signal_32.c
-+++ b/arch/sparc/kernel/signal_32.c
-@@ -89,7 +89,7 @@ asmlinkage void do_sigreturn(struct pt_regs *regs)
- 	sf = (struct signal_frame __user *) regs->u_regs[UREG_FP];
- 
- 	/* 1. Make sure we are not getting garbage from the user */
--	if (!invalid_frame_pointer(sf, sizeof(*sf)))
-+	if (invalid_frame_pointer(sf, sizeof(*sf)))
- 		goto segv_and_exit;
- 
- 	if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP]))
-@@ -150,7 +150,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
- 
- 	synchronize_user_stack();
- 	sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
--	if (!invalid_frame_pointer(sf, sizeof(*sf)))
-+	if (invalid_frame_pointer(sf, sizeof(*sf)))
- 		goto segv;
- 
- 	if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
-diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
-index 7ac6b62..05c7708 100644
---- a/arch/sparc/mm/init_64.c
-+++ b/arch/sparc/mm/init_64.c
-@@ -802,8 +802,10 @@ struct mdesc_mblock {
- };
- static struct mdesc_mblock *mblocks;
- static int num_mblocks;
-+static int find_numa_node_for_addr(unsigned long pa,
-+				   struct node_mem_mask *pnode_mask);
- 
--static unsigned long ra_to_pa(unsigned long addr)
-+static unsigned long __init ra_to_pa(unsigned long addr)
- {
- 	int i;
- 
-@@ -819,8 +821,11 @@ static unsigned long ra_to_pa(unsigned long addr)
- 	return addr;
- }
- 
--static int find_node(unsigned long addr)
-+static int __init find_node(unsigned long addr)
- {
-+	static bool search_mdesc = true;
-+	static struct node_mem_mask last_mem_mask = { ~0UL, ~0UL };
-+	static int last_index;
- 	int i;
- 
- 	addr = ra_to_pa(addr);
-@@ -830,13 +835,30 @@ static int find_node(unsigned long addr)
- 		if ((addr & p->mask) == p->val)
- 			return i;
- 	}
--	/* The following condition has been observed on LDOM guests.*/
--	WARN_ONCE(1, "find_node: A physical address doesn't match a NUMA node"
--		" rule. Some physical memory will be owned by node 0.");
--	return 0;
-+	/* The following condition has been observed on LDOM guests because
-+	 * node_masks only contains the best latency mask and value.
-+	 * LDOM guest's mdesc can contain a single latency group to
-+	 * cover multiple address range. Print warning message only if the
-+	 * address cannot be found in node_masks nor mdesc.
-+	 */
-+	if ((search_mdesc) &&
-+	    ((addr & last_mem_mask.mask) != last_mem_mask.val)) {
-+		/* find the available node in the mdesc */
-+		last_index = find_numa_node_for_addr(addr, &last_mem_mask);
-+		numadbg("find_node: latency group for address 0x%lx is %d\n",
-+			addr, last_index);
-+		if ((last_index < 0) || (last_index >= num_node_masks)) {
-+			/* WARN_ONCE() and use default group 0 */
-+			WARN_ONCE(1, "find_node: A physical address doesn't match a NUMA node rule. Some physical memory will be owned by node 0.");
-+			search_mdesc = false;
-+			last_index = 0;
-+		}
-+	}
-+
-+	return last_index;
- }
- 
--static u64 memblock_nid_range(u64 start, u64 end, int *nid)
-+static u64 __init memblock_nid_range(u64 start, u64 end, int *nid)
- {
- 	*nid = find_node(start);
- 	start += PAGE_SIZE;
-@@ -1160,6 +1182,41 @@ int __node_distance(int from, int to)
- 	return numa_latency[from][to];
- }
- 
-+static int find_numa_node_for_addr(unsigned long pa,
-+				   struct node_mem_mask *pnode_mask)
-+{
-+	struct mdesc_handle *md = mdesc_grab();
-+	u64 node, arc;
-+	int i = 0;
-+
-+	node = mdesc_node_by_name(md, MDESC_NODE_NULL, "latency-groups");
-+	if (node == MDESC_NODE_NULL)
-+		goto out;
-+
-+	mdesc_for_each_node_by_name(md, node, "group") {
-+		mdesc_for_each_arc(arc, md, node, MDESC_ARC_TYPE_FWD) {
-+			u64 target = mdesc_arc_target(md, arc);
-+			struct mdesc_mlgroup *m = find_mlgroup(target);
-+
-+			if (!m)
-+				continue;
-+			if ((pa & m->mask) == m->match) {
-+				if (pnode_mask) {
-+					pnode_mask->mask = m->mask;
-+					pnode_mask->val = m->match;
-+				}
-+				mdesc_release(md);
-+				return i;
-+			}
-+		}
-+		i++;
-+	}
-+
-+out:
-+	mdesc_release(md);
-+	return -1;
-+}
-+
- static int __init find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp)
- {
- 	int i;
-diff --git a/block/blk-map.c b/block/blk-map.c
-index b8657fa..27fd8d92 100644
---- a/block/blk-map.c
-+++ b/block/blk-map.c
-@@ -118,6 +118,9 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
- 	struct iov_iter i;
- 	int ret;
- 
-+	if (!iter_is_iovec(iter))
-+		goto fail;
-+
- 	if (map_data)
- 		copy = true;
- 	else if (iov_iter_alignment(iter) & align)
-@@ -140,6 +143,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
- 
- unmap_rq:
- 	__blk_rq_unmap_user(bio);
-+fail:
- 	rq->bio = NULL;
- 	return -EINVAL;
- }
-diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
-index bda37d3..b081929 100644
---- a/drivers/net/dsa/b53/b53_common.c
-+++ b/drivers/net/dsa/b53/b53_common.c
-@@ -904,9 +904,10 @@ static void b53_vlan_add(struct dsa_switch *ds, int port,
- 
- 		vl->members |= BIT(port) | BIT(cpu_port);
- 		if (untagged)
--			vl->untag |= BIT(port) | BIT(cpu_port);
-+			vl->untag |= BIT(port);
- 		else
--			vl->untag &= ~(BIT(port) | BIT(cpu_port));
-+			vl->untag &= ~BIT(port);
-+		vl->untag &= ~BIT(cpu_port);
- 
- 		b53_set_vlan_entry(dev, vid, vl);
- 		b53_fast_age_vlan(dev, vid);
-@@ -915,8 +916,6 @@ static void b53_vlan_add(struct dsa_switch *ds, int port,
- 	if (pvid) {
- 		b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port),
- 			    vlan->vid_end);
--		b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(cpu_port),
--			    vlan->vid_end);
- 		b53_fast_age_vlan(dev, vid);
- 	}
- }
-@@ -926,7 +925,6 @@ static int b53_vlan_del(struct dsa_switch *ds, int port,
- {
- 	struct b53_device *dev = ds_to_priv(ds);
- 	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
--	unsigned int cpu_port = dev->cpu_port;
- 	struct b53_vlan *vl;
- 	u16 vid;
- 	u16 pvid;
-@@ -939,8 +937,6 @@ static int b53_vlan_del(struct dsa_switch *ds, int port,
- 		b53_get_vlan_entry(dev, vid, vl);
- 
- 		vl->members &= ~BIT(port);
--		if ((vl->members & BIT(cpu_port)) == BIT(cpu_port))
--			vl->members = 0;
- 
- 		if (pvid == vid) {
- 			if (is5325(dev) || is5365(dev))
-@@ -949,18 +945,14 @@ static int b53_vlan_del(struct dsa_switch *ds, int port,
- 				pvid = 0;
- 		}
- 
--		if (untagged) {
-+		if (untagged)
- 			vl->untag &= ~(BIT(port));
--			if ((vl->untag & BIT(cpu_port)) == BIT(cpu_port))
--				vl->untag = 0;
--		}
- 
- 		b53_set_vlan_entry(dev, vid, vl);
- 		b53_fast_age_vlan(dev, vid);
- 	}
- 
- 	b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), pvid);
--	b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(cpu_port), pvid);
- 	b53_fast_age_vlan(dev, pvid);
- 
- 	return 0;
-diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
-index b2b8387..4036865 100644
---- a/drivers/net/dsa/bcm_sf2.c
-+++ b/drivers/net/dsa/bcm_sf2.c
-@@ -1167,6 +1167,7 @@ static void bcm_sf2_sw_adjust_link(struct dsa_switch *ds, int port,
- 				   struct phy_device *phydev)
- {
- 	struct bcm_sf2_priv *priv = ds_to_priv(ds);
-+	struct ethtool_eee *p = &priv->port_sts[port].eee;
- 	u32 id_mode_dis = 0, port_mode;
- 	const char *str = NULL;
- 	u32 reg;
-@@ -1241,6 +1242,9 @@ static void bcm_sf2_sw_adjust_link(struct dsa_switch *ds, int port,
- 		reg |= DUPLX_MODE;
- 
- 	core_writel(priv, reg, CORE_STS_OVERRIDE_GMIIP_PORT(port));
-+
-+	if (!phydev->is_pseudo_fixed_link)
-+		p->eee_enabled = bcm_sf2_eee_init(ds, port, phydev);
- }
- 
- static void bcm_sf2_sw_fixed_link_update(struct dsa_switch *ds, int port,
-diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-index 5414563..842d8b9 100644
---- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-@@ -1172,6 +1172,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
- 					  struct bcmgenet_tx_ring *ring)
- {
- 	struct bcmgenet_priv *priv = netdev_priv(dev);
-+	struct device *kdev = &priv->pdev->dev;
- 	struct enet_cb *tx_cb_ptr;
- 	struct netdev_queue *txq;
- 	unsigned int pkts_compl = 0;
-@@ -1199,13 +1200,13 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
- 		if (tx_cb_ptr->skb) {
- 			pkts_compl++;
- 			bytes_compl += GENET_CB(tx_cb_ptr->skb)->bytes_sent;
--			dma_unmap_single(&dev->dev,
-+			dma_unmap_single(kdev,
- 					 dma_unmap_addr(tx_cb_ptr, dma_addr),
- 					 dma_unmap_len(tx_cb_ptr, dma_len),
- 					 DMA_TO_DEVICE);
- 			bcmgenet_free_cb(tx_cb_ptr);
- 		} else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
--			dma_unmap_page(&dev->dev,
-+			dma_unmap_page(kdev,
- 				       dma_unmap_addr(tx_cb_ptr, dma_addr),
- 				       dma_unmap_len(tx_cb_ptr, dma_len),
- 				       DMA_TO_DEVICE);
-@@ -1775,6 +1776,7 @@ static int bcmgenet_alloc_rx_buffers(struct bcmgenet_priv *priv,
- 
- static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
- {
-+	struct device *kdev = &priv->pdev->dev;
- 	struct enet_cb *cb;
- 	int i;
- 
-@@ -1782,7 +1784,7 @@ static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
- 		cb = &priv->rx_cbs[i];
- 
- 		if (dma_unmap_addr(cb, dma_addr)) {
--			dma_unmap_single(&priv->dev->dev,
-+			dma_unmap_single(kdev,
- 					 dma_unmap_addr(cb, dma_addr),
- 					 priv->rx_buf_len, DMA_FROM_DEVICE);
- 			dma_unmap_addr_set(cb, dma_addr, 0);
-diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
-index d954a97..ef0dbcf 100644
---- a/drivers/net/ethernet/cadence/macb.c
-+++ b/drivers/net/ethernet/cadence/macb.c
-@@ -959,6 +959,7 @@ static inline void macb_init_rx_ring(struct macb *bp)
- 		addr += bp->rx_buffer_size;
- 	}
- 	bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP);
-+	bp->rx_tail = 0;
- }
- 
- static int macb_rx(struct macb *bp, int budget)
-@@ -1597,8 +1598,6 @@ static void macb_init_rings(struct macb *bp)
- 	bp->queues[0].tx_head = 0;
- 	bp->queues[0].tx_tail = 0;
- 	bp->queues[0].tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
--
--	bp->rx_tail = 0;
- }
- 
- static void macb_reset_hw(struct macb *bp)
-diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
-index 467138b..d747e17 100644
---- a/drivers/net/ethernet/marvell/sky2.c
-+++ b/drivers/net/ethernet/marvell/sky2.c
-@@ -5220,6 +5220,19 @@ static SIMPLE_DEV_PM_OPS(sky2_pm_ops, sky2_suspend, sky2_resume);
- 
- static void sky2_shutdown(struct pci_dev *pdev)
- {
-+	struct sky2_hw *hw = pci_get_drvdata(pdev);
-+	int port;
-+
-+	for (port = 0; port < hw->ports; port++) {
-+		struct net_device *ndev = hw->dev[port];
-+
-+		rtnl_lock();
-+		if (netif_running(ndev)) {
-+			dev_close(ndev);
-+			netif_device_detach(ndev);
-+		}
-+		rtnl_unlock();
-+	}
- 	sky2_suspend(&pdev->dev);
- 	pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev));
- 	pci_set_power_state(pdev, PCI_D3hot);
-diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
-index 054e795..92c9a95 100644
---- a/drivers/net/ethernet/renesas/sh_eth.c
-+++ b/drivers/net/ethernet/renesas/sh_eth.c
-@@ -518,7 +518,7 @@ static struct sh_eth_cpu_data r7s72100_data = {
- 
- 	.ecsr_value	= ECSR_ICD,
- 	.ecsipr_value	= ECSIPR_ICDIP,
--	.eesipr_value	= 0xff7f009f,
-+	.eesipr_value	= 0xe77f009f,
- 
- 	.tx_check	= EESR_TC1 | EESR_FTC,
- 	.eesr_err_check	= EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT |
-diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
-index 16af1ce..5ad706b 100644
---- a/drivers/net/geneve.c
-+++ b/drivers/net/geneve.c
-@@ -844,7 +844,6 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 	struct geneve_dev *geneve = netdev_priv(dev);
- 	struct geneve_sock *gs4 = geneve->sock4;
- 	struct rtable *rt = NULL;
--	const struct iphdr *iip; /* interior IP header */
- 	int err = -EINVAL;
- 	struct flowi4 fl4;
- 	__u8 tos, ttl;
-@@ -871,8 +870,6 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 	sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
- 	skb_reset_mac_header(skb);
- 
--	iip = ip_hdr(skb);
--
- 	if (info) {
- 		const struct ip_tunnel_key *key = &info->key;
- 		u8 *opts = NULL;
-@@ -892,7 +889,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 		if (unlikely(err))
- 			goto tx_error;
- 
--		tos = ip_tunnel_ecn_encap(key->tos, iip, skb);
-+		tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
- 		ttl = key->ttl;
- 		df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
- 	} else {
-@@ -901,7 +898,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 		if (unlikely(err))
- 			goto tx_error;
- 
--		tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb);
-+		tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, ip_hdr(skb), skb);
- 		ttl = geneve->ttl;
- 		if (!ttl && IN_MULTICAST(ntohl(fl4.daddr)))
- 			ttl = 1;
-@@ -934,7 +931,6 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 	struct geneve_dev *geneve = netdev_priv(dev);
- 	struct geneve_sock *gs6 = geneve->sock6;
- 	struct dst_entry *dst = NULL;
--	const struct iphdr *iip; /* interior IP header */
- 	int err = -EINVAL;
- 	struct flowi6 fl6;
- 	__u8 prio, ttl;
-@@ -959,8 +955,6 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 	sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
- 	skb_reset_mac_header(skb);
- 
--	iip = ip_hdr(skb);
--
- 	if (info) {
- 		const struct ip_tunnel_key *key = &info->key;
- 		u8 *opts = NULL;
-@@ -981,7 +975,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 		if (unlikely(err))
- 			goto tx_error;
- 
--		prio = ip_tunnel_ecn_encap(key->tos, iip, skb);
-+		prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
- 		ttl = key->ttl;
- 		label = info->key.label;
- 	} else {
-@@ -991,7 +985,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
- 			goto tx_error;
- 
- 		prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel),
--					   iip, skb);
-+					   ip_hdr(skb), skb);
- 		ttl = geneve->ttl;
- 		if (!ttl && ipv6_addr_is_multicast(&fl6.daddr))
- 			ttl = 1;
-diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
-index c47ec0a..dd623f6 100644
---- a/drivers/net/usb/cdc_ether.c
-+++ b/drivers/net/usb/cdc_ether.c
-@@ -388,12 +388,6 @@ void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
- 	case USB_CDC_NOTIFY_NETWORK_CONNECTION:
- 		netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
- 			  event->wValue ? "on" : "off");
--
--		/* Work-around for devices with broken off-notifications */
--		if (event->wValue &&
--		    !test_bit(__LINK_STATE_NOCARRIER, &dev->net->state))
--			usbnet_link_change(dev, 0, 0);
--
- 		usbnet_link_change(dev, !!event->wValue, 0);
- 		break;
- 	case USB_CDC_NOTIFY_SPEED_CHANGE:	/* tx/rx rates */
-@@ -466,6 +460,36 @@ static int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
- 	return 1;
- }
- 
-+/* Ensure correct link state
-+ *
-+ * Some devices (ZTE MF823/831/910) export two carrier on notifications when
-+ * connected. This causes the link state to be incorrect. Work around this by
-+ * always setting the state to off, then on.
-+ */
-+void usbnet_cdc_zte_status(struct usbnet *dev, struct urb *urb)
-+{
-+	struct usb_cdc_notification *event;
-+
-+	if (urb->actual_length < sizeof(*event))
-+		return;
-+
-+	event = urb->transfer_buffer;
-+
-+	if (event->bNotificationType != USB_CDC_NOTIFY_NETWORK_CONNECTION) {
-+		usbnet_cdc_status(dev, urb);
-+		return;
-+	}
-+
-+	netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
-+		  event->wValue ? "on" : "off");
-+
-+	if (event->wValue &&
-+	    netif_carrier_ok(dev->net))
-+		netif_carrier_off(dev->net);
-+
-+	usbnet_link_change(dev, !!event->wValue, 0);
-+}
-+
- static const struct driver_info	cdc_info = {
- 	.description =	"CDC Ethernet Device",
- 	.flags =	FLAG_ETHER | FLAG_POINTTOPOINT,
-@@ -481,7 +505,7 @@ static const struct driver_info	zte_cdc_info = {
- 	.flags =	FLAG_ETHER | FLAG_POINTTOPOINT,
- 	.bind =		usbnet_cdc_zte_bind,
- 	.unbind =	usbnet_cdc_unbind,
--	.status =	usbnet_cdc_status,
-+	.status =	usbnet_cdc_zte_status,
- 	.set_rx_mode =	usbnet_cdc_update_filter,
- 	.manage_power =	usbnet_manage_power,
- 	.rx_fixup = usbnet_cdc_zte_rx_fixup,
-diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
-index bf3fd34..d807209 100644
---- a/drivers/net/virtio_net.c
-+++ b/drivers/net/virtio_net.c
-@@ -1468,6 +1468,11 @@ static void virtnet_free_queues(struct virtnet_info *vi)
- 		netif_napi_del(&vi->rq[i].napi);
- 	}
- 
-+	/* We called napi_hash_del() before netif_napi_del(),
-+	 * we need to respect an RCU grace period before freeing vi->rq
-+	 */
-+	synchronize_net();
-+
- 	kfree(vi->rq);
- 	kfree(vi->sq);
- }
-diff --git a/include/linux/uio.h b/include/linux/uio.h
-index 75b4aaf..944e7ba 100644
---- a/include/linux/uio.h
-+++ b/include/linux/uio.h
-@@ -102,12 +102,12 @@ int iov_iter_npages(const struct iov_iter *i, int maxpages);
- 
- const void *dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags);
- 
--static inline size_t iov_iter_count(struct iov_iter *i)
-+static inline size_t iov_iter_count(const struct iov_iter *i)
- {
- 	return i->count;
- }
- 
--static inline bool iter_is_iovec(struct iov_iter *i)
-+static inline bool iter_is_iovec(const struct iov_iter *i)
- {
- 	return !(i->type & (ITER_BVEC | ITER_KVEC));
- }
-diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h
-index d15214d..2a1abbf 100644
---- a/include/net/gro_cells.h
-+++ b/include/net/gro_cells.h
-@@ -68,6 +68,9 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de
- 		struct gro_cell *cell = per_cpu_ptr(gcells->cells, i);
- 
- 		__skb_queue_head_init(&cell->napi_skbs);
-+
-+		set_bit(NAPI_STATE_NO_BUSY_POLL, &cell->napi.state);
-+
- 		netif_napi_add(dev, &cell->napi, gro_cell_poll, 64);
- 		napi_enable(&cell->napi);
- 	}
-diff --git a/net/core/flow.c b/net/core/flow.c
-index 3937b1b..18e8893 100644
---- a/net/core/flow.c
-+++ b/net/core/flow.c
-@@ -95,7 +95,6 @@ static void flow_cache_gc_task(struct work_struct *work)
- 	list_for_each_entry_safe(fce, n, &gc_list, u.gc_list) {
- 		flow_entry_kill(fce, xfrm);
- 		atomic_dec(&xfrm->flow_cache_gc_count);
--		WARN_ON(atomic_read(&xfrm->flow_cache_gc_count) < 0);
- 	}
- }
- 
-@@ -236,9 +235,8 @@ flow_cache_lookup(struct net *net, const struct flowi *key, u16 family, u8 dir,
- 		if (fcp->hash_count > fc->high_watermark)
- 			flow_cache_shrink(fc, fcp);
- 
--		if (fcp->hash_count > 2 * fc->high_watermark ||
--		    atomic_read(&net->xfrm.flow_cache_gc_count) > fc->high_watermark) {
--			atomic_inc(&net->xfrm.flow_cache_genid);
-+		if (atomic_read(&net->xfrm.flow_cache_gc_count) >
-+		    2 * num_online_cpus() * fc->high_watermark) {
- 			flo = ERR_PTR(-ENOBUFS);
- 			goto ret_object;
- 		}
-diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
-index 2c2eb1b..2e9a1c2 100644
---- a/net/core/net_namespace.c
-+++ b/net/core/net_namespace.c
-@@ -217,6 +217,8 @@ int peernet2id_alloc(struct net *net, struct net *peer)
- 	bool alloc;
- 	int id;
- 
-+	if (atomic_read(&net->count) == 0)
-+		return NETNSA_NSID_NOT_ASSIGNED;
- 	spin_lock_irqsave(&net->nsid_lock, flags);
- 	alloc = atomic_read(&peer->count) == 0 ? false : true;
- 	id = __peernet2id_alloc(net, peer, &alloc);
-diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
-index 189cc78..08c3702 100644
---- a/net/core/rtnetlink.c
-+++ b/net/core/rtnetlink.c
-@@ -1578,7 +1578,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
- 		head = &net->dev_index_head[h];
- 		hlist_for_each_entry(dev, head, index_hlist) {
- 			if (link_dump_filtered(dev, master_idx, kind_ops))
--				continue;
-+				goto cont;
- 			if (idx < s_idx)
- 				goto cont;
- 			err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
-@@ -2791,7 +2791,10 @@ static int nlmsg_populate_fdb_fill(struct sk_buff *skb,
- 
- static inline size_t rtnl_fdb_nlmsg_size(void)
- {
--	return NLMSG_ALIGN(sizeof(struct ndmsg)) + nla_total_size(ETH_ALEN);
-+	return NLMSG_ALIGN(sizeof(struct ndmsg)) +
-+	       nla_total_size(ETH_ALEN) +	/* NDA_LLADDR */
-+	       nla_total_size(sizeof(u16)) +	/* NDA_VLAN */
-+	       0;
- }
- 
- static void rtnl_fdb_notify(struct net_device *dev, u8 *addr, u16 vid, int type,
-diff --git a/net/core/sock.c b/net/core/sock.c
-index 10acacc..ba27920 100644
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -715,7 +715,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
- 		val = min_t(u32, val, sysctl_wmem_max);
- set_sndbuf:
- 		sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
--		sk->sk_sndbuf = max_t(u32, val * 2, SOCK_MIN_SNDBUF);
-+		sk->sk_sndbuf = max_t(int, val * 2, SOCK_MIN_SNDBUF);
- 		/* Wake up sending tasks if we upped the value. */
- 		sk->sk_write_space(sk);
- 		break;
-@@ -751,7 +751,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
- 		 * returning the value we actually used in getsockopt
- 		 * is the most desirable behavior.
- 		 */
--		sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF);
-+		sk->sk_rcvbuf = max_t(int, val * 2, SOCK_MIN_RCVBUF);
- 		break;
- 
- 	case SO_RCVBUFFORCE:
-diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
-index b567c87..edbe59d 100644
---- a/net/dccp/ipv4.c
-+++ b/net/dccp/ipv4.c
-@@ -700,6 +700,7 @@ int dccp_invalid_packet(struct sk_buff *skb)
- {
- 	const struct dccp_hdr *dh;
- 	unsigned int cscov;
-+	u8 dccph_doff;
- 
- 	if (skb->pkt_type != PACKET_HOST)
- 		return 1;
-@@ -721,18 +722,19 @@ int dccp_invalid_packet(struct sk_buff *skb)
- 	/*
- 	 * If P.Data Offset is too small for packet type, drop packet and return
- 	 */
--	if (dh->dccph_doff < dccp_hdr_len(skb) / sizeof(u32)) {
--		DCCP_WARN("P.Data Offset(%u) too small\n", dh->dccph_doff);
-+	dccph_doff = dh->dccph_doff;
-+	if (dccph_doff < dccp_hdr_len(skb) / sizeof(u32)) {
-+		DCCP_WARN("P.Data Offset(%u) too small\n", dccph_doff);
- 		return 1;
- 	}
- 	/*
- 	 * If P.Data Offset is too too large for packet, drop packet and return
- 	 */
--	if (!pskb_may_pull(skb, dh->dccph_doff * sizeof(u32))) {
--		DCCP_WARN("P.Data Offset(%u) too large\n", dh->dccph_doff);
-+	if (!pskb_may_pull(skb, dccph_doff * sizeof(u32))) {
-+		DCCP_WARN("P.Data Offset(%u) too large\n", dccph_doff);
- 		return 1;
- 	}
--
-+	dh = dccp_hdr(skb);
- 	/*
- 	 * If P.type is not Data, Ack, or DataAck and P.X == 0 (the packet
- 	 * has short sequence numbers), drop packet and return
-diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
-index f30bad9..3bdecd2 100644
---- a/net/dsa/dsa2.c
-+++ b/net/dsa/dsa2.c
-@@ -28,8 +28,10 @@ static struct dsa_switch_tree *dsa_get_dst(u32 tree)
- 	struct dsa_switch_tree *dst;
- 
- 	list_for_each_entry(dst, &dsa_switch_trees, list)
--		if (dst->tree == tree)
-+		if (dst->tree == tree) {
-+			kref_get(&dst->refcount);
- 			return dst;
-+		}
- 	return NULL;
- }
- 
-diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
-index eebbc0f..ed22af6 100644
---- a/net/ipv4/af_inet.c
-+++ b/net/ipv4/af_inet.c
-@@ -1237,7 +1237,7 @@ struct sk_buff *inet_gso_segment(struct sk_buff *skb,
- 		fixedid = !!(skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID);
- 
- 		/* fixed ID is invalid if DF bit is not set */
--		if (fixedid && !(iph->frag_off & htons(IP_DF)))
-+		if (fixedid && !(ip_hdr(skb)->frag_off & htons(IP_DF)))
- 			goto out;
- 	}
- 
-diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
-index d95631d..20fb25e 100644
---- a/net/ipv4/esp4.c
-+++ b/net/ipv4/esp4.c
-@@ -476,7 +476,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
- 		esph = (void *)skb_push(skb, 4);
- 		*seqhi = esph->spi;
- 		esph->spi = esph->seq_no;
--		esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.input.hi);
-+		esph->seq_no = XFRM_SKB_CB(skb)->seq.input.hi;
- 		aead_request_set_callback(req, 0, esp_input_done_esn, skb);
- 	}
- 
-diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
-index 1b25daf..9301308 100644
---- a/net/ipv4/fib_frontend.c
-+++ b/net/ipv4/fib_frontend.c
-@@ -157,7 +157,7 @@ static void fib_replace_table(struct net *net, struct fib_table *old,
- 
- int fib_unmerge(struct net *net)
- {
--	struct fib_table *old, *new;
-+	struct fib_table *old, *new, *main_table;
- 
- 	/* attempt to fetch local table if it has been allocated */
- 	old = fib_get_table(net, RT_TABLE_LOCAL);
-@@ -168,11 +168,21 @@ int fib_unmerge(struct net *net)
- 	if (!new)
- 		return -ENOMEM;
- 
-+	/* table is already unmerged */
-+	if (new == old)
-+		return 0;
-+
- 	/* replace merged table with clean table */
--	if (new != old) {
--		fib_replace_table(net, old, new);
--		fib_free_table(old);
--	}
-+	fib_replace_table(net, old, new);
-+	fib_free_table(old);
-+
-+	/* attempt to fetch main table if it has been allocated */
-+	main_table = fib_get_table(net, RT_TABLE_MAIN);
-+	if (!main_table)
-+		return 0;
-+
-+	/* flush local entries from main table */
-+	fib_table_flush_external(main_table);
- 
- 	return 0;
- }
-diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
-index 7ef7031..84fd7272 100644
---- a/net/ipv4/fib_trie.c
-+++ b/net/ipv4/fib_trie.c
-@@ -681,6 +681,13 @@ static unsigned char update_suffix(struct key_vector *tn)
- {
- 	unsigned char slen = tn->pos;
- 	unsigned long stride, i;
-+	unsigned char slen_max;
-+
-+	/* only vector 0 can have a suffix length greater than or equal to
-+	 * tn->pos + tn->bits, the second highest node will have a suffix
-+	 * length at most of tn->pos + tn->bits - 1
-+	 */
-+	slen_max = min_t(unsigned char, tn->pos + tn->bits - 1, tn->slen);
- 
- 	/* search though the list of children looking for nodes that might
- 	 * have a suffix greater than the one we currently have.  This is
-@@ -698,12 +705,8 @@ static unsigned char update_suffix(struct key_vector *tn)
- 		slen = n->slen;
- 		i &= ~(stride - 1);
- 
--		/* if slen covers all but the last bit we can stop here
--		 * there will be nothing longer than that since only node
--		 * 0 and 1 << (bits - 1) could have that as their suffix
--		 * length.
--		 */
--		if ((slen + 1) >= (tn->pos + tn->bits))
-+		/* stop searching if we have hit the maximum possible value */
-+		if (slen >= slen_max)
- 			break;
- 	}
- 
-@@ -875,39 +878,27 @@ static struct key_vector *resize(struct trie *t, struct key_vector *tn)
- 		return collapse(t, tn);
- 
- 	/* update parent in case halve failed */
--	tp = node_parent(tn);
--
--	/* Return if at least one deflate was run */
--	if (max_work != MAX_WORK)
--		return tp;
--
--	/* push the suffix length to the parent node */
--	if (tn->slen > tn->pos) {
--		unsigned char slen = update_suffix(tn);
--
--		if (slen > tp->slen)
--			tp->slen = slen;
--	}
--
--	return tp;
-+	return node_parent(tn);
- }
- 
--static void leaf_pull_suffix(struct key_vector *tp, struct key_vector *l)
-+static void node_pull_suffix(struct key_vector *tn, unsigned char slen)
- {
--	while ((tp->slen > tp->pos) && (tp->slen > l->slen)) {
--		if (update_suffix(tp) > l->slen)
-+	unsigned char node_slen = tn->slen;
-+
-+	while ((node_slen > tn->pos) && (node_slen > slen)) {
-+		slen = update_suffix(tn);
-+		if (node_slen == slen)
- 			break;
--		tp = node_parent(tp);
-+
-+		tn = node_parent(tn);
-+		node_slen = tn->slen;
- 	}
- }
- 
--static void leaf_push_suffix(struct key_vector *tn, struct key_vector *l)
-+static void node_push_suffix(struct key_vector *tn, unsigned char slen)
- {
--	/* if this is a new leaf then tn will be NULL and we can sort
--	 * out parent suffix lengths as a part of trie_rebalance
--	 */
--	while (tn->slen < l->slen) {
--		tn->slen = l->slen;
-+	while (tn->slen < slen) {
-+		tn->slen = slen;
- 		tn = node_parent(tn);
- 	}
- }
-@@ -1028,6 +1019,7 @@ static int fib_insert_node(struct trie *t, struct key_vector *tp,
- 	}
- 
- 	/* Case 3: n is NULL, and will just insert a new leaf */
-+	node_push_suffix(tp, new->fa_slen);
- 	NODE_INIT_PARENT(l, tp);
- 	put_child_root(tp, key, l);
- 	trie_rebalance(t, tp);
-@@ -1069,7 +1061,7 @@ static int fib_insert_alias(struct trie *t, struct key_vector *tp,
- 	/* if we added to the tail node then we need to update slen */
- 	if (l->slen < new->fa_slen) {
- 		l->slen = new->fa_slen;
--		leaf_push_suffix(tp, l);
-+		node_push_suffix(tp, new->fa_slen);
- 	}
- 
- 	return 0;
-@@ -1470,6 +1462,8 @@ static void fib_remove_alias(struct trie *t, struct key_vector *tp,
- 	 * out parent suffix lengths as a part of trie_rebalance
- 	 */
- 	if (hlist_empty(&l->leaf)) {
-+		if (tp->slen == l->slen)
-+			node_pull_suffix(tp, tp->pos);
- 		put_child_root(tp, l->key, NULL);
- 		node_free(l);
- 		trie_rebalance(t, tp);
-@@ -1482,7 +1476,7 @@ static void fib_remove_alias(struct trie *t, struct key_vector *tp,
- 
- 	/* update the trie with the latest suffix length */
- 	l->slen = fa->fa_slen;
--	leaf_pull_suffix(tp, l);
-+	node_pull_suffix(tp, fa->fa_slen);
- }
- 
- /* Caller must hold RTNL. */
-@@ -1713,8 +1707,10 @@ struct fib_table *fib_trie_unmerge(struct fib_table *oldtb)
- 				local_l = fib_find_node(lt, &local_tp, l->key);
- 
- 			if (fib_insert_alias(lt, local_tp, local_l, new_fa,
--					     NULL, l->key))
-+					     NULL, l->key)) {
-+				kmem_cache_free(fn_alias_kmem, new_fa);
- 				goto out;
-+			}
- 		}
- 
- 		/* stop loop if key wrapped back to 0 */
-@@ -1751,6 +1747,10 @@ void fib_table_flush_external(struct fib_table *tb)
- 			if (IS_TRIE(pn))
- 				break;
- 
-+			/* update the suffix to address pulled leaves */
-+			if (pn->slen > pn->pos)
-+				update_suffix(pn);
-+
- 			/* resize completed node */
- 			pn = resize(t, pn);
- 			cindex = get_index(pkey, pn);
-@@ -1826,6 +1826,10 @@ int fib_table_flush(struct fib_table *tb)
- 			if (IS_TRIE(pn))
- 				break;
- 
-+			/* update the suffix to address pulled leaves */
-+			if (pn->slen > pn->pos)
-+				update_suffix(pn);
-+
- 			/* resize completed node */
- 			pn = resize(t, pn);
- 			cindex = get_index(pkey, pn);
-diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
-index 307daed..f4790c3 100644
---- a/net/ipv4/ip_output.c
-+++ b/net/ipv4/ip_output.c
-@@ -98,6 +98,9 @@ int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
- 
- 	iph->tot_len = htons(skb->len);
- 	ip_send_check(iph);
-+
-+	skb->protocol = htons(ETH_P_IP);
-+
- 	return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT,
- 		       net, sk, skb, NULL, skb_dst(skb)->dev,
- 		       dst_output);
-diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
-index 66ddcb6..dcdd5ae 100644
---- a/net/ipv4/ping.c
-+++ b/net/ipv4/ping.c
-@@ -662,6 +662,10 @@ int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
- 	if (len > 0xFFFF)
- 		return -EMSGSIZE;
- 
-+	/* Must have at least a full ICMP header. */
-+	if (len < icmph_len)
-+		return -EINVAL;
-+
- 	/*
- 	 *	Check the flags.
- 	 */
-diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
-index c0d71e7..a2d54f5 100644
---- a/net/ipv4/udp.c
-+++ b/net/ipv4/udp.c
-@@ -1451,7 +1451,7 @@ static void udp_v4_rehash(struct sock *sk)
- 	udp_lib_rehash(sk, new_hash);
- }
- 
--static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
-+int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
- {
- 	int rc;
- 
-diff --git a/net/ipv4/udp_impl.h b/net/ipv4/udp_impl.h
-index 7e0fe4b..feb50a1 100644
---- a/net/ipv4/udp_impl.h
-+++ b/net/ipv4/udp_impl.h
-@@ -25,7 +25,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
- 		int flags, int *addr_len);
- int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
- 		 int flags);
--int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
-+int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
- void udp_destroy_sock(struct sock *sk);
- 
- #ifdef CONFIG_PROC_FS
-diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c
-index 2eea073..705d9fb 100644
---- a/net/ipv4/udplite.c
-+++ b/net/ipv4/udplite.c
-@@ -50,7 +50,7 @@ struct proto 	udplite_prot = {
- 	.sendmsg	   = udp_sendmsg,
- 	.recvmsg	   = udp_recvmsg,
- 	.sendpage	   = udp_sendpage,
--	.backlog_rcv	   = udp_queue_rcv_skb,
-+	.backlog_rcv	   = __udp_queue_rcv_skb,
- 	.hash		   = udp_lib_hash,
- 	.unhash		   = udp_lib_unhash,
- 	.get_port	   = udp_v4_get_port,
-diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index f5432d6..8f2e36f 100644
---- a/net/ipv6/addrconf.c
-+++ b/net/ipv6/addrconf.c
-@@ -163,7 +163,7 @@ static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
- 
- static void addrconf_dad_start(struct inet6_ifaddr *ifp);
- static void addrconf_dad_work(struct work_struct *w);
--static void addrconf_dad_completed(struct inet6_ifaddr *ifp);
-+static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id);
- static void addrconf_dad_run(struct inet6_dev *idev);
- static void addrconf_rs_timer(unsigned long data);
- static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
-@@ -2893,6 +2893,7 @@ static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
- 		spin_lock_bh(&ifp->lock);
- 		ifp->flags &= ~IFA_F_TENTATIVE;
- 		spin_unlock_bh(&ifp->lock);
-+		rt_genid_bump_ipv6(dev_net(idev->dev));
- 		ipv6_ifa_notify(RTM_NEWADDR, ifp);
- 		in6_ifa_put(ifp);
- 	}
-@@ -3736,7 +3737,7 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
- {
- 	struct inet6_dev *idev = ifp->idev;
- 	struct net_device *dev = idev->dev;
--	bool notify = false;
-+	bool bump_id, notify = false;
- 
- 	addrconf_join_solict(dev, &ifp->addr);
- 
-@@ -3751,11 +3752,12 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
- 	    idev->cnf.accept_dad < 1 ||
- 	    !(ifp->flags&IFA_F_TENTATIVE) ||
- 	    ifp->flags & IFA_F_NODAD) {
-+		bump_id = ifp->flags & IFA_F_TENTATIVE;
- 		ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
- 		spin_unlock(&ifp->lock);
- 		read_unlock_bh(&idev->lock);
- 
--		addrconf_dad_completed(ifp);
-+		addrconf_dad_completed(ifp, bump_id);
- 		return;
- 	}
- 
-@@ -3815,8 +3817,8 @@ static void addrconf_dad_work(struct work_struct *w)
- 						struct inet6_ifaddr,
- 						dad_work);
- 	struct inet6_dev *idev = ifp->idev;
-+	bool bump_id, disable_ipv6 = false;
- 	struct in6_addr mcaddr;
--	bool disable_ipv6 = false;
- 
- 	enum {
- 		DAD_PROCESS,
-@@ -3886,11 +3888,12 @@ static void addrconf_dad_work(struct work_struct *w)
- 		 * DAD was successful
- 		 */
- 
-+		bump_id = ifp->flags & IFA_F_TENTATIVE;
- 		ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
- 		spin_unlock(&ifp->lock);
- 		write_unlock_bh(&idev->lock);
- 
--		addrconf_dad_completed(ifp);
-+		addrconf_dad_completed(ifp, bump_id);
- 
- 		goto out;
- 	}
-@@ -3927,7 +3930,7 @@ static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp)
- 	return true;
- }
- 
--static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
-+static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id)
- {
- 	struct net_device *dev = ifp->idev->dev;
- 	struct in6_addr lladdr;
-@@ -3978,6 +3981,9 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
- 		spin_unlock(&ifp->lock);
- 		write_unlock_bh(&ifp->idev->lock);
- 	}
-+
-+	if (bump_id)
-+		rt_genid_bump_ipv6(dev_net(dev));
- }
- 
- static void addrconf_dad_run(struct inet6_dev *idev)
-diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
-index 060a60b..111ba55 100644
---- a/net/ipv6/esp6.c
-+++ b/net/ipv6/esp6.c
-@@ -418,7 +418,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
- 		esph = (void *)skb_push(skb, 4);
- 		*seqhi = esph->spi;
- 		esph->spi = esph->seq_no;
--		esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.input.hi);
-+		esph->seq_no = XFRM_SKB_CB(skb)->seq.input.hi;
- 		aead_request_set_callback(req, 0, esp_input_done_esn, skb);
- 	}
- 
-diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
-index a09418b..93294cf 100644
---- a/net/ipv6/ip6_offload.c
-+++ b/net/ipv6/ip6_offload.c
-@@ -98,7 +98,7 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
- 		segs = ops->callbacks.gso_segment(skb, features);
- 	}
- 
--	if (IS_ERR(segs))
-+	if (IS_ERR_OR_NULL(segs))
- 		goto out;
- 
- 	for (skb = segs; skb; skb = skb->next) {
-diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
-index 41489f3..da4e7b3 100644
---- a/net/ipv6/ip6_tunnel.c
-+++ b/net/ipv6/ip6_tunnel.c
-@@ -1014,6 +1014,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
- 	int mtu;
- 	unsigned int psh_hlen = sizeof(struct ipv6hdr) + t->encap_hlen;
- 	unsigned int max_headroom = psh_hlen;
-+	bool use_cache = false;
- 	int err = -1;
- 
- 	/* NBMA tunnel */
-@@ -1038,7 +1039,15 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
- 
- 		memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr));
- 		neigh_release(neigh);
--	} else if (!fl6->flowi6_mark)
-+	} else if (!(t->parms.flags &
-+		     (IP6_TNL_F_USE_ORIG_TCLASS | IP6_TNL_F_USE_ORIG_FWMARK))) {
-+		/* enable the cache only only if the routing decision does
-+		 * not depend on the current inner header value
-+		 */
-+		use_cache = true;
-+	}
-+
-+	if (use_cache)
- 		dst = dst_cache_get(&t->dst_cache);
- 
- 	if (!ip6_tnl_xmit_ctl(t, &fl6->saddr, &fl6->daddr))
-@@ -1113,7 +1122,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
- 		skb = new_skb;
- 	}
- 
--	if (!fl6->flowi6_mark && ndst)
-+	if (use_cache && ndst)
- 		dst_cache_set_ip6(&t->dst_cache, ndst, &fl6->saddr);
- 	skb_dst_set(skb, dst);
- 
-@@ -1134,7 +1143,6 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
- 	if (err)
- 		return err;
- 
--	skb->protocol = htons(ETH_P_IPV6);
- 	skb_push(skb, sizeof(struct ipv6hdr));
- 	skb_reset_network_header(skb);
- 	ipv6h = ipv6_hdr(skb);
-diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
-index 462f2a76b..1d18432 100644
---- a/net/ipv6/output_core.c
-+++ b/net/ipv6/output_core.c
-@@ -148,6 +148,8 @@ int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
- 	ipv6_hdr(skb)->payload_len = htons(len);
- 	IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
- 
-+	skb->protocol = htons(ETH_P_IPV6);
-+
- 	return nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT,
- 		       net, sk, skb, NULL, skb_dst(skb)->dev,
- 		       dst_output);
-diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
-index c2a8656..fa39ab8 100644
---- a/net/ipv6/udp.c
-+++ b/net/ipv6/udp.c
-@@ -514,7 +514,7 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
- 	return;
- }
- 
--static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
-+int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
- {
- 	int rc;
- 
-diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h
-index 0682c03..3c1dbc9 100644
---- a/net/ipv6/udp_impl.h
-+++ b/net/ipv6/udp_impl.h
-@@ -26,7 +26,7 @@ int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
- int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
- int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
- 		  int flags, int *addr_len);
--int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
-+int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
- void udpv6_destroy_sock(struct sock *sk);
- 
- void udp_v6_clear_sk(struct sock *sk, int size);
-diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c
-index fd6ef41..af2895c 100644
---- a/net/ipv6/udplite.c
-+++ b/net/ipv6/udplite.c
-@@ -45,7 +45,7 @@ struct proto udplitev6_prot = {
- 	.getsockopt	   = udpv6_getsockopt,
- 	.sendmsg	   = udpv6_sendmsg,
- 	.recvmsg	   = udpv6_recvmsg,
--	.backlog_rcv	   = udpv6_queue_rcv_skb,
-+	.backlog_rcv	   = __udpv6_queue_rcv_skb,
- 	.hash		   = udp_lib_hash,
- 	.unhash		   = udp_lib_unhash,
- 	.get_port	   = udp_v6_get_port,
-diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
-index 42de4cc..d0e906d 100644
---- a/net/l2tp/l2tp_ip.c
-+++ b/net/l2tp/l2tp_ip.c
-@@ -251,8 +251,6 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
- 	int ret;
- 	int chk_addr_ret;
- 
--	if (!sock_flag(sk, SOCK_ZAPPED))
--		return -EINVAL;
- 	if (addr_len < sizeof(struct sockaddr_l2tpip))
- 		return -EINVAL;
- 	if (addr->l2tp_family != AF_INET)
-@@ -267,6 +265,9 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
- 	read_unlock_bh(&l2tp_ip_lock);
- 
- 	lock_sock(sk);
-+	if (!sock_flag(sk, SOCK_ZAPPED))
-+		goto out;
-+
- 	if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_l2tpip))
- 		goto out;
- 
-diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c
-index ea2ae66..b9c6a41 100644
---- a/net/l2tp/l2tp_ip6.c
-+++ b/net/l2tp/l2tp_ip6.c
-@@ -269,8 +269,6 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
- 	int addr_type;
- 	int err;
- 
--	if (!sock_flag(sk, SOCK_ZAPPED))
--		return -EINVAL;
- 	if (addr->l2tp_family != AF_INET6)
- 		return -EINVAL;
- 	if (addr_len < sizeof(*addr))
-@@ -296,6 +294,9 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
- 	lock_sock(sk);
- 
- 	err = -EINVAL;
-+	if (!sock_flag(sk, SOCK_ZAPPED))
-+		goto out_unlock;
-+
- 	if (sk->sk_state != TCP_CLOSE)
- 		goto out_unlock;
- 
-diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
-index 62bea45..246f29d 100644
---- a/net/netlink/af_netlink.c
-+++ b/net/netlink/af_netlink.c
-@@ -329,7 +329,6 @@ static void netlink_sock_destruct(struct sock *sk)
- 	if (nlk->cb_running) {
- 		if (nlk->cb.done)
- 			nlk->cb.done(&nlk->cb);
--
- 		module_put(nlk->cb.module);
- 		kfree_skb(nlk->cb.skb);
- 	}
-@@ -346,6 +345,14 @@ static void netlink_sock_destruct(struct sock *sk)
- 	WARN_ON(nlk_sk(sk)->groups);
- }
- 
-+static void netlink_sock_destruct_work(struct work_struct *work)
-+{
-+	struct netlink_sock *nlk = container_of(work, struct netlink_sock,
-+						work);
-+
-+	sk_free(&nlk->sk);
-+}
-+
- /* This lock without WQ_FLAG_EXCLUSIVE is good on UP and it is _very_ bad on
-  * SMP. Look, when several writers sleep and reader wakes them up, all but one
-  * immediately hit write lock and grab all the cpus. Exclusive sleep solves
-@@ -648,8 +655,18 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol,
- static void deferred_put_nlk_sk(struct rcu_head *head)
- {
- 	struct netlink_sock *nlk = container_of(head, struct netlink_sock, rcu);
-+	struct sock *sk = &nlk->sk;
-+
-+	if (!atomic_dec_and_test(&sk->sk_refcnt))
-+		return;
-+
-+	if (nlk->cb_running && nlk->cb.done) {
-+		INIT_WORK(&nlk->work, netlink_sock_destruct_work);
-+		schedule_work(&nlk->work);
-+		return;
-+	}
- 
--	sock_put(&nlk->sk);
-+	sk_free(sk);
- }
- 
- static int netlink_release(struct socket *sock)
-diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h
-index 3cfd6cc..4fdb383 100644
---- a/net/netlink/af_netlink.h
-+++ b/net/netlink/af_netlink.h
-@@ -3,6 +3,7 @@
- 
- #include <linux/rhashtable.h>
- #include <linux/atomic.h>
-+#include <linux/workqueue.h>
- #include <net/sock.h>
- 
- #define NLGRPSZ(x)	(ALIGN(x, sizeof(unsigned long) * 8) / 8)
-@@ -33,6 +34,7 @@ struct netlink_sock {
- 
- 	struct rhash_head	node;
- 	struct rcu_head		rcu;
-+	struct work_struct	work;
- };
- 
- static inline struct netlink_sock *nlk_sk(struct sock *sk)
-diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
-index d2238b2..dd23323 100644
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -3648,19 +3648,25 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
- 
- 		if (optlen != sizeof(val))
- 			return -EINVAL;
--		if (po->rx_ring.pg_vec || po->tx_ring.pg_vec)
--			return -EBUSY;
- 		if (copy_from_user(&val, optval, sizeof(val)))
- 			return -EFAULT;
- 		switch (val) {
- 		case TPACKET_V1:
- 		case TPACKET_V2:
- 		case TPACKET_V3:
--			po->tp_version = val;
--			return 0;
-+			break;
- 		default:
- 			return -EINVAL;
- 		}
-+		lock_sock(sk);
-+		if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) {
-+			ret = -EBUSY;
-+		} else {
-+			po->tp_version = val;
-+			ret = 0;
-+		}
-+		release_sock(sk);
-+		return ret;
- 	}
- 	case PACKET_RESERVE:
- 	{
-@@ -4164,6 +4170,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
- 	/* Added to avoid minimal code churn */
- 	struct tpacket_req *req = &req_u->req;
- 
-+	lock_sock(sk);
- 	/* Opening a Tx-ring is NOT supported in TPACKET_V3 */
- 	if (!closing && tx_ring && (po->tp_version > TPACKET_V2)) {
- 		net_warn_ratelimited("Tx-ring is not supported.\n");
-@@ -4245,7 +4252,6 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
- 			goto out;
- 	}
- 
--	lock_sock(sk);
- 
- 	/* Detach socket from network */
- 	spin_lock(&po->bind_lock);
-@@ -4294,11 +4300,11 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
- 		if (!tx_ring)
- 			prb_shutdown_retire_blk_timer(po, rb_queue);
- 	}
--	release_sock(sk);
- 
- 	if (pg_vec)
- 		free_pg_vec(pg_vec, order, req->tp_block_nr);
- out:
-+	release_sock(sk);
- 	return err;
- }
- 
-diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c
-index b54d56d..cf9b2fe 100644
---- a/net/sched/act_pedit.c
-+++ b/net/sched/act_pedit.c
-@@ -108,6 +108,17 @@ static void tcf_pedit_cleanup(struct tc_action *a, int bind)
- 	kfree(keys);
- }
- 
-+static bool offset_valid(struct sk_buff *skb, int offset)
-+{
-+	if (offset > 0 && offset > skb->len)
-+		return false;
-+
-+	if  (offset < 0 && -offset > skb_headroom(skb))
-+		return false;
-+
-+	return true;
-+}
-+
- static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
- 		     struct tcf_result *res)
- {
-@@ -134,6 +145,11 @@ static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
- 			if (tkey->offmask) {
- 				char *d, _d;
- 
-+				if (!offset_valid(skb, off + tkey->at)) {
-+					pr_info("tc filter pedit 'at' offset %d out of bounds\n",
-+						off + tkey->at);
-+					goto bad;
-+				}
- 				d = skb_header_pointer(skb, off + tkey->at, 1,
- 						       &_d);
- 				if (!d)
-@@ -146,10 +162,10 @@ static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
- 					" offset must be on 32 bit boundaries\n");
- 				goto bad;
- 			}
--			if (offset > 0 && offset > skb->len) {
--				pr_info("tc filter pedit"
--					" offset %d can't exceed pkt length %d\n",
--				       offset, skb->len);
-+
-+			if (!offset_valid(skb, off + offset)) {
-+				pr_info("tc filter pedit offset %d out of bounds\n",
-+					offset);
- 				goto bad;
- 			}
- 
-diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c
-index 0b8c3ac..1bf1f451 100644
---- a/net/sched/cls_basic.c
-+++ b/net/sched/cls_basic.c
-@@ -62,9 +62,6 @@ static unsigned long basic_get(struct tcf_proto *tp, u32 handle)
- 	struct basic_head *head = rtnl_dereference(tp->root);
- 	struct basic_filter *f;
- 
--	if (head == NULL)
--		return 0UL;
--
- 	list_for_each_entry(f, &head->flist, link) {
- 		if (f->handle == handle) {
- 			l = (unsigned long) f;
-@@ -109,7 +106,6 @@ static bool basic_destroy(struct tcf_proto *tp, bool force)
- 		tcf_unbind_filter(tp, &f->res);
- 		call_rcu(&f->rcu, basic_delete_filter);
- 	}
--	RCU_INIT_POINTER(tp->root, NULL);
- 	kfree_rcu(head, rcu);
- 	return true;
- }
-diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c
-index c3002c2..dbec458 100644
---- a/net/sched/cls_bpf.c
-+++ b/net/sched/cls_bpf.c
-@@ -200,7 +200,6 @@ static bool cls_bpf_destroy(struct tcf_proto *tp, bool force)
- 		call_rcu(&prog->rcu, __cls_bpf_delete_prog);
- 	}
- 
--	RCU_INIT_POINTER(tp->root, NULL);
- 	kfree_rcu(head, rcu);
- 	return true;
- }
-@@ -211,9 +210,6 @@ static unsigned long cls_bpf_get(struct tcf_proto *tp, u32 handle)
- 	struct cls_bpf_prog *prog;
- 	unsigned long ret = 0UL;
- 
--	if (head == NULL)
--		return 0UL;
--
- 	list_for_each_entry(prog, &head->plist, link) {
- 		if (prog->handle == handle) {
- 			ret = (unsigned long) prog;
-diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c
-index 4c85bd3..c104c20 100644
---- a/net/sched/cls_cgroup.c
-+++ b/net/sched/cls_cgroup.c
-@@ -130,11 +130,10 @@ static bool cls_cgroup_destroy(struct tcf_proto *tp, bool force)
- 
- 	if (!force)
- 		return false;
--
--	if (head) {
--		RCU_INIT_POINTER(tp->root, NULL);
-+	/* Head can still be NULL due to cls_cgroup_init(). */
-+	if (head)
- 		call_rcu(&head->rcu, cls_cgroup_destroy_rcu);
--	}
-+
- 	return true;
- }
- 
-diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c
-index fbfec6a..d7ba2b4 100644
---- a/net/sched/cls_flow.c
-+++ b/net/sched/cls_flow.c
-@@ -583,7 +583,6 @@ static bool flow_destroy(struct tcf_proto *tp, bool force)
- 		list_del_rcu(&f->list);
- 		call_rcu(&f->rcu, flow_destroy_filter);
- 	}
--	RCU_INIT_POINTER(tp->root, NULL);
- 	kfree_rcu(head, rcu);
- 	return true;
- }
-diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
-index 5060801..a411571 100644
---- a/net/sched/cls_flower.c
-+++ b/net/sched/cls_flower.c
-@@ -13,6 +13,7 @@
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/rhashtable.h>
-+#include <linux/workqueue.h>
- 
- #include <linux/if_ether.h>
- #include <linux/in6.h>
-@@ -55,7 +56,10 @@ struct cls_fl_head {
- 	bool mask_assigned;
- 	struct list_head filters;
- 	struct rhashtable_params ht_params;
--	struct rcu_head rcu;
-+	union {
-+		struct work_struct work;
-+		struct rcu_head	rcu;
-+	};
- };
- 
- struct cls_fl_filter {
-@@ -239,6 +243,24 @@ static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f)
- 	dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, &tc);
- }
- 
-+static void fl_destroy_sleepable(struct work_struct *work)
-+{
-+	struct cls_fl_head *head = container_of(work, struct cls_fl_head,
-+						work);
-+	if (head->mask_assigned)
-+		rhashtable_destroy(&head->ht);
-+	kfree(head);
-+	module_put(THIS_MODULE);
-+}
-+
-+static void fl_destroy_rcu(struct rcu_head *rcu)
-+{
-+	struct cls_fl_head *head = container_of(rcu, struct cls_fl_head, rcu);
-+
-+	INIT_WORK(&head->work, fl_destroy_sleepable);
-+	schedule_work(&head->work);
-+}
-+
- static bool fl_destroy(struct tcf_proto *tp, bool force)
- {
- 	struct cls_fl_head *head = rtnl_dereference(tp->root);
-@@ -252,10 +274,9 @@ static bool fl_destroy(struct tcf_proto *tp, bool force)
- 		list_del_rcu(&f->list);
- 		call_rcu(&f->rcu, fl_destroy_filter);
- 	}
--	RCU_INIT_POINTER(tp->root, NULL);
--	if (head->mask_assigned)
--		rhashtable_destroy(&head->ht);
--	kfree_rcu(head, rcu);
-+
-+	__module_get(THIS_MODULE);
-+	call_rcu(&head->rcu, fl_destroy_rcu);
- 	return true;
- }
- 
-diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c
-index 25927b6..f935429 100644
---- a/net/sched/cls_matchall.c
-+++ b/net/sched/cls_matchall.c
-@@ -114,7 +114,6 @@ static bool mall_destroy(struct tcf_proto *tp, bool force)
- 
- 		call_rcu(&f->rcu, mall_destroy_filter);
- 	}
--	RCU_INIT_POINTER(tp->root, NULL);
- 	kfree_rcu(head, rcu);
- 	return true;
- }
-diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h
-index f9c9fc0..9992dfa 100644
---- a/net/sched/cls_rsvp.h
-+++ b/net/sched/cls_rsvp.h
-@@ -152,7 +152,8 @@ static int rsvp_classify(struct sk_buff *skb, const struct tcf_proto *tp,
- 		return -1;
- 	nhptr = ip_hdr(skb);
- #endif
--
-+	if (unlikely(!head))
-+		return -1;
- restart:
- 
- #if RSVP_DST_LEN == 4
-diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c
-index 944c8ff..403746b 100644
---- a/net/sched/cls_tcindex.c
-+++ b/net/sched/cls_tcindex.c
-@@ -503,7 +503,6 @@ static bool tcindex_destroy(struct tcf_proto *tp, bool force)
- 	walker.fn = tcindex_destroy_element;
- 	tcindex_walk(tp, &walker);
- 
--	RCU_INIT_POINTER(tp->root, NULL);
- 	call_rcu(&p->rcu, __tcindex_destroy);
- 	return true;
- }
-diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
-index 65b1bbf..6167699 100644
---- a/net/tipc/bearer.c
-+++ b/net/tipc/bearer.c
-@@ -402,6 +402,10 @@ int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,
- 	dev = dev_get_by_name(net, driver_name);
- 	if (!dev)
- 		return -ENODEV;
-+	if (tipc_mtu_bad(dev, 0)) {
-+		dev_put(dev);
-+		return -EINVAL;
-+	}
- 
- 	/* Associate TIPC bearer with L2 bearer */
- 	rcu_assign_pointer(b->media_ptr, dev);
-@@ -606,8 +610,6 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
- 	if (!b)
- 		return NOTIFY_DONE;
- 
--	b->mtu = dev->mtu;
--
- 	switch (evt) {
- 	case NETDEV_CHANGE:
- 		if (netif_carrier_ok(dev))
-@@ -621,6 +623,11 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
- 		tipc_reset_bearer(net, b);
- 		break;
- 	case NETDEV_CHANGEMTU:
-+		if (tipc_mtu_bad(dev, 0)) {
-+			bearer_disable(net, b);
-+			break;
-+		}
-+		b->mtu = dev->mtu;
- 		tipc_reset_bearer(net, b);
- 		break;
- 	case NETDEV_CHANGEADDR:
-diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
-index 43757f1..d93f1f1 100644
---- a/net/tipc/bearer.h
-+++ b/net/tipc/bearer.h
-@@ -39,6 +39,7 @@
- 
- #include "netlink.h"
- #include "core.h"
-+#include "msg.h"
- #include <net/genetlink.h>
- 
- #define MAX_MEDIA	3
-@@ -59,6 +60,9 @@
- #define TIPC_MEDIA_TYPE_IB	2
- #define TIPC_MEDIA_TYPE_UDP	3
- 
-+/* minimum bearer MTU */
-+#define TIPC_MIN_BEARER_MTU	(MAX_H_SIZE + INT_H_SIZE)
-+
- /**
-  * struct tipc_media_addr - destination address used by TIPC bearers
-  * @value: address info (format defined by media)
-@@ -213,4 +217,13 @@ void tipc_bearer_xmit(struct net *net, u32 bearer_id,
- void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
- 			 struct sk_buff_head *xmitq);
- 
-+/* check if device MTU is too low for tipc headers */
-+static inline bool tipc_mtu_bad(struct net_device *dev, unsigned int reserve)
-+{
-+	if (dev->mtu >= TIPC_MIN_BEARER_MTU + reserve)
-+		return false;
-+	netdev_warn(dev, "MTU too low for tipc bearer\n");
-+	return true;
-+}
-+
- #endif	/* _TIPC_BEARER_H */
-diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
-index ae7e14c..f60f346 100644
---- a/net/tipc/udp_media.c
-+++ b/net/tipc/udp_media.c
-@@ -372,6 +372,11 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
- 		udp_conf.local_ip.s_addr = htonl(INADDR_ANY);
- 		udp_conf.use_udp_checksums = false;
- 		ub->ifindex = dev->ifindex;
-+		if (tipc_mtu_bad(dev, sizeof(struct iphdr) +
-+				      sizeof(struct udphdr))) {
-+			err = -EINVAL;
-+			goto err;
-+		}
- 		b->mtu = dev->mtu - sizeof(struct iphdr)
- 			- sizeof(struct udphdr);
- #if IS_ENABLED(CONFIG_IPV6)
-diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
-index 8309687..568f307 100644
---- a/net/unix/af_unix.c
-+++ b/net/unix/af_unix.c
-@@ -2199,7 +2199,8 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
-  *	Sleep until more data has arrived. But check for races..
-  */
- static long unix_stream_data_wait(struct sock *sk, long timeo,
--				  struct sk_buff *last, unsigned int last_len)
-+				  struct sk_buff *last, unsigned int last_len,
-+				  bool freezable)
- {
- 	struct sk_buff *tail;
- 	DEFINE_WAIT(wait);
-@@ -2220,7 +2221,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,
- 
- 		sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
- 		unix_state_unlock(sk);
--		timeo = freezable_schedule_timeout(timeo);
-+		if (freezable)
-+			timeo = freezable_schedule_timeout(timeo);
-+		else
-+			timeo = schedule_timeout(timeo);
- 		unix_state_lock(sk);
- 
- 		if (sock_flag(sk, SOCK_DEAD))
-@@ -2250,7 +2254,8 @@ struct unix_stream_read_state {
- 	unsigned int splice_flags;
- };
- 
--static int unix_stream_read_generic(struct unix_stream_read_state *state)
-+static int unix_stream_read_generic(struct unix_stream_read_state *state,
-+				    bool freezable)
- {
- 	struct scm_cookie scm;
- 	struct socket *sock = state->socket;
-@@ -2330,7 +2335,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state)
- 			mutex_unlock(&u->iolock);
- 
- 			timeo = unix_stream_data_wait(sk, timeo, last,
--						      last_len);
-+						      last_len, freezable);
- 
- 			if (signal_pending(current)) {
- 				err = sock_intr_errno(timeo);
-@@ -2472,7 +2477,7 @@ static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,
- 		.flags = flags
- 	};
- 
--	return unix_stream_read_generic(&state);
-+	return unix_stream_read_generic(&state, true);
- }
- 
- static ssize_t skb_unix_socket_splice(struct sock *sk,
-@@ -2518,7 +2523,7 @@ static ssize_t unix_stream_splice_read(struct socket *sock,  loff_t *ppos,
- 	    flags & SPLICE_F_NONBLOCK)
- 		state.flags = MSG_DONTWAIT;
- 
--	return unix_stream_read_generic(&state);
-+	return unix_stream_read_generic(&state, false);
- }
- 
- static int unix_shutdown(struct socket *sock, int mode)

diff --git a/4.8.15/1014_linux-4.8.15.patch b/4.8.15/1014_linux-4.8.15.patch
deleted file mode 100644
index 9b7b2f4..0000000
--- a/4.8.15/1014_linux-4.8.15.patch
+++ /dev/null
@@ -1,1042 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 6a74924..c7f0e79 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 8
--SUBLEVEL = 14
-+SUBLEVEL = 15
- EXTRAVERSION =
- NAME = Psychotic Stoned Sheep
- 
-diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
-index 1e90bdb..fb307de 100644
---- a/arch/arm/boot/dts/imx7s.dtsi
-+++ b/arch/arm/boot/dts/imx7s.dtsi
-@@ -640,9 +640,8 @@
- 				reg = <0x30730000 0x10000>;
- 				interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
- 				clocks = <&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>,
--					<&clks IMX7D_CLK_DUMMY>,
--					<&clks IMX7D_CLK_DUMMY>;
--				clock-names = "pix", "axi", "disp_axi";
-+					<&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>;
-+				clock-names = "pix", "axi";
- 				status = "disabled";
- 			};
- 		};
-diff --git a/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts b/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts
-index 1cf644b..51dc734 100644
---- a/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts
-+++ b/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts
-@@ -82,6 +82,10 @@
- 	gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
- };
- 
-+&sata {
-+	nr-ports = <2>;
-+};
-+
- &ehci1 {
- 	status = "okay";
- };
-diff --git a/arch/m68k/include/asm/delay.h b/arch/m68k/include/asm/delay.h
-index d28fa8f..c598d84 100644
---- a/arch/m68k/include/asm/delay.h
-+++ b/arch/m68k/include/asm/delay.h
-@@ -114,6 +114,6 @@ static inline void __udelay(unsigned long usecs)
-  */
- #define	HZSCALE		(268435456 / (1000000 / HZ))
- 
--#define ndelay(n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000));
-+#define ndelay(n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000))
- 
- #endif /* defined(_M68K_DELAY_H) */
-diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h
-index c2c43f7..3a4ed9f 100644
---- a/arch/parisc/include/asm/pgtable.h
-+++ b/arch/parisc/include/asm/pgtable.h
-@@ -65,9 +65,9 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
- 		unsigned long flags;				\
- 		spin_lock_irqsave(&pa_tlb_lock, flags);		\
- 		old_pte = *ptep;				\
--		set_pte(ptep, pteval);				\
- 		if (pte_inserted(old_pte))			\
- 			purge_tlb_entries(mm, addr);		\
-+		set_pte(ptep, pteval);				\
- 		spin_unlock_irqrestore(&pa_tlb_lock, flags);	\
- 	} while (0)
- 
-@@ -478,8 +478,8 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned
- 		spin_unlock_irqrestore(&pa_tlb_lock, flags);
- 		return 0;
- 	}
--	set_pte(ptep, pte_mkold(pte));
- 	purge_tlb_entries(vma->vm_mm, addr);
-+	set_pte(ptep, pte_mkold(pte));
- 	spin_unlock_irqrestore(&pa_tlb_lock, flags);
- 	return 1;
- }
-@@ -492,9 +492,9 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
- 
- 	spin_lock_irqsave(&pa_tlb_lock, flags);
- 	old_pte = *ptep;
--	set_pte(ptep, __pte(0));
- 	if (pte_inserted(old_pte))
- 		purge_tlb_entries(mm, addr);
-+	set_pte(ptep, __pte(0));
- 	spin_unlock_irqrestore(&pa_tlb_lock, flags);
- 
- 	return old_pte;
-@@ -504,8 +504,8 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
- {
- 	unsigned long flags;
- 	spin_lock_irqsave(&pa_tlb_lock, flags);
--	set_pte(ptep, pte_wrprotect(*ptep));
- 	purge_tlb_entries(mm, addr);
-+	set_pte(ptep, pte_wrprotect(*ptep));
- 	spin_unlock_irqrestore(&pa_tlb_lock, flags);
- }
- 
-diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
-index c2259d4..bbb314eb 100644
---- a/arch/parisc/kernel/cache.c
-+++ b/arch/parisc/kernel/cache.c
-@@ -393,6 +393,15 @@ void __init parisc_setup_cache_timing(void)
- 
- 	/* calculate TLB flush threshold */
- 
-+	/* On SMP machines, skip the TLB measure of kernel text which
-+	 * has been mapped as huge pages. */
-+	if (num_online_cpus() > 1 && !parisc_requires_coherency()) {
-+		threshold = max(cache_info.it_size, cache_info.dt_size);
-+		threshold *= PAGE_SIZE;
-+		threshold /= num_online_cpus();
-+		goto set_tlb_threshold;
-+	}
-+
- 	alltime = mfctl(16);
- 	flush_tlb_all();
- 	alltime = mfctl(16) - alltime;
-@@ -411,6 +420,8 @@ void __init parisc_setup_cache_timing(void)
- 		alltime, size, rangetime);
- 
- 	threshold = PAGE_ALIGN(num_online_cpus() * size * alltime / rangetime);
-+
-+set_tlb_threshold:
- 	if (threshold)
- 		parisc_tlb_flush_threshold = threshold;
- 	printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
-diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S
-index 6755219..a4761b7 100644
---- a/arch/parisc/kernel/pacache.S
-+++ b/arch/parisc/kernel/pacache.S
-@@ -886,19 +886,10 @@ ENTRY(flush_dcache_page_asm)
- 	fdc,m		r31(%r28)
- 	fdc,m		r31(%r28)
- 	fdc,m		r31(%r28)
--	cmpb,COND(<<)		%r28, %r25,1b
-+	cmpb,COND(<<)	%r28, %r25,1b
- 	fdc,m		r31(%r28)
- 
- 	sync
--
--#ifdef CONFIG_PA20
--	pdtlb,l		%r0(%r25)
--#else
--	tlb_lock	%r20,%r21,%r22
--	pdtlb		%r0(%r25)
--	tlb_unlock	%r20,%r21,%r22
--#endif
--
- 	bv		%r0(%r2)
- 	nop
- 	.exit
-@@ -973,17 +964,6 @@ ENTRY(flush_icache_page_asm)
- 	fic,m		%r31(%sr4,%r28)
- 
- 	sync
--
--#ifdef CONFIG_PA20
--	pdtlb,l		%r0(%r28)
--	pitlb,l         %r0(%sr4,%r25)
--#else
--	tlb_lock        %r20,%r21,%r22
--	pdtlb		%r0(%r28)
--	pitlb           %r0(%sr4,%r25)
--	tlb_unlock      %r20,%r21,%r22
--#endif
--
- 	bv		%r0(%r2)
- 	nop
- 	.exit
-diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
-index 1a2a6e8..1894beb 100644
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -78,7 +78,8 @@ src-wlib-y := string.S crt0.S crtsavres.S stdio.c main.c \
- 		ns16550.c serial.c simple_alloc.c div64.S util.S \
- 		gunzip_util.c elf_util.c $(zlib) devtree.c stdlib.c \
- 		oflib.c ofconsole.c cuboot.c mpsc.c cpm-serial.c \
--		uartlite.c mpc52xx-psc.c opal.c opal-calls.S
-+		uartlite.c mpc52xx-psc.c opal.c
-+src-wlib-$(CONFIG_PPC64_BOOT_WRAPPER) +=  opal-calls.S
- src-wlib-$(CONFIG_40x) += 4xx.c planetcore.c
- src-wlib-$(CONFIG_44x) += 4xx.c ebony.c bamboo.c
- src-wlib-$(CONFIG_8xx) += mpc8xx.c planetcore.c fsl-soc.c
-diff --git a/arch/powerpc/boot/opal.c b/arch/powerpc/boot/opal.c
-index d7b4fd4..0272570 100644
---- a/arch/powerpc/boot/opal.c
-+++ b/arch/powerpc/boot/opal.c
-@@ -13,7 +13,7 @@
- #include <libfdt.h>
- #include "../include/asm/opal-api.h"
- 
--#ifdef __powerpc64__
-+#ifdef CONFIG_PPC64_BOOT_WRAPPER
- 
- /* Global OPAL struct used by opal-call.S */
- struct opal {
-diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
-index 29aa8d1..248f28b 100644
---- a/arch/powerpc/kernel/eeh_driver.c
-+++ b/arch/powerpc/kernel/eeh_driver.c
-@@ -671,8 +671,10 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus,
- 
- 	/* Clear frozen state */
- 	rc = eeh_clear_pe_frozen_state(pe, false);
--	if (rc)
-+	if (rc) {
-+		pci_unlock_rescan_remove();
- 		return rc;
-+	}
- 
- 	/* Give the system 5 seconds to finish running the user-space
- 	 * hotplug shutdown scripts, e.g. ifdown for ethernet.  Yes,
-diff --git a/arch/powerpc/mm/hash64_4k.c b/arch/powerpc/mm/hash64_4k.c
-index 42c702b..6fa450c 100644
---- a/arch/powerpc/mm/hash64_4k.c
-+++ b/arch/powerpc/mm/hash64_4k.c
-@@ -55,7 +55,7 @@ int __hash_page_4K(unsigned long ea, unsigned long access, unsigned long vsid,
- 	 */
- 	rflags = htab_convert_pte_flags(new_pte);
- 
--	if (!cpu_has_feature(CPU_FTR_NOEXECUTE) &&
-+	if (cpu_has_feature(CPU_FTR_NOEXECUTE) &&
- 	    !cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
- 		rflags = hash_page_do_lazy_icache(rflags, __pte(old_pte), trap);
- 
-diff --git a/arch/powerpc/mm/hash64_64k.c b/arch/powerpc/mm/hash64_64k.c
-index 3bbbea0..1a68cb1 100644
---- a/arch/powerpc/mm/hash64_64k.c
-+++ b/arch/powerpc/mm/hash64_64k.c
-@@ -87,7 +87,7 @@ int __hash_page_4K(unsigned long ea, unsigned long access, unsigned long vsid,
- 	subpg_pte = new_pte & ~subpg_prot;
- 	rflags = htab_convert_pte_flags(subpg_pte);
- 
--	if (!cpu_has_feature(CPU_FTR_NOEXECUTE) &&
-+	if (cpu_has_feature(CPU_FTR_NOEXECUTE) &&
- 	    !cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) {
- 
- 		/*
-@@ -258,7 +258,7 @@ int __hash_page_64K(unsigned long ea, unsigned long access,
- 
- 	rflags = htab_convert_pte_flags(new_pte);
- 
--	if (!cpu_has_feature(CPU_FTR_NOEXECUTE) &&
-+	if (cpu_has_feature(CPU_FTR_NOEXECUTE) &&
- 	    !cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
- 		rflags = hash_page_do_lazy_icache(rflags, __pte(old_pte), trap);
- 
-diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
-index a4e070a..8c925ec 100644
---- a/arch/x86/events/core.c
-+++ b/arch/x86/events/core.c
-@@ -68,7 +68,7 @@ u64 x86_perf_event_update(struct perf_event *event)
- 	int shift = 64 - x86_pmu.cntval_bits;
- 	u64 prev_raw_count, new_raw_count;
- 	int idx = hwc->idx;
--	s64 delta;
-+	u64 delta;
- 
- 	if (idx == INTEL_PMC_IDX_FIXED_BTS)
- 		return 0;
-diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
-index 4c9a79b..3ef34c6 100644
---- a/arch/x86/events/intel/core.c
-+++ b/arch/x86/events/intel/core.c
-@@ -4024,7 +4024,7 @@ __init int intel_pmu_init(void)
- 
- 	/* Support full width counters using alternative MSR range */
- 	if (x86_pmu.intel_cap.full_width_write) {
--		x86_pmu.max_period = x86_pmu.cntval_mask;
-+		x86_pmu.max_period = x86_pmu.cntval_mask >> 1;
- 		x86_pmu.perfctr = MSR_IA32_PMC0;
- 		pr_cont("full-width counters, ");
- 	}
-diff --git a/crypto/Makefile b/crypto/Makefile
-index 99cc64ac..bd6a029 100644
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -40,6 +40,7 @@ obj-$(CONFIG_CRYPTO_ECDH) += ecdh_generic.o
- 
- $(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h
- $(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h
-+$(obj)/rsa_helper.o: $(obj)/rsapubkey-asn1.h $(obj)/rsaprivkey-asn1.h
- clean-files += rsapubkey-asn1.c rsapubkey-asn1.h
- clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h
- 
-diff --git a/crypto/mcryptd.c b/crypto/mcryptd.c
-index 86fb59b..c6e9920 100644
---- a/crypto/mcryptd.c
-+++ b/crypto/mcryptd.c
-@@ -254,18 +254,22 @@ static void *mcryptd_alloc_instance(struct crypto_alg *alg, unsigned int head,
- 	goto out;
- }
- 
--static inline void mcryptd_check_internal(struct rtattr **tb, u32 *type,
-+static inline bool mcryptd_check_internal(struct rtattr **tb, u32 *type,
- 					  u32 *mask)
- {
- 	struct crypto_attr_type *algt;
- 
- 	algt = crypto_get_attr_type(tb);
- 	if (IS_ERR(algt))
--		return;
--	if ((algt->type & CRYPTO_ALG_INTERNAL))
--		*type |= CRYPTO_ALG_INTERNAL;
--	if ((algt->mask & CRYPTO_ALG_INTERNAL))
--		*mask |= CRYPTO_ALG_INTERNAL;
-+		return false;
-+
-+	*type |= algt->type & CRYPTO_ALG_INTERNAL;
-+	*mask |= algt->mask & CRYPTO_ALG_INTERNAL;
-+
-+	if (*type & *mask & CRYPTO_ALG_INTERNAL)
-+		return true;
-+	else
-+		return false;
- }
- 
- static int mcryptd_hash_init_tfm(struct crypto_tfm *tfm)
-@@ -492,7 +496,8 @@ static int mcryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
- 	u32 mask = 0;
- 	int err;
- 
--	mcryptd_check_internal(tb, &type, &mask);
-+	if (!mcryptd_check_internal(tb, &type, &mask))
-+		return -EINVAL;
- 
- 	halg = ahash_attr_alg(tb[1], type, mask);
- 	if (IS_ERR(halg))
-diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
-index 2accf78..93e0d83 100644
---- a/drivers/acpi/nfit/core.c
-+++ b/drivers/acpi/nfit/core.c
-@@ -94,7 +94,7 @@ static struct acpi_device *to_acpi_dev(struct acpi_nfit_desc *acpi_desc)
- 	return to_acpi_device(acpi_desc->dev);
- }
- 
--static int xlat_status(void *buf, unsigned int cmd, u32 status)
-+static int xlat_bus_status(void *buf, unsigned int cmd, u32 status)
- {
- 	struct nd_cmd_clear_error *clear_err;
- 	struct nd_cmd_ars_status *ars_status;
-@@ -113,7 +113,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
- 		flags = ND_ARS_PERSISTENT | ND_ARS_VOLATILE;
- 		if ((status >> 16 & flags) == 0)
- 			return -ENOTTY;
--		break;
-+		return 0;
- 	case ND_CMD_ARS_START:
- 		/* ARS is in progress */
- 		if ((status & 0xffff) == NFIT_ARS_START_BUSY)
-@@ -122,7 +122,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
- 		/* Command failed */
- 		if (status & 0xffff)
- 			return -EIO;
--		break;
-+		return 0;
- 	case ND_CMD_ARS_STATUS:
- 		ars_status = buf;
- 		/* Command failed */
-@@ -146,7 +146,8 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
- 		 * then just continue with the returned results.
- 		 */
- 		if (status == NFIT_ARS_STATUS_INTR) {
--			if (ars_status->flags & NFIT_ARS_F_OVERFLOW)
-+			if (ars_status->out_length >= 40 && (ars_status->flags
-+						& NFIT_ARS_F_OVERFLOW))
- 				return -ENOSPC;
- 			return 0;
- 		}
-@@ -154,7 +155,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
- 		/* Unknown status */
- 		if (status >> 16)
- 			return -EIO;
--		break;
-+		return 0;
- 	case ND_CMD_CLEAR_ERROR:
- 		clear_err = buf;
- 		if (status & 0xffff)
-@@ -163,7 +164,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
- 			return -EIO;
- 		if (clear_err->length > clear_err->cleared)
- 			return clear_err->cleared;
--		break;
-+		return 0;
- 	default:
- 		break;
- 	}
-@@ -174,6 +175,16 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
- 	return 0;
- }
- 
-+static int xlat_status(struct nvdimm *nvdimm, void *buf, unsigned int cmd,
-+		u32 status)
-+{
-+	if (!nvdimm)
-+		return xlat_bus_status(buf, cmd, status);
-+	if (status)
-+		return -EIO;
-+	return 0;
-+}
-+
- static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
- 		struct nvdimm *nvdimm, unsigned int cmd, void *buf,
- 		unsigned int buf_len, int *cmd_rc)
-@@ -298,7 +309,8 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
- 
- 	for (i = 0, offset = 0; i < desc->out_num; i++) {
- 		u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, buf,
--				(u32 *) out_obj->buffer.pointer);
-+				(u32 *) out_obj->buffer.pointer,
-+				out_obj->buffer.length - offset);
- 
- 		if (offset + out_size > out_obj->buffer.length) {
- 			dev_dbg(dev, "%s:%s output object underflow cmd: %s field: %d\n",
-@@ -333,7 +345,8 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
- 			 */
- 			rc = buf_len - offset - in_buf.buffer.length;
- 			if (cmd_rc)
--				*cmd_rc = xlat_status(buf, cmd, fw_status);
-+				*cmd_rc = xlat_status(nvdimm, buf, cmd,
-+						fw_status);
- 		} else {
- 			dev_err(dev, "%s:%s underrun cmd: %s buf_len: %d out_len: %d\n",
- 					__func__, dimm_name, cmd_name, buf_len,
-@@ -343,7 +356,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
- 	} else {
- 		rc = 0;
- 		if (cmd_rc)
--			*cmd_rc = xlat_status(buf, cmd, fw_status);
-+			*cmd_rc = xlat_status(nvdimm, buf, cmd, fw_status);
- 	}
- 
-  out:
-@@ -1857,19 +1870,32 @@ static int ars_get_status(struct acpi_nfit_desc *acpi_desc)
- 	return cmd_rc;
- }
- 
--static int ars_status_process_records(struct nvdimm_bus *nvdimm_bus,
-+static int ars_status_process_records(struct acpi_nfit_desc *acpi_desc,
- 		struct nd_cmd_ars_status *ars_status)
- {
-+	struct nvdimm_bus *nvdimm_bus = acpi_desc->nvdimm_bus;
- 	int rc;
- 	u32 i;
- 
-+	/*
-+	 * First record starts at 44 byte offset from the start of the
-+	 * payload.
-+	 */
-+	if (ars_status->out_length < 44)
-+		return 0;
- 	for (i = 0; i < ars_status->num_records; i++) {
-+		/* only process full records */
-+		if (ars_status->out_length
-+				< 44 + sizeof(struct nd_ars_record) * (i + 1))
-+			break;
- 		rc = nvdimm_bus_add_poison(nvdimm_bus,
- 				ars_status->records[i].err_address,
- 				ars_status->records[i].length);
- 		if (rc)
- 			return rc;
- 	}
-+	if (i < ars_status->num_records)
-+		dev_warn(acpi_desc->dev, "detected truncated ars results\n");
- 
- 	return 0;
- }
-@@ -2122,8 +2148,7 @@ static int acpi_nfit_query_poison(struct acpi_nfit_desc *acpi_desc,
- 	if (rc < 0 && rc != -ENOSPC)
- 		return rc;
- 
--	if (ars_status_process_records(acpi_desc->nvdimm_bus,
--				acpi_desc->ars_status))
-+	if (ars_status_process_records(acpi_desc, acpi_desc->ars_status))
- 		return -ENOMEM;
- 
- 	return 0;
-diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
-index 2b38c1b..7a2e4d4 100644
---- a/drivers/acpi/sleep.c
-+++ b/drivers/acpi/sleep.c
-@@ -47,32 +47,15 @@ static void acpi_sleep_tts_switch(u32 acpi_state)
- 	}
- }
- 
--static void acpi_sleep_pts_switch(u32 acpi_state)
--{
--	acpi_status status;
--
--	status = acpi_execute_simple_method(NULL, "\\_PTS", acpi_state);
--	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
--		/*
--		 * OS can't evaluate the _PTS object correctly. Some warning
--		 * message will be printed. But it won't break anything.
--		 */
--		printk(KERN_NOTICE "Failure in evaluating _PTS object\n");
--	}
--}
--
--static int sleep_notify_reboot(struct notifier_block *this,
-+static int tts_notify_reboot(struct notifier_block *this,
- 			unsigned long code, void *x)
- {
- 	acpi_sleep_tts_switch(ACPI_STATE_S5);
--
--	acpi_sleep_pts_switch(ACPI_STATE_S5);
--
- 	return NOTIFY_DONE;
- }
- 
--static struct notifier_block sleep_notifier = {
--	.notifier_call	= sleep_notify_reboot,
-+static struct notifier_block tts_notifier = {
-+	.notifier_call	= tts_notify_reboot,
- 	.next		= NULL,
- 	.priority	= 0,
- };
-@@ -916,9 +899,9 @@ int __init acpi_sleep_init(void)
- 	pr_info(PREFIX "(supports%s)\n", supported);
- 
- 	/*
--	 * Register the sleep_notifier to reboot notifier list so that the _TTS
--	 * and _PTS object can also be evaluated when the system enters S5.
-+	 * Register the tts_notifier to reboot notifier list so that the _TTS
-+	 * object can also be evaluated when the system enters S5.
- 	 */
--	register_reboot_notifier(&sleep_notifier);
-+	register_reboot_notifier(&tts_notifier);
- 	return 0;
- }
-diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
-index 5163c8f..5497f7f 100644
---- a/drivers/block/zram/zram_drv.c
-+++ b/drivers/block/zram/zram_drv.c
-@@ -1413,8 +1413,14 @@ static ssize_t hot_remove_store(struct class *class,
- 	return ret ? ret : count;
- }
- 
-+/*
-+ * NOTE: hot_add attribute is not the usual read-only sysfs attribute. In a
-+ * sense that reading from this file does alter the state of your system -- it
-+ * creates a new un-initialized zram device and returns back this device's
-+ * device_id (or an error code if it fails to create a new device).
-+ */
- static struct class_attribute zram_control_class_attrs[] = {
--	__ATTR_RO(hot_add),
-+	__ATTR(hot_add, 0400, hot_add_show, NULL),
- 	__ATTR_WO(hot_remove),
- 	__ATTR_NULL,
- };
-diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c
-index 0ec112e..2341f37 100644
---- a/drivers/crypto/caam/ctrl.c
-+++ b/drivers/crypto/caam/ctrl.c
-@@ -557,8 +557,9 @@ static int caam_probe(struct platform_device *pdev)
- 	 * Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel,
- 	 * long pointers in master configuration register
- 	 */
--	clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK, MCFGR_AWCACHE_CACH |
--		      MCFGR_AWCACHE_BUFF | MCFGR_WDENABLE | MCFGR_LARGE_BURST |
-+	clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK | MCFGR_LONG_PTR,
-+		      MCFGR_AWCACHE_CACH | MCFGR_AWCACHE_BUFF |
-+		      MCFGR_WDENABLE | MCFGR_LARGE_BURST |
- 		      (sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0));
- 
- 	/*
-diff --git a/drivers/crypto/marvell/hash.c b/drivers/crypto/marvell/hash.c
-index b111e14..13e89af 100644
---- a/drivers/crypto/marvell/hash.c
-+++ b/drivers/crypto/marvell/hash.c
-@@ -168,12 +168,11 @@ static void mv_cesa_ahash_std_step(struct ahash_request *req)
- 	mv_cesa_adjust_op(engine, &creq->op_tmpl);
- 	memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
- 
--	digsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(req));
--	for (i = 0; i < digsize / 4; i++)
--		writel_relaxed(creq->state[i], engine->regs + CESA_IVDIG(i));
--
--	mv_cesa_adjust_op(engine, &creq->op_tmpl);
--	memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
-+	if (!sreq->offset) {
-+		digsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(req));
-+		for (i = 0; i < digsize / 4; i++)
-+			writel_relaxed(creq->state[i], engine->regs + CESA_IVDIG(i));
-+	}
- 
- 	if (creq->cache_ptr)
- 		memcpy_toio(engine->sram + CESA_SA_DATA_SRAM_OFFSET,
-diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
-index ff64313..4894199 100644
---- a/drivers/dax/dax.c
-+++ b/drivers/dax/dax.c
-@@ -324,7 +324,7 @@ static int check_vma(struct dax_dev *dax_dev, struct vm_area_struct *vma,
- 		return -ENXIO;
- 
- 	/* prevent private mappings from being established */
--	if ((vma->vm_flags & VM_SHARED) != VM_SHARED) {
-+	if ((vma->vm_flags & VM_MAYSHARE) != VM_MAYSHARE) {
- 		dev_info(dev, "%s: %s: fail, attempted private mapping\n",
- 				current->comm, func);
- 		return -EINVAL;
-diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
-index bfb91d8..1006af4 100644
---- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c
-+++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
-@@ -872,23 +872,25 @@ static int peak_usb_create_dev(const struct peak_usb_adapter *peak_usb_adapter,
- static void peak_usb_disconnect(struct usb_interface *intf)
- {
- 	struct peak_usb_device *dev;
-+	struct peak_usb_device *dev_prev_siblings;
- 
- 	/* unregister as many netdev devices as siblings */
--	for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) {
-+	for (dev = usb_get_intfdata(intf); dev; dev = dev_prev_siblings) {
- 		struct net_device *netdev = dev->netdev;
- 		char name[IFNAMSIZ];
- 
-+		dev_prev_siblings = dev->prev_siblings;
- 		dev->state &= ~PCAN_USB_STATE_CONNECTED;
- 		strncpy(name, netdev->name, IFNAMSIZ);
- 
- 		unregister_netdev(netdev);
--		free_candev(netdev);
- 
- 		kfree(dev->cmd_buf);
- 		dev->next_siblings = NULL;
- 		if (dev->adapter->dev_free)
- 			dev->adapter->dev_free(dev);
- 
-+		free_candev(netdev);
- 		dev_info(&intf->dev, "%s removed\n", name);
- 	}
- 
-diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
-index a8b6949..23d4a17 100644
---- a/drivers/nvdimm/bus.c
-+++ b/drivers/nvdimm/bus.c
-@@ -715,7 +715,7 @@ EXPORT_SYMBOL_GPL(nd_cmd_in_size);
- 
- u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
- 		const struct nd_cmd_desc *desc, int idx, const u32 *in_field,
--		const u32 *out_field)
-+		const u32 *out_field, unsigned long remainder)
- {
- 	if (idx >= desc->out_num)
- 		return UINT_MAX;
-@@ -727,9 +727,24 @@ u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
- 		return in_field[1];
- 	else if (nvdimm && cmd == ND_CMD_VENDOR && idx == 2)
- 		return out_field[1];
--	else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2)
--		return out_field[1] - 8;
--	else if (cmd == ND_CMD_CALL) {
-+	else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2) {
-+		/*
-+		 * Per table 9-276 ARS Data in ACPI 6.1, out_field[1] is
-+		 * "Size of Output Buffer in bytes, including this
-+		 * field."
-+		 */
-+		if (out_field[1] < 4)
-+			return 0;
-+		/*
-+		 * ACPI 6.1 is ambiguous if 'status' is included in the
-+		 * output size. If we encounter an output size that
-+		 * overshoots the remainder by 4 bytes, assume it was
-+		 * including 'status'.
-+		 */
-+		if (out_field[1] - 8 == remainder)
-+			return remainder;
-+		return out_field[1] - 4;
-+	} else if (cmd == ND_CMD_CALL) {
- 		struct nd_cmd_pkg *pkg = (struct nd_cmd_pkg *) in_field;
- 
- 		return pkg->nd_size_out;
-@@ -876,7 +891,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
- 	/* process an output envelope */
- 	for (i = 0; i < desc->out_num; i++) {
- 		u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i,
--				(u32 *) in_env, (u32 *) out_env);
-+				(u32 *) in_env, (u32 *) out_env, 0);
- 		u32 copy;
- 
- 		if (out_size == UINT_MAX) {
-diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
-index 7080ce2..8214eba 100644
---- a/drivers/scsi/lpfc/lpfc_sli.c
-+++ b/drivers/scsi/lpfc/lpfc_sli.c
-@@ -1323,18 +1323,20 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
- {
- 	lockdep_assert_held(&phba->hbalock);
- 
--	BUG_ON(!piocb || !piocb->vport);
-+	BUG_ON(!piocb);
- 
- 	list_add_tail(&piocb->list, &pring->txcmplq);
- 	piocb->iocb_flag |= LPFC_IO_ON_TXCMPLQ;
- 
- 	if ((unlikely(pring->ringno == LPFC_ELS_RING)) &&
- 	   (piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
--	   (piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN) &&
--	    (!(piocb->vport->load_flag & FC_UNLOADING)))
--		mod_timer(&piocb->vport->els_tmofunc,
--			  jiffies +
--			  msecs_to_jiffies(1000 * (phba->fc_ratov << 1)));
-+	   (piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN)) {
-+		BUG_ON(!piocb->vport);
-+		if (!(piocb->vport->load_flag & FC_UNLOADING))
-+			mod_timer(&piocb->vport->els_tmofunc,
-+				  jiffies +
-+				  msecs_to_jiffies(1000 * (phba->fc_ratov << 1)));
-+	}
- 
- 	return 0;
- }
-diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
-index e3b30ea..a504e2e0 100644
---- a/drivers/vhost/vsock.c
-+++ b/drivers/vhost/vsock.c
-@@ -506,7 +506,7 @@ static void vhost_vsock_reset_orphans(struct sock *sk)
- 	 * executing.
- 	 */
- 
--	if (!vhost_vsock_get(vsk->local_addr.svm_cid)) {
-+	if (!vhost_vsock_get(vsk->remote_addr.svm_cid)) {
- 		sock_set_flag(sk, SOCK_DONE);
- 		vsk->peer_shutdown = SHUTDOWN_MASK;
- 		sk->sk_state = SS_UNCONNECTED;
-diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
-index df4b3e6..93142bf 100644
---- a/fs/ceph/dir.c
-+++ b/fs/ceph/dir.c
-@@ -1257,26 +1257,30 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
- 			return -ECHILD;
- 
- 		op = ceph_snap(dir) == CEPH_SNAPDIR ?
--			CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP;
-+			CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_GETATTR;
- 		req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS);
- 		if (!IS_ERR(req)) {
- 			req->r_dentry = dget(dentry);
--			req->r_num_caps = 2;
-+			req->r_num_caps = op == CEPH_MDS_OP_GETATTR ? 1 : 2;
- 
- 			mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED;
- 			if (ceph_security_xattr_wanted(dir))
- 				mask |= CEPH_CAP_XATTR_SHARED;
- 			req->r_args.getattr.mask = mask;
- 
--			req->r_locked_dir = dir;
- 			err = ceph_mdsc_do_request(mdsc, NULL, req);
--			if (err == 0 || err == -ENOENT) {
--				if (dentry == req->r_dentry) {
--					valid = !d_unhashed(dentry);
--				} else {
--					d_invalidate(req->r_dentry);
--					err = -EAGAIN;
--				}
-+			switch (err) {
-+			case 0:
-+				if (d_really_is_positive(dentry) &&
-+				    d_inode(dentry) == req->r_target_inode)
-+					valid = 1;
-+				break;
-+			case -ENOENT:
-+				if (d_really_is_negative(dentry))
-+					valid = 1;
-+				/* Fallthrough */
-+			default:
-+				break;
- 			}
- 			ceph_mdsc_put_request(req);
- 			dout("d_revalidate %p lookup result=%d\n",
-diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
-index 4ff9251..eb5373a 100644
---- a/fs/fuse/dir.c
-+++ b/fs/fuse/dir.c
-@@ -1709,8 +1709,6 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
- 		return -EACCES;
- 
- 	if (attr->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID)) {
--		int kill;
--
- 		attr->ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID |
- 				    ATTR_MODE);
- 		/*
-@@ -1722,12 +1720,11 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
- 			return ret;
- 
- 		attr->ia_mode = inode->i_mode;
--		kill = should_remove_suid(entry);
--		if (kill & ATTR_KILL_SUID) {
-+		if (inode->i_mode & S_ISUID) {
- 			attr->ia_valid |= ATTR_MODE;
- 			attr->ia_mode &= ~S_ISUID;
- 		}
--		if (kill & ATTR_KILL_SGID) {
-+		if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
- 			attr->ia_valid |= ATTR_MODE;
- 			attr->ia_mode &= ~S_ISGID;
- 		}
-diff --git a/include/linux/cpu.h b/include/linux/cpu.h
-index 797d9c8..c8938eb 100644
---- a/include/linux/cpu.h
-+++ b/include/linux/cpu.h
-@@ -105,22 +105,16 @@ extern bool cpuhp_tasks_frozen;
- 		{ .notifier_call = fn, .priority = pri };	\
- 	__register_cpu_notifier(&fn##_nb);			\
- }
--#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
--#define cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
--#define __cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
--#endif /* #else #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
- 
--#ifdef CONFIG_HOTPLUG_CPU
- extern int register_cpu_notifier(struct notifier_block *nb);
- extern int __register_cpu_notifier(struct notifier_block *nb);
- extern void unregister_cpu_notifier(struct notifier_block *nb);
- extern void __unregister_cpu_notifier(struct notifier_block *nb);
--#else
- 
--#ifndef MODULE
--extern int register_cpu_notifier(struct notifier_block *nb);
--extern int __register_cpu_notifier(struct notifier_block *nb);
--#else
-+#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */
-+#define cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
-+#define __cpu_notifier(fn, pri)	do { (void)(fn); } while (0)
-+
- static inline int register_cpu_notifier(struct notifier_block *nb)
- {
- 	return 0;
-@@ -130,7 +124,6 @@ static inline int __register_cpu_notifier(struct notifier_block *nb)
- {
- 	return 0;
- }
--#endif
- 
- static inline void unregister_cpu_notifier(struct notifier_block *nb)
- {
-diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
-index bbfce62..d02d65d 100644
---- a/include/linux/libnvdimm.h
-+++ b/include/linux/libnvdimm.h
-@@ -153,7 +153,7 @@ u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
- 		const struct nd_cmd_desc *desc, int idx, void *buf);
- u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
- 		const struct nd_cmd_desc *desc, int idx, const u32 *in_field,
--		const u32 *out_field);
-+		const u32 *out_field, unsigned long remainder);
- int nvdimm_bus_check_dimm_count(struct nvdimm_bus *nvdimm_bus, int dimm_count);
- struct nd_region *nvdimm_pmem_region_create(struct nvdimm_bus *nvdimm_bus,
- 		struct nd_region_desc *ndr_desc);
-diff --git a/include/uapi/linux/can.h b/include/uapi/linux/can.h
-index 9692cda..c48d93a 100644
---- a/include/uapi/linux/can.h
-+++ b/include/uapi/linux/can.h
-@@ -196,5 +196,6 @@ struct can_filter {
- };
- 
- #define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */
-+#define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */
- 
- #endif /* !_UAPI_CAN_H */
-diff --git a/kernel/cpu.c b/kernel/cpu.c
-index 341bf80..73fb59f 100644
---- a/kernel/cpu.c
-+++ b/kernel/cpu.c
-@@ -578,7 +578,6 @@ void __init cpuhp_threads_init(void)
- 	kthread_unpark(this_cpu_read(cpuhp_state.thread));
- }
- 
--#ifdef CONFIG_HOTPLUG_CPU
- EXPORT_SYMBOL(register_cpu_notifier);
- EXPORT_SYMBOL(__register_cpu_notifier);
- void unregister_cpu_notifier(struct notifier_block *nb)
-@@ -595,6 +594,7 @@ void __unregister_cpu_notifier(struct notifier_block *nb)
- }
- EXPORT_SYMBOL(__unregister_cpu_notifier);
- 
-+#ifdef CONFIG_HOTPLUG_CPU
- /**
-  * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for a CPU
-  * @cpu: a CPU id
-diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
-index 1ec0f48..2c49d76 100644
---- a/kernel/locking/rtmutex.c
-+++ b/kernel/locking/rtmutex.c
-@@ -65,8 +65,72 @@ static inline void clear_rt_mutex_waiters(struct rt_mutex *lock)
- 
- static void fixup_rt_mutex_waiters(struct rt_mutex *lock)
- {
--	if (!rt_mutex_has_waiters(lock))
--		clear_rt_mutex_waiters(lock);
-+	unsigned long owner, *p = (unsigned long *) &lock->owner;
-+
-+	if (rt_mutex_has_waiters(lock))
-+		return;
-+
-+	/*
-+	 * The rbtree has no waiters enqueued, now make sure that the
-+	 * lock->owner still has the waiters bit set, otherwise the
-+	 * following can happen:
-+	 *
-+	 * CPU 0	CPU 1		CPU2
-+	 * l->owner=T1
-+	 *		rt_mutex_lock(l)
-+	 *		lock(l->lock)
-+	 *		l->owner = T1 | HAS_WAITERS;
-+	 *		enqueue(T2)
-+	 *		boost()
-+	 *		  unlock(l->lock)
-+	 *		block()
-+	 *
-+	 *				rt_mutex_lock(l)
-+	 *				lock(l->lock)
-+	 *				l->owner = T1 | HAS_WAITERS;
-+	 *				enqueue(T3)
-+	 *				boost()
-+	 *				  unlock(l->lock)
-+	 *				block()
-+	 *		signal(->T2)	signal(->T3)
-+	 *		lock(l->lock)
-+	 *		dequeue(T2)
-+	 *		deboost()
-+	 *		  unlock(l->lock)
-+	 *				lock(l->lock)
-+	 *				dequeue(T3)
-+	 *				 ==> wait list is empty
-+	 *				deboost()
-+	 *				 unlock(l->lock)
-+	 *		lock(l->lock)
-+	 *		fixup_rt_mutex_waiters()
-+	 *		  if (wait_list_empty(l) {
-+	 *		    l->owner = owner
-+	 *		    owner = l->owner & ~HAS_WAITERS;
-+	 *		      ==> l->owner = T1
-+	 *		  }
-+	 *				lock(l->lock)
-+	 * rt_mutex_unlock(l)		fixup_rt_mutex_waiters()
-+	 *				  if (wait_list_empty(l) {
-+	 *				    owner = l->owner & ~HAS_WAITERS;
-+	 * cmpxchg(l->owner, T1, NULL)
-+	 *  ===> Success (l->owner = NULL)
-+	 *
-+	 *				    l->owner = owner
-+	 *				      ==> l->owner = T1
-+	 *				  }
-+	 *
-+	 * With the check for the waiter bit in place T3 on CPU2 will not
-+	 * overwrite. All tasks fiddling with the waiters bit are
-+	 * serialized by l->lock, so nothing else can modify the waiters
-+	 * bit. If the bit is set then nothing can change l->owner either
-+	 * so the simple RMW is safe. The cmpxchg() will simply fail if it
-+	 * happens in the middle of the RMW because the waiters bit is
-+	 * still set.
-+	 */
-+	owner = READ_ONCE(*p);
-+	if (owner & RT_MUTEX_HAS_WAITERS)
-+		WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS);
- }
- 
- /*
-diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h
-index 4f5f83c..e317e1c 100644
---- a/kernel/locking/rtmutex_common.h
-+++ b/kernel/locking/rtmutex_common.h
-@@ -75,8 +75,9 @@ task_top_pi_waiter(struct task_struct *p)
- 
- static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock)
- {
--	return (struct task_struct *)
--		((unsigned long)lock->owner & ~RT_MUTEX_OWNER_MASKALL);
-+	unsigned long owner = (unsigned long) READ_ONCE(lock->owner);
-+
-+	return (struct task_struct *) (owner & ~RT_MUTEX_OWNER_MASKALL);
- }
- 
- /*
-diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c
-index a5d966c..418d9b6 100644
---- a/kernel/sched/auto_group.c
-+++ b/kernel/sched/auto_group.c
-@@ -192,6 +192,7 @@ int proc_sched_autogroup_set_nice(struct task_struct *p, int nice)
- {
- 	static unsigned long next = INITIAL_JIFFIES;
- 	struct autogroup *ag;
-+	unsigned long shares;
- 	int err;
- 
- 	if (nice < MIN_NICE || nice > MAX_NICE)
-@@ -210,9 +211,10 @@ int proc_sched_autogroup_set_nice(struct task_struct *p, int nice)
- 
- 	next = HZ / 10 + jiffies;
- 	ag = autogroup_task_get(p);
-+	shares = scale_load(sched_prio_to_weight[nice + 20]);
- 
- 	down_write(&ag->lock);
--	err = sched_group_set_shares(ag->tg, sched_prio_to_weight[nice + 20]);
-+	err = sched_group_set_shares(ag->tg, shares);
- 	if (!err)
- 		ag->nice = nice;
- 	up_write(&ag->lock);
-diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
-index 7e6df7a..67f8fa9 100644
---- a/net/batman-adv/translation-table.c
-+++ b/net/batman-adv/translation-table.c
-@@ -2849,7 +2849,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
- 							     &tvlv_tt_data,
- 							     &tt_change,
- 							     &tt_len);
--		if (!tt_len)
-+		if (!tt_len || !tvlv_len)
- 			goto unlock;
- 
- 		/* Copy the last orig_node's OGM buffer */
-@@ -2867,7 +2867,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
- 							     &tvlv_tt_data,
- 							     &tt_change,
- 							     &tt_len);
--		if (!tt_len)
-+		if (!tt_len || !tvlv_len)
- 			goto out;
- 
- 		/* fill the rest of the tvlv with the real TT entries */
-diff --git a/net/can/raw.c b/net/can/raw.c
-index 972c187..b075f02 100644
---- a/net/can/raw.c
-+++ b/net/can/raw.c
-@@ -499,6 +499,9 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
- 		if (optlen % sizeof(struct can_filter) != 0)
- 			return -EINVAL;
- 
-+		if (optlen > CAN_RAW_FILTER_MAX * sizeof(struct can_filter))
-+			return -EINVAL;
-+
- 		count = optlen / sizeof(struct can_filter);
- 
- 		if (count > 1) {

diff --git a/4.8.15/4420_grsecurity-3.1-4.8.15-201612151923.patch b/4.8.15/4420_grsecurity-3.1-4.8.15-201612301949.patch
similarity index 99%
rename from 4.8.15/4420_grsecurity-3.1-4.8.15-201612151923.patch
rename to 4.8.15/4420_grsecurity-3.1-4.8.15-201612301949.patch
index f7b8b72..b16a42d 100644
--- a/4.8.15/4420_grsecurity-3.1-4.8.15-201612151923.patch
+++ b/4.8.15/4420_grsecurity-3.1-4.8.15-201612301949.patch
@@ -22150,24 +22150,28 @@ index 6ca9fd6..4c0aa55 100644
   * Vectors 0x30-0x3f are used for ISA interrupts.
   *   round up to the next 16-vector boundary
 diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h
-index b77f5ed..3862b91 100644
+index b77f5ed..cbf5ec6 100644
 --- a/arch/x86/include/asm/irqflags.h
 +++ b/arch/x86/include/asm/irqflags.h
-@@ -23,11 +23,13 @@ static inline unsigned long native_save_fl(void)
+@@ -23,11 +23,17 @@ static inline unsigned long native_save_fl(void)
  		     : /* no input */
  		     : "memory");
  
++#if !defined(CONFIG_GRKERNSEC_CONFIG_VIRT_HOST) || !defined(CONFIG_GRKERNSEC_CONFIG_VIRT_VIRTUALBOX)
 +	BUG_ON(flags & X86_EFLAGS_AC);
++#endif
  	return flags;
  }
  
  static inline void native_restore_fl(unsigned long flags)
  {
++#if !defined(CONFIG_GRKERNSEC_CONFIG_VIRT_HOST) || !defined(CONFIG_GRKERNSEC_CONFIG_VIRT_VIRTUALBOX)
 +	BUG_ON(flags & X86_EFLAGS_AC);
++#endif
  	asm volatile("push %0 ; popf"
  		     : /* no output */
  		     :"g" (flags)
-@@ -137,6 +139,11 @@ static inline notrace unsigned long arch_local_irq_save(void)
+@@ -137,6 +143,11 @@ static inline notrace unsigned long arch_local_irq_save(void)
  	swapgs;					\
  	sysretl
  
@@ -120398,7 +120402,7 @@ index fd6be45..6be6542 100644
  
 diff --git a/grsecurity/Kconfig b/grsecurity/Kconfig
 new file mode 100644
-index 0000000..307ca55
+index 0000000..f1c1ee2
 --- /dev/null
 +++ b/grsecurity/Kconfig
 @@ -0,0 +1,1206 @@
@@ -120600,7 +120604,7 @@ index 0000000..307ca55
 +config GRKERNSEC_HIDESYM
 +	bool "Hide kernel symbols"
 +	default y if GRKERNSEC_CONFIG_AUTO
-+	select PAX_USERCOPY_SLABS
++	select PAX_USERCOPY
 +	help
 +	  If you say Y here, getting information on loaded modules, and
 +	  displaying all kernel symbols through a syscall will be restricted

diff --git a/4.8.15/4426_default_XATTR_PAX_FLAGS.patch b/4.8.15/4426_default_XATTR_PAX_FLAGS.patch
new file mode 100644
index 0000000..f7e97b5
--- /dev/null
+++ b/4.8.15/4426_default_XATTR_PAX_FLAGS.patch
@@ -0,0 +1,36 @@
+diff -Naur linux-4.8.15-hardened-r1.orig/security/Kconfig linux-4.8.15-hardened-r1/security/Kconfig
+--- linux-4.8.15-hardened-r1.orig/security/Kconfig	2017-01-01 12:10:19.638828792 -0500
++++ linux-4.8.15-hardened-r1/security/Kconfig	2017-01-01 12:14:05.434836657 -0500
+@@ -293,7 +293,7 @@
+ 
+ config PAX_PT_PAX_FLAGS
+ 	bool 'Use ELF program header marking'
+-	default y if GRKERNSEC_CONFIG_AUTO
++	default n
+ 	help
+ 	  Enabling this option will allow you to control PaX features on
+ 	  a per executable basis via the 'paxctl' utility available at
+@@ -312,9 +312,12 @@
+ 	  If you enable none of the marking options then all applications
+ 	  will run with PaX enabled on them by default.
+ 
++	  Note for Gentoo: PT_PAX_FLAGS has been deprecated in Gentoo.  Enable
++	  this only for legacy systems.
++
+ config PAX_XATTR_PAX_FLAGS
+ 	bool 'Use filesystem extended attributes marking'
+-	default y if GRKERNSEC_CONFIG_AUTO
++	default y
+ 	select CIFS_XATTR if CIFS
+ 	select EXT2_FS_XATTR if EXT2_FS
+ 	select EXT3_FS_XATTR if EXT3_FS
+@@ -343,6 +346,9 @@
+ 	  If you enable none of the marking options then all applications
+ 	  will run with PaX enabled on them by default.
+ 
++	  Note for Gentoo: XATTR_PAX_FLAGS is now the default in Gentoo.  Do
++	  not disable this unless you know what you're doing.
++
+ choice
+ 	prompt 'MAC system integration'
+ 	default PAX_HAVE_ACL_FLAGS


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [gentoo-commits] proj/hardened-patchset:master commit in: 4.8.15/
@ 2017-01-05 13:51 Anthony G. Basile
  0 siblings, 0 replies; 2+ messages in thread
From: Anthony G. Basile @ 2017-01-05 13:51 UTC (permalink / raw
  To: gentoo-commits

commit:     a942b8432f49a72c7eb3c1853f8c0d48cbb7ac02
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Thu Jan  5 13:51:17 2017 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Thu Jan  5 13:51:17 2017 +0000
URL:        https://gitweb.gentoo.org/proj/hardened-patchset.git/commit/?id=a942b843

grsecurity-3.1-4.8.15-201701031913

 4.8.15/0000_README                                 |   2 +-
 ... 4420_grsecurity-3.1-4.8.15-201701031913.patch} | 584 +++++++++++++--------
 2 files changed, 380 insertions(+), 206 deletions(-)

diff --git a/4.8.15/0000_README b/4.8.15/0000_README
index 97a03a1..fed975b 100644
--- a/4.8.15/0000_README
+++ b/4.8.15/0000_README
@@ -2,7 +2,7 @@ README
 -----------------------------------------------------------------------------
 Individual Patch Descriptions:
 -----------------------------------------------------------------------------
-Patch:	4420_grsecurity-3.1-4.8.15-201612301949.patch
+Patch:	4420_grsecurity-3.1-4.8.15-201701031913.patch
 From:	http://www.grsecurity.net
 Desc:	hardened-sources base patch from upstream grsecurity
 

diff --git a/4.8.15/4420_grsecurity-3.1-4.8.15-201612301949.patch b/4.8.15/4420_grsecurity-3.1-4.8.15-201701031913.patch
similarity index 99%
rename from 4.8.15/4420_grsecurity-3.1-4.8.15-201612301949.patch
rename to 4.8.15/4420_grsecurity-3.1-4.8.15-201701031913.patch
index b16a42d..f7efab2 100644
--- a/4.8.15/4420_grsecurity-3.1-4.8.15-201612301949.patch
+++ b/4.8.15/4420_grsecurity-3.1-4.8.15-201701031913.patch
@@ -28736,7 +28736,7 @@ index 6f8902b..5d42150 100644
 +	.fill PAGE_SIZE_asm - GDT_SIZE,1,0
 +	.endr
 diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
-index 9f8efc9..e1942f9 100644
+index 9f8efc9..448c93f 100644
 --- a/arch/x86/kernel/head_64.S
 +++ b/arch/x86/kernel/head_64.S
 @@ -20,6 +20,8 @@
@@ -28841,15 +28841,32 @@ index 9f8efc9..e1942f9 100644
  1:	wrmsr				/* Make changes effective */
  
  	/* Setup cr0 */
-@@ -294,6 +342,7 @@ ENTRY(secondary_startup_64)
+@@ -294,10 +342,10 @@ ENTRY(secondary_startup_64)
  	 *	REX.W + FF /5 JMP m16:64 Jump far, absolute indirect,
  	 *		address given in m16:64.
  	 */
+-	movq	initial_code(%rip),%rax
 +	pax_set_fptr_mask
- 	movq	initial_code(%rip),%rax
  	pushq	$0		# fake return address to stop unwinder
  	pushq	$__KERNEL_CS	# set correct cs
-@@ -328,7 +377,7 @@ ENDPROC(start_cpu0)
+-	pushq	%rax		# target address in negative space
++	pushq	initial_code(%rip) # target address in negative space
+ 	lretq
+ ENDPROC(secondary_startup_64)
+ 
+@@ -311,10 +359,9 @@ ENDPROC(secondary_startup_64)
+  */
+ ENTRY(start_cpu0)
+ 	movq stack_start(%rip),%rsp
+-	movq	initial_code(%rip),%rax
+ 	pushq	$0		# fake return address to stop unwinder
+ 	pushq	$__KERNEL_CS	# set correct cs
+-	pushq	%rax		# target address in negative space
++	pushq	initial_code(%rip) # target address in negative space
+ 	lretq
+ ENDPROC(start_cpu0)
+ #endif
+@@ -328,7 +375,7 @@ ENDPROC(start_cpu0)
  	.quad	INIT_PER_CPU_VAR(irq_stack_union)
  
  	GLOBAL(stack_start)
@@ -28858,7 +28875,7 @@ index 9f8efc9..e1942f9 100644
  	.word  0
  	__FINITDATA
  
-@@ -417,40 +466,70 @@ GLOBAL(name)
+@@ -417,40 +464,70 @@ GLOBAL(name)
  	__INITDATA
  NEXT_PAGE(early_level4_pgt)
  	.fill	511,8,0
@@ -28941,7 +28958,7 @@ index 9f8efc9..e1942f9 100644
  
  NEXT_PAGE(level2_kernel_pgt)
  	/*
-@@ -467,31 +546,79 @@ NEXT_PAGE(level2_kernel_pgt)
+@@ -467,31 +544,79 @@ NEXT_PAGE(level2_kernel_pgt)
  		KERNEL_IMAGE_SIZE/PMD_SIZE)
  
  NEXT_PAGE(level2_fixmap_pgt)
@@ -50936,7 +50953,7 @@ index 56dd261..493d7e0 100644
  	packetlen_aligned = ALIGN(packetlen, sizeof(u64));
  
 diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
-index a1c086b..b205fcb 100644
+index a1c086b..2001144 100644
 --- a/drivers/hv/hv.c
 +++ b/drivers/hv/hv.c
 @@ -183,6 +183,7 @@ static struct clocksource hyperv_cs_tsc = {
@@ -50967,7 +50984,7 @@ index a1c086b..b205fcb 100644
  	hypercall_msr.enable = 1;
  
 -	hypercall_msr.guest_physical_address = vmalloc_to_pfn(virtaddr);
-+	hypercall_msr.guest_physical_address = __phys_to_pfn(slow_virt_to_phys((ktla_ktva((unsigned long)hv_hypercall_page))));
++	hypercall_msr.guest_physical_address = __phys_to_pfn(slow_virt_to_phys((void *)(ktla_ktva((unsigned long)hv_hypercall_page))));
  	wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
  
  	/* Confirm that hypercall page did get setup. */
@@ -62752,7 +62769,7 @@ index b03e4f5..78e4cc4 100644
  	spin_unlock_irqrestore(&pdata->tstamp_lock, flags);
  
 diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h
-index 98d9d63..3825a58 100644
+index 98d9d63..0433122 100644
 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h
 +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h
 @@ -786,9 +786,9 @@ struct xgbe_prv_data {
@@ -62762,9 +62779,9 @@ index 98d9d63..3825a58 100644
 -	struct xgbe_hw_if hw_if;
 -	struct xgbe_phy_if phy_if;
 -	struct xgbe_desc_if desc_if;
-+	struct xgbe_hw_if *hw_if;
-+	struct xgbe_phy_if *phy_if;
-+	struct xgbe_desc_if *desc_if;
++	const struct xgbe_hw_if *hw_if;
++	const struct xgbe_phy_if *phy_if;
++	const struct xgbe_desc_if *desc_if;
  
  	/* AXI DMA settings */
  	unsigned int coherent;
@@ -125395,7 +125412,7 @@ index 0000000..fce7f71
 +}
 diff --git a/grsecurity/gracl_ip.c b/grsecurity/gracl_ip.c
 new file mode 100644
-index 0000000..5da5304
+index 0000000..d877c38
 --- /dev/null
 +++ b/grsecurity/gracl_ip.c
 @@ -0,0 +1,387 @@
@@ -125468,7 +125485,7 @@ index 0000000..5da5304
 +static const char * gr_sockfamilies[AF_MAX] = {
 +	"unspec", "unix", "inet", "ax25", "ipx", "appletalk", "netrom", "bridge", "atmpvc", "x25",
 +	"inet6", "rose", "decnet", "netbeui", "security", "key", "netlink", "packet", "ash",
-+	"econet", "atmsvc", "rds", "sna", "irda", "ppox", "wanpipe", "llc", "fam_27", "fam_28",
++	"econet", "atmsvc", "rds", "sna", "irda", "ppox", "wanpipe", "llc", "ib", "mpls", "can",
 +	"tipc", "bluetooth", "iucv", "rxrpc", "isdn", "phonet", "ieee802154", "ciaf", "alg",
 +	"nfc", "vsock", "kcm", "qipcrtr"
 +	};
@@ -132113,7 +132130,7 @@ index b097cf8..3d40e14 100644
  	if (x == 0)
  		return 0;
 diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h
-index 6f96247..f6ae0d7 100644
+index 6f96247..ca27641 100644
 --- a/include/asm-generic/bug.h
 +++ b/include/asm-generic/bug.h
 @@ -62,13 +62,13 @@ struct bug_entry {
@@ -132141,6 +132158,15 @@ index 6f96247..f6ae0d7 100644
  void __warn(const char *file, int line, void *caller, unsigned taint,
  	    struct pt_regs *regs, struct warn_args *args);
  
+@@ -151,7 +152,7 @@ void __warn(const char *file, int line, void *caller, unsigned taint,
+ #endif
+ 
+ #ifndef HAVE_ARCH_BUG_ON
+-#define BUG_ON(condition) do { if (condition) BUG(); } while (0)
++#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
+ #endif
+ 
+ #ifndef HAVE_ARCH_WARN_ON
 diff --git a/include/asm-generic/cache.h b/include/asm-generic/cache.h
 index 1bfcfe5..e04c5c9 100644
 --- a/include/asm-generic/cache.h
@@ -168707,12 +168733,12 @@ index 8b29dc1..ec1516e 100644
  
 diff --git a/scripts/gcc-plugins/checker_plugin.c b/scripts/gcc-plugins/checker_plugin.c
 new file mode 100644
-index 0000000..2b3c178
+index 0000000..0cd5656
 --- /dev/null
 +++ b/scripts/gcc-plugins/checker_plugin.c
-@@ -0,0 +1,496 @@
+@@ -0,0 +1,491 @@
 +/*
-+ * Copyright 2011-2016 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2
 + *
 + * Note: the choice of the license means that the compilation process is
@@ -168942,7 +168968,7 @@ index 0000000..2b3c178
 +	TREE_THIS_VOLATILE(context_error_decl) = 1;
 +	DECL_ASSEMBLER_NAME(context_error_decl);
 +
-+	attr = tree_cons(NULL, build_string(14, "context error"), NULL);
++	attr = tree_cons(NULL, build_const_char_string(14, "context error"), NULL);
 +	attr = tree_cons(get_identifier("error"), attr, NULL);
 +	decl_attributes(&context_error_decl, attr, 0);
 +}
@@ -169010,8 +169036,7 @@ index 0000000..2b3c178
 +
 +//	stmt = gimple_build_call(builtin_decl_implicit(BUILT_IN_TRAP), 0);
 +	len = strlen(file) + 1;
-+	filename = build_string(len, file);
-+	TREE_TYPE(filename) = build_array_type(unsigned_char_type_node, build_index_type(size_int(len)));
++	filename = build_const_char_string(len, file);
 +	filename = build1(ADDR_EXPR, const_ptr_type_node, filename);
 +	stmt = gimple_build_call(error, 2, filename, build_int_cst(NULL_TREE, line));
 +	gimple_set_location(stmt, loc);
@@ -169149,7 +169174,6 @@ index 0000000..2b3c178
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	int i;
 +	bool enable_user, enable_context;
-+	struct register_pass_info context_pass_info;
 +
 +	static const struct ggc_root_tab gt_ggc_r_gt_checker[] = {
 +		{
@@ -169169,11 +169193,8 @@ index 0000000..2b3c178
 +		LAST_GGC_ROOT_TAB
 +	};
 +
-+	context_pass_info.pass				= make_context_pass();
-+//	context_pass_info.reference_pass_name		= "ssa";
-+	context_pass_info.reference_pass_name		= "phiprop";
-+	context_pass_info.ref_pass_instance_number	= 1;
-+	context_pass_info.pos_op 			= PASS_POS_INSERT_AFTER;
++//	PASS_INFO(context, "ssa", 1, PASS_POS_INSERT_AFTER);
++	PASS_INFO(context, "phiprop", 1, PASS_POS_INSERT_AFTER);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -169209,12 +169230,12 @@ index 0000000..2b3c178
 +}
 diff --git a/scripts/gcc-plugins/colorize_plugin.c b/scripts/gcc-plugins/colorize_plugin.c
 new file mode 100644
-index 0000000..31fd196
+index 0000000..e6a0d72
 --- /dev/null
 +++ b/scripts/gcc-plugins/colorize_plugin.c
-@@ -0,0 +1,162 @@
+@@ -0,0 +1,158 @@
 +/*
-+ * Copyright 2012-2016 by PaX Team <pageexec@freemail.hu>
++ * Copyright 2012-2017 by PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2
 + *
 + * Note: the choice of the license means that the compilation process is
@@ -169332,13 +169353,9 @@ index 0000000..31fd196
 +	const int argc = plugin_info->argc;
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	int i;
-+	struct register_pass_info colorize_rearm_pass_info;
 +	bool colorize;
 +
-+	colorize_rearm_pass_info.pass				= make_colorize_rearm_pass();
-+	colorize_rearm_pass_info.reference_pass_name		= "*free_lang_data";
-+	colorize_rearm_pass_info.ref_pass_instance_number	= 1;
-+	colorize_rearm_pass_info.pos_op 			= PASS_POS_INSERT_AFTER;
++	PASS_INFO(colorize_rearm, "*free_lang_data", 1, PASS_POS_INSERT_AFTER);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -169377,13 +169394,13 @@ index 0000000..31fd196
 +}
 diff --git a/scripts/gcc-plugins/constify_plugin.c b/scripts/gcc-plugins/constify_plugin.c
 new file mode 100644
-index 0000000..5287631c
+index 0000000..e9051b5
 --- /dev/null
 +++ b/scripts/gcc-plugins/constify_plugin.c
-@@ -0,0 +1,582 @@
+@@ -0,0 +1,577 @@
 +/*
 + * Copyright 2011 by Emese Revfy <re.emese@gmail.com>
-+ * Copyright 2011-2016 by PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2017 by PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2, or (at your option) v3
 + *
 + * This gcc plugin constifies all structures which contain only function pointers or are explicitly marked for constification.
@@ -169927,12 +169944,7 @@ index 0000000..5287631c
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	int i;
 +
-+	struct register_pass_info check_local_variables_pass_info;
-+
-+	check_local_variables_pass_info.pass				= make_check_local_variables_pass();
-+	check_local_variables_pass_info.reference_pass_name		= "ssa";
-+	check_local_variables_pass_info.ref_pass_instance_number	= 1;
-+	check_local_variables_pass_info.pos_op				= PASS_POS_INSERT_BEFORE;
++	PASS_INFO(check_local_variables, "ssa", 1, PASS_POS_INSERT_BEFORE);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -169964,9 +169976,16 @@ index 0000000..5287631c
 +	return 0;
 +}
 diff --git a/scripts/gcc-plugins/cyc_complexity_plugin.c b/scripts/gcc-plugins/cyc_complexity_plugin.c
-index 34df974..8af7db0 100644
+index 34df974..2b01d4d 100644
 --- a/scripts/gcc-plugins/cyc_complexity_plugin.c
 +++ b/scripts/gcc-plugins/cyc_complexity_plugin.c
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2011-2017 by Emese Revfy <re.emese@gmail.com>
+  * Licensed under the GPL v2, or (at your option) v3
+  *
+  * Homepage:
 @@ -20,7 +20,7 @@
  
  #include "gcc-common.h"
@@ -169976,7 +169995,7 @@ index 34df974..8af7db0 100644
  
  static struct plugin_info cyc_complexity_plugin_info = {
  	.version	= "20160225",
-@@ -49,7 +49,7 @@ static unsigned int cyc_complexity_execute(void)
+@@ -49,15 +49,11 @@ static unsigned int cyc_complexity_execute(void)
  
  #include "gcc-generate-gimple-pass.h"
  
@@ -169984,12 +170003,21 @@ index 34df974..8af7db0 100644
 +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
  {
  	const char * const plugin_name = plugin_info->base_name;
- 	struct register_pass_info cyc_complexity_pass_info;
+-	struct register_pass_info cyc_complexity_pass_info;
+ 
+-	cyc_complexity_pass_info.pass				= make_cyc_complexity_pass();
+-	cyc_complexity_pass_info.reference_pass_name		= "ssa";
+-	cyc_complexity_pass_info.ref_pass_instance_number	= 1;
+-	cyc_complexity_pass_info.pos_op				= PASS_POS_INSERT_AFTER;
++	PASS_INFO(cyc_complexity, "ssa", 1, PASS_POS_INSERT_AFTER);
+ 
+ 	if (!plugin_default_version_check(version, &gcc_version)) {
+ 		error(G_("incompatible gcc/plugin versions"));
 diff --git a/scripts/gcc-plugins/gcc-common.h b/scripts/gcc-plugins/gcc-common.h
-index 172850b..a4e216d 100644
+index 172850b..879f0d5 100644
 --- a/scripts/gcc-plugins/gcc-common.h
 +++ b/scripts/gcc-plugins/gcc-common.h
-@@ -21,14 +21,20 @@
+@@ -21,14 +21,22 @@
  #include "rtl.h"
  #include "tm_p.h"
  #include "flags.h"
@@ -170002,7 +170030,9 @@ index 172850b..a4e216d 100644
  #include "except.h"
  #include "function.h"
  #include "toplev.h"
-+//#include "expr.h"
++#if BUILDING_GCC_VERSION >= 5000
++#include "expr.h"
++#endif
  #include "basic-block.h"
  #include "intl.h"
  #include "ggc.h"
@@ -170010,9 +170040,13 @@ index 172850b..a4e216d 100644
  #include "timevar.h"
  
  #include "params.h"
-@@ -40,12 +46,18 @@
+@@ -39,13 +47,22 @@
+ #include "hash-map.h"
  #endif
  
++#if BUILDING_GCC_VERSION >= 7000
++#include "memmodel.h"
++#endif
  #include "emit-rtl.h"
 +//#include "reload.h"
 +//#include "ira.h"
@@ -170029,7 +170063,7 @@ index 172850b..a4e216d 100644
  
  #if BUILDING_GCC_VERSION == 4005
  #include <sys/mman.h>
-@@ -57,6 +69,8 @@
+@@ -57,6 +74,8 @@
  #endif
  
  #if BUILDING_GCC_VERSION >= 4006
@@ -170038,18 +170072,21 @@ index 172850b..a4e216d 100644
  #include "c-family/c-common.h"
  #else
  #include "c-common.h"
-@@ -75,8 +89,10 @@
+@@ -75,8 +94,13 @@
  #endif
  
  #include "diagnostic.h"
 +//#include "tree-diagnostic.h"
  #include "tree-dump.h"
  #include "tree-pass.h"
++#if BUILDING_GCC_VERSION >= 4009
++#include "pass_manager.h"
++#endif
 +//#include "df.h"
  #include "predict.h"
  #include "ipa-utils.h"
  
-@@ -87,6 +103,7 @@
+@@ -87,10 +111,14 @@
  #include "internal-fn.h"
  #include "gimple-expr.h"
  #include "gimple-fold.h"
@@ -170057,7 +170094,14 @@ index 172850b..a4e216d 100644
  #include "context.h"
  #include "tree-ssa-alias.h"
  #include "tree-ssa.h"
-@@ -109,7 +126,15 @@
+ #include "stringpool.h"
++#if BUILDING_GCC_VERSION >= 7000
++#include "tree-vrp.h"
++#endif
+ #include "tree-ssanames.h"
+ #include "print-tree.h"
+ #include "tree-eh.h"
+@@ -109,27 +137,33 @@
  #include "ssa-iterators.h"
  #endif
  
@@ -170073,7 +170117,28 @@ index 172850b..a4e216d 100644
  #include "builtins.h"
  #endif
  
-@@ -130,6 +155,7 @@ extern void dump_gimple_stmt(pretty_printer *, gimple, int, int);
+-/* #include "expr.h" where are you... */
+-extern rtx emit_move_insn(rtx x, rtx y);
+-
+ /* missing from basic_block.h... */
+-extern void debug_dominance_info(enum cdi_direction dir);
+-extern void debug_dominance_tree(enum cdi_direction dir, basic_block root);
++void debug_dominance_info(enum cdi_direction dir);
++void debug_dominance_tree(enum cdi_direction dir, basic_block root);
+ 
+ #if BUILDING_GCC_VERSION == 4006
+-extern void debug_gimple_stmt(gimple);
+-extern void debug_gimple_seq(gimple_seq);
+-extern void print_gimple_seq(FILE *, gimple_seq, int, int);
+-extern void print_gimple_stmt(FILE *, gimple, int, int);
+-extern void print_gimple_expr(FILE *, gimple, int, int);
+-extern void dump_gimple_stmt(pretty_printer *, gimple, int, int);
++void debug_gimple_stmt(gimple);
++void debug_gimple_seq(gimple_seq);
++void print_gimple_seq(FILE *, gimple_seq, int, int);
++void print_gimple_stmt(FILE *, gimple, int, int);
++void print_gimple_expr(FILE *, gimple, int, int);
++void dump_gimple_stmt(pretty_printer *, gimple, int, int);
  #endif
  
  #define __unused __attribute__((__unused__))
@@ -170081,7 +170146,37 @@ index 172850b..a4e216d 100644
  
  #define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
  #define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
-@@ -165,6 +191,7 @@ static inline bool gimple_call_builtin_p(gimple stmt, enum built_in_function cod
+@@ -139,6 +173,29 @@ extern void dump_gimple_stmt(pretty_printer *, gimple, int, int);
+ /* should come from c-tree.h if only it were installed for gcc 4.5... */
+ #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1(TYPE)
+ 
++static inline tree build_const_char_string(int len, const char *str)
++{
++	tree cstr, elem, index, type;
++
++	cstr = build_string(len, str);
++	elem = build_type_variant(char_type_node, 1, 0);
++	index = build_index_type(size_int(len - 1));
++	type = build_array_type(elem, index);
++	TREE_TYPE(cstr) = type;
++	TREE_CONSTANT(cstr) = 1;
++	TREE_READONLY(cstr) = 1;
++	TREE_STATIC(cstr) = 1;
++	return cstr;
++}
++
++#define PASS_INFO(NAME, REF, ID, POS)		\
++struct register_pass_info NAME##_pass_info = {	\
++	.pass = make_##NAME##_pass(),		\
++	.reference_pass_name = REF,		\
++	.ref_pass_instance_number = ID,		\
++	.pos_op = POS,				\
++}
++
+ #if BUILDING_GCC_VERSION == 4005
+ #define FOR_EACH_LOCAL_DECL(FUN, I, D)			\
+ 	for (tree vars = (FUN)->local_decls, (I) = 0;	\
+@@ -165,6 +222,7 @@ static inline bool gimple_call_builtin_p(gimple stmt, enum built_in_function cod
  	fndecl = gimple_call_fndecl(stmt);
  	if (!fndecl || DECL_BUILT_IN_CLASS(fndecl) != BUILT_IN_NORMAL)
  		return false;
@@ -170089,7 +170184,7 @@ index 172850b..a4e216d 100644
  	return DECL_FUNCTION_CODE(fndecl) == code;
  }
  
-@@ -286,6 +313,22 @@ static inline struct cgraph_node *cgraph_next_function_with_gimple_body(struct c
+@@ -286,6 +344,22 @@ static inline struct cgraph_node *cgraph_next_function_with_gimple_body(struct c
  	return NULL;
  }
  
@@ -170112,8 +170207,37 @@ index 172850b..a4e216d 100644
  #define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \
  	for ((node) = cgraph_first_function_with_gimple_body(); (node); \
  		(node) = cgraph_next_function_with_gimple_body(node))
-@@ -495,6 +538,14 @@ static inline const greturn *as_a_const_greturn(const_gimple stmt)
+@@ -398,6 +472,7 @@ typedef union gimple_statement_d gassign;
+ typedef union gimple_statement_d gcall;
+ typedef union gimple_statement_d gcond;
+ typedef union gimple_statement_d gdebug;
++typedef union gimple_statement_d ggoto;
+ typedef union gimple_statement_d gphi;
+ typedef union gimple_statement_d greturn;
+ 
+@@ -451,6 +526,16 @@ static inline const gdebug *as_a_const_gdebug(const_gimple stmt)
+ 	return stmt;
+ }
  
++static inline ggoto *as_a_ggoto(gimple stmt)
++{
++	return stmt;
++}
++
++static inline const ggoto *as_a_const_ggoto(const_gimple stmt)
++{
++	return stmt;
++}
++
+ static inline gphi *as_a_gphi(gimple stmt)
+ {
+ 	return stmt;
+@@ -493,8 +578,18 @@ static inline const greturn *as_a_const_greturn(const_gimple stmt)
+ #define section_name_prefix LTO_SECTION_NAME_PREFIX
+ #define fatal_error(loc, gmsgid, ...) fatal_error((gmsgid), __VA_ARGS__)
+ 
++rtx emit_move_insn(rtx x, rtx y);
++
  typedef struct rtx_def rtx_insn;
  
 +static inline const char *get_decl_section_name(const_tree decl)
@@ -170127,7 +170251,44 @@ index 172850b..a4e216d 100644
  static inline void set_decl_section_name(tree node, const char *value)
  {
  	if (value)
-@@ -608,8 +659,15 @@ inline bool is_a_helper<const gassign *>::test(const_gimple gs)
+@@ -510,6 +605,7 @@ typedef struct gimple_statement_base gassign;
+ typedef struct gimple_statement_call gcall;
+ typedef struct gimple_statement_base gcond;
+ typedef struct gimple_statement_base gdebug;
++typedef struct gimple_statement_base ggoto;
+ typedef struct gimple_statement_phi gphi;
+ typedef struct gimple_statement_base greturn;
+ 
+@@ -563,6 +659,16 @@ static inline const gdebug *as_a_const_gdebug(const_gimple stmt)
+ 	return stmt;
+ }
+ 
++static inline ggoto *as_a_ggoto(gimple stmt)
++{
++	return stmt;
++}
++
++static inline const ggoto *as_a_const_ggoto(const_gimple stmt)
++{
++	return stmt;
++}
++
+ static inline gphi *as_a_gphi(gimple stmt)
+ {
+ 	return as_a<gphi>(stmt);
+@@ -590,6 +696,11 @@ static inline const greturn *as_a_const_greturn(const_gimple stmt)
+ #define NODE_DECL(node) (node)->decl
+ #define cgraph_node_name(node) (node)->name()
+ #define NODE_IMPLICIT_ALIAS(node) (node)->cpp_implicit_alias
++
++static inline opt_pass *get_pass_for_id(int id)
++{
++	return g->get_passes()->get_pass_for_id(id);
++}
+ #endif
+ 
+ #if BUILDING_GCC_VERSION >= 5000 && BUILDING_GCC_VERSION < 6000
+@@ -608,8 +719,15 @@ inline bool is_a_helper<const gassign *>::test(const_gimple gs)
  #define TODO_verify_stmts TODO_verify_il
  #define TODO_verify_rtl_sharing TODO_verify_il
  
@@ -170143,7 +170304,7 @@ index 172850b..a4e216d 100644
  /* symtab/cgraph related */
  #define debug_cgraph_node(node) (node)->debug()
  #define cgraph_get_node(decl) cgraph_node::get(decl)
-@@ -618,6 +676,7 @@ inline bool is_a_helper<const gassign *>::test(const_gimple gs)
+@@ -618,6 +736,7 @@ inline bool is_a_helper<const gassign *>::test(const_gimple gs)
  #define cgraph_n_nodes symtab->cgraph_count
  #define cgraph_max_uid symtab->cgraph_max_uid
  #define varpool_get_node(decl) varpool_node::get(decl)
@@ -170151,7 +170312,7 @@ index 172850b..a4e216d 100644
  
  #define cgraph_create_edge(caller, callee, call_stmt, count, freq, nest) \
  	(caller)->create_edge((callee), (call_stmt), (count), (freq))
-@@ -673,6 +732,11 @@ static inline cgraph_node_ptr cgraph_alias_target(cgraph_node_ptr node)
+@@ -673,6 +792,11 @@ static inline cgraph_node_ptr cgraph_alias_target(cgraph_node_ptr node)
  	return node->get_alias_target();
  }
  
@@ -170163,6 +170324,47 @@ index 172850b..a4e216d 100644
  static inline struct cgraph_node_hook_list *cgraph_add_function_insertion_hook(cgraph_node_hook hook, void *data)
  {
  	return symtab->add_cgraph_insertion_hook(hook, data);
+@@ -730,6 +854,13 @@ static inline gimple gimple_build_assign_with_ops(enum tree_code subcode, tree l
+ 
+ template <>
+ template <>
++inline bool is_a_helper<const ggoto *>::test(const_gimple gs)
++{
++	return gs->code == GIMPLE_GOTO;
++}
++
++template <>
++template <>
+ inline bool is_a_helper<const greturn *>::test(const_gimple gs)
+ {
+ 	return gs->code == GIMPLE_RETURN;
+@@ -765,6 +896,16 @@ static inline const gcall *as_a_const_gcall(const_gimple stmt)
+ 	return as_a<const gcall *>(stmt);
+ }
+ 
++static inline ggoto *as_a_ggoto(gimple stmt)
++{
++	return as_a<ggoto *>(stmt);
++}
++
++static inline const ggoto *as_a_const_ggoto(const_gimple stmt)
++{
++	return as_a<const ggoto *>(stmt);
++}
++
+ static inline gphi *as_a_gphi(gimple stmt)
+ {
+ 	return as_a<gphi *>(stmt);
+@@ -827,4 +968,9 @@ static inline void debug_gimple_stmt(const_gimple s)
+ #define debug_gimple_stmt(s) debug_gimple_stmt(CONST_CAST_GIMPLE(s))
+ #endif
+ 
++#if BUILDING_GCC_VERSION >= 7000
++#define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning)	\
++	get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep)
++#endif
++
+ #endif
 diff --git a/scripts/gcc-plugins/gcc-generate-gimple-pass.h b/scripts/gcc-plugins/gcc-generate-gimple-pass.h
 index 526c3c7..831300b 100644
 --- a/scripts/gcc-plugins/gcc-generate-gimple-pass.h
@@ -170236,12 +170438,12 @@ index 0000000..7514850
 +fi
 diff --git a/scripts/gcc-plugins/initify_plugin.c b/scripts/gcc-plugins/initify_plugin.c
 new file mode 100644
-index 0000000..46bd9b9
+index 0000000..07af312
 --- /dev/null
 +++ b/scripts/gcc-plugins/initify_plugin.c
-@@ -0,0 +1,1809 @@
+@@ -0,0 +1,1805 @@
 +/*
-+ * Copyright 2015-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2015-2017 by Emese Revfy <re.emese@gmail.com>
 + * Licensed under the GPL v2
 + *
 + * Homepage:
@@ -171918,7 +172120,7 @@ index 0000000..46bd9b9
 +	DECL_ATTRIBUTES(fndecl) = copy_list(DECL_ATTRIBUTES(fndecl));
 +
 +	section_name = NODE_SYMBOL(node)->aux == (void *)INIT ? ".init.text" : ".exit.text";
-+	section_str = build_string(strlen(section_name) + 1, section_name);
++	section_str = build_const_char_string(strlen(section_name) + 1, section_name);
 +	TREE_READONLY(section_str) = 1;
 +	TREE_STATIC(section_str) = 1;
 +	attr_args = build_tree_list(NULL_TREE, section_str);
@@ -171993,17 +172195,13 @@ index 0000000..46bd9b9
 +
 +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
 +{
-+	struct register_pass_info initify_info;
 +	int i;
 +	const int argc = plugin_info->argc;
 +	bool enabled = true;
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	const char * const plugin_name = plugin_info->base_name;
 +
-+	initify_info.pass				= make_initify_pass();
-+	initify_info.reference_pass_name		= "inline";
-+	initify_info.ref_pass_instance_number		= 1;
-+	initify_info.pos_op				= PASS_POS_INSERT_AFTER;
++	PASS_INFO(initify, "inline", 1, PASS_POS_INSERT_AFTER);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -172042,7 +172240,7 @@ index 0000000..46bd9b9
 +
 +	register_callback(plugin_name, PLUGIN_INFO, NULL, &initify_plugin_info);
 +	if (enabled) {
-+		register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &initify_info);
++		register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &initify_pass_info);
 +		register_callback(plugin_name, PLUGIN_START_UNIT, initify_start_unit, NULL);
 +	}
 +	register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL);
@@ -172051,12 +172249,12 @@ index 0000000..46bd9b9
 +}
 diff --git a/scripts/gcc-plugins/kallocstat_plugin.c b/scripts/gcc-plugins/kallocstat_plugin.c
 new file mode 100644
-index 0000000..3bd3089
+index 0000000..0a9214d
 --- /dev/null
 +++ b/scripts/gcc-plugins/kallocstat_plugin.c
-@@ -0,0 +1,135 @@
+@@ -0,0 +1,131 @@
 +/*
-+ * Copyright 2011-2016 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2
 + *
 + * Note: the choice of the license means that the compilation process is
@@ -172173,12 +172371,8 @@ index 0000000..3bd3089
 +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
 +{
 +	const char * const plugin_name = plugin_info->base_name;
-+	struct register_pass_info kallocstat_pass_info;
 +
-+	kallocstat_pass_info.pass			= make_kallocstat_pass();
-+	kallocstat_pass_info.reference_pass_name	= "ssa";
-+	kallocstat_pass_info.ref_pass_instance_number	= 1;
-+	kallocstat_pass_info.pos_op 			= PASS_POS_INSERT_AFTER;
++	PASS_INFO(kallocstat, "ssa", 1, PASS_POS_INSERT_AFTER);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -172192,12 +172386,12 @@ index 0000000..3bd3089
 +}
 diff --git a/scripts/gcc-plugins/kernexec_plugin.c b/scripts/gcc-plugins/kernexec_plugin.c
 new file mode 100644
-index 0000000..a213367
+index 0000000..9ac2ebb
 --- /dev/null
 +++ b/scripts/gcc-plugins/kernexec_plugin.c
-@@ -0,0 +1,407 @@
+@@ -0,0 +1,393 @@
 +/*
-+ * Copyright 2011-2016 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2
 + *
 + * Note: the choice of the license means that the compilation process is
@@ -172350,9 +172544,9 @@ index 0000000..a213367
 +	new_fptr = make_ssa_name(new_fptr, NULL);
 +
 +	// build asm volatile("orq %%r12, %0\n\t" : "=r"(new_fptr) : "0"(old_fptr));
-+	input = build_tree_list(NULL_TREE, build_string(2, "0"));
++	input = build_tree_list(NULL_TREE, build_const_char_string(2, "0"));
 +	input = chainon(NULL_TREE, build_tree_list(input, old_fptr));
-+	output = build_tree_list(NULL_TREE, build_string(3, "=r"));
++	output = build_tree_list(NULL_TREE, build_const_char_string(3, "=r"));
 +	output = chainon(NULL_TREE, build_tree_list(output, new_fptr));
 +#if BUILDING_GCC_VERSION <= 4007
 +	VEC_safe_push(tree, gc, inputs, input);
@@ -172545,24 +172739,10 @@ index 0000000..a213367
 +	const int argc = plugin_info->argc;
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	int i;
-+	struct register_pass_info kernexec_reload_pass_info;
-+	struct register_pass_info kernexec_fptr_pass_info;
-+	struct register_pass_info kernexec_retaddr_pass_info;
-+
-+	kernexec_reload_pass_info.pass				= make_kernexec_reload_pass();
-+	kernexec_reload_pass_info.reference_pass_name		= "early_optimizations";
-+	kernexec_reload_pass_info.ref_pass_instance_number	= 1;
-+	kernexec_reload_pass_info.pos_op 			= PASS_POS_INSERT_BEFORE;
 +
-+	kernexec_fptr_pass_info.pass				= make_kernexec_fptr_pass();
-+	kernexec_fptr_pass_info.reference_pass_name		= "early_optimizations";
-+	kernexec_fptr_pass_info.ref_pass_instance_number	= 1;
-+	kernexec_fptr_pass_info.pos_op 				= PASS_POS_INSERT_BEFORE;
-+
-+	kernexec_retaddr_pass_info.pass				= make_kernexec_retaddr_pass();
-+	kernexec_retaddr_pass_info.reference_pass_name		= "pro_and_epilogue";
-+	kernexec_retaddr_pass_info.ref_pass_instance_number	= 1;
-+	kernexec_retaddr_pass_info.pos_op 			= PASS_POS_INSERT_AFTER;
++	PASS_INFO(kernexec_reload, "early_optimizations", 1, PASS_POS_INSERT_BEFORE);
++	PASS_INFO(kernexec_fptr, "early_optimizations", 1, PASS_POS_INSERT_BEFORE);
++	PASS_INFO(kernexec_retaddr, "pro_and_epilogue", 1, PASS_POS_INSERT_AFTER);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -172605,12 +172785,12 @@ index 0000000..a213367
 +}
 diff --git a/scripts/gcc-plugins/latent_entropy_plugin.c b/scripts/gcc-plugins/latent_entropy_plugin.c
 new file mode 100644
-index 0000000..fc16dd7
+index 0000000..56b1ece
 --- /dev/null
 +++ b/scripts/gcc-plugins/latent_entropy_plugin.c
-@@ -0,0 +1,613 @@
+@@ -0,0 +1,609 @@
 +/*
-+ * Copyright 2012-2016 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2012-2017 by the PaX Team <pageexec@freemail.hu>
 + * Copyright 2016 by Emese Revfy <re.emese@gmail.com>
 + * Licensed under the GPL v2
 + *
@@ -173182,12 +173362,6 @@ index 0000000..fc16dd7
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	int i;
 +
-+	struct register_pass_info latent_entropy_pass_info;
-+
-+	latent_entropy_pass_info.pass				= make_latent_entropy_pass();
-+	latent_entropy_pass_info.reference_pass_name		= "optimized";
-+	latent_entropy_pass_info.ref_pass_instance_number	= 1;
-+	latent_entropy_pass_info.pos_op				= PASS_POS_INSERT_BEFORE;
 +	static const struct ggc_root_tab gt_ggc_r_gt_latent_entropy[] = {
 +		{
 +			.base = &latent_entropy_decl,
@@ -173199,6 +173373,8 @@ index 0000000..fc16dd7
 +		LAST_GGC_ROOT_TAB
 +	};
 +
++	PASS_INFO(latent_entropy, "optimized", 1, PASS_POS_INSERT_BEFORE);
++
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
 +		return 1;
@@ -174836,12 +175012,12 @@ index 0000000..161102f
 +}
 diff --git a/scripts/gcc-plugins/rap_plugin/rap_plugin.c b/scripts/gcc-plugins/rap_plugin/rap_plugin.c
 new file mode 100644
-index 0000000..e42b7e5
+index 0000000..8359861
 --- /dev/null
 +++ b/scripts/gcc-plugins/rap_plugin/rap_plugin.c
-@@ -0,0 +1,515 @@
+@@ -0,0 +1,505 @@
 +/*
-+ * Copyright 2012-2016 by PaX Team <pageexec@freemail.hu>
++ * Copyright 2012-2017 by PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2
 + *
 + * Homepage: http://pax.grsecurity.net/
@@ -174897,7 +175073,7 @@ index 0000000..e42b7e5
 +	if (!var && full) {
 +		tree clobber;
 +
-+		clobber = build_tree_list(NULL_TREE, build_string(7, "memory"));
++		clobber = build_tree_list(NULL_TREE, build_const_char_string(7, "memory"));
 +#if BUILDING_GCC_VERSION <= 4007
 +		VEC_safe_push(tree, gc, clobbers, clobber);
 +#else
@@ -174906,7 +175082,7 @@ index 0000000..e42b7e5
 +	} else if (full) {
 +		tree input, output;
 +
-+		input = build_tree_list(NULL_TREE, build_string(2, "0"));
++		input = build_tree_list(NULL_TREE, build_const_char_string(2, "0"));
 +		input = chainon(NULL_TREE, build_tree_list(input, var));
 +#if BUILDING_GCC_VERSION <= 4007
 +		VEC_safe_push(tree, gc, inputs, input);
@@ -174914,7 +175090,7 @@ index 0000000..e42b7e5
 +		vec_safe_push(inputs, input);
 +#endif
 +
-+		output = build_tree_list(NULL_TREE, build_string(4, "=rm"));
++		output = build_tree_list(NULL_TREE, build_const_char_string(4, "=rm"));
 +		gcc_assert(SSA_NAME_VAR(var));
 +		var = make_ssa_name(SSA_NAME_VAR(var), NULL);
 +		output = chainon(NULL_TREE, build_tree_list(output, var));
@@ -174926,7 +175102,7 @@ index 0000000..e42b7e5
 +	} else {
 +		tree input;
 +
-+		input = build_tree_list(NULL_TREE, build_string(3, "rm"));
++		input = build_tree_list(NULL_TREE, build_const_char_string(3, "rm"));
 +		input = chainon(NULL_TREE, build_tree_list(input, var));
 +#if BUILDING_GCC_VERSION <= 4007
 +		VEC_safe_push(tree, gc, inputs, input);
@@ -175229,18 +175405,8 @@ index 0000000..e42b7e5
 +	bool enable_call = false;
 +	bool enable_abs = false, enable_abs_finish = false;
 +
-+	struct register_pass_info rap_fptr_pass_info;
-+	struct register_pass_info rap_unignore_pass_info;
-+
-+	rap_fptr_pass_info.pass						= make_rap_fptr_pass();
-+	rap_fptr_pass_info.reference_pass_name				= "nrv";
-+	rap_fptr_pass_info.ref_pass_instance_number			= 1;
-+	rap_fptr_pass_info.pos_op 					= PASS_POS_INSERT_AFTER;
-+
-+	rap_unignore_pass_info.pass					= make_rap_unignore_pass();
-+	rap_unignore_pass_info.reference_pass_name			= "final";
-+	rap_unignore_pass_info.ref_pass_instance_number			= 1;
-+	rap_unignore_pass_info.pos_op 					= PASS_POS_INSERT_BEFORE;
++	PASS_INFO(rap_fptr, "nrv", 1, PASS_POS_INSERT_AFTER);
++	PASS_INFO(rap_unignore, "final", 1, PASS_POS_INSERT_BEFORE);
 +
 +	if (!rap_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -175458,9 +175624,16 @@ index 0000000..65bc1cd
 +	U64TO8_LE(out, b);
 +}
 diff --git a/scripts/gcc-plugins/sancov_plugin.c b/scripts/gcc-plugins/sancov_plugin.c
-index aedd611..7ea0b3f 100644
+index aedd611..72265dd 100644
 --- a/scripts/gcc-plugins/sancov_plugin.c
 +++ b/scripts/gcc-plugins/sancov_plugin.c
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2011-2017 by Emese Revfy <re.emese@gmail.com>
+  * Licensed under the GPL v2, or (at your option) v3
+  *
+  * Homepage:
 @@ -21,7 +21,7 @@
  
  #include "gcc-common.h"
@@ -175470,15 +175643,54 @@ index aedd611..7ea0b3f 100644
  
  tree sancov_fndecl;
  
-@@ -86,7 +86,7 @@ static void sancov_start_unit(void __unused *gcc_data, void __unused *user_data)
+@@ -62,6 +62,7 @@ static unsigned int sancov_execute(void)
+ 
+ #include "gcc-generate-gimple-pass.h"
+ 
++#if BUILDING_GCC_VERSION < 6000
+ static void sancov_start_unit(void __unused *gcc_data, void __unused *user_data)
+ {
+ 	tree leaf_attr, nothrow_attr;
+@@ -85,11 +86,11 @@ static void sancov_start_unit(void __unused *gcc_data, void __unused *user_data)
+ 	decl_attributes(&sancov_fndecl, leaf_attr, 0);
  #endif
  }
++#endif
  
 -int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
 +__visible int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
  {
  	int i;
- 	struct register_pass_info sancov_plugin_pass_info;
+-	struct register_pass_info sancov_plugin_pass_info;
+ 	const char * const plugin_name = plugin_info->base_name;
+ 	const int argc = plugin_info->argc;
+ 	const struct plugin_argument * const argv = plugin_info->argv;
+@@ -107,14 +108,11 @@ int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version
+ 	};
+ 
+ 	/* BBs can be split afterwards?? */
+-	sancov_plugin_pass_info.pass				= make_sancov_pass();
+ #if BUILDING_GCC_VERSION >= 4009
+-	sancov_plugin_pass_info.reference_pass_name		= "asan";
++	PASS_INFO(sancov, "asan", 0, PASS_POS_INSERT_BEFORE);
+ #else
+-	sancov_plugin_pass_info.reference_pass_name		= "nrv";
++	PASS_INFO(sancov, "nrv", 1, PASS_POS_INSERT_BEFORE);
+ #endif
+-	sancov_plugin_pass_info.ref_pass_instance_number	= 0;
+-	sancov_plugin_pass_info.pos_op				= PASS_POS_INSERT_BEFORE;
+ 
+ 	if (!plugin_default_version_check(version, &gcc_version)) {
+ 		error(G_("incompatible gcc/plugin versions"));
+@@ -137,7 +135,7 @@ int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version
+ #if BUILDING_GCC_VERSION < 6000
+ 	register_callback(plugin_name, PLUGIN_START_UNIT, &sancov_start_unit, NULL);
+ 	register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, (void *)&gt_ggc_r_gt_sancov);
+-	register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &sancov_plugin_pass_info);
++	register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &sancov_pass_info);
+ #endif
+ 
+ 	return 0;
 diff --git a/scripts/gcc-plugins/size_overflow_plugin/.gitignore b/scripts/gcc-plugins/size_overflow_plugin/.gitignore
 new file mode 100644
 index 0000000..36211fb
@@ -210251,12 +210463,12 @@ index 0000000..be9724d
 +exit 0
 diff --git a/scripts/gcc-plugins/size_overflow_plugin/insert_size_overflow_asm.c b/scripts/gcc-plugins/size_overflow_plugin/insert_size_overflow_asm.c
 new file mode 100644
-index 0000000..9fb6a1a
+index 0000000..d459e5f
 --- /dev/null
 +++ b/scripts/gcc-plugins/size_overflow_plugin/insert_size_overflow_asm.c
 @@ -0,0 +1,374 @@
 +/*
-+ * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2011-2017 by Emese Revfy <re.emese@gmail.com>
 + * Licensed under the GPL v2
 + *
 + * Homepage:
@@ -210377,9 +210589,9 @@ index 0000000..9fb6a1a
 +	mark_str = convert_mark_to_str(asm_data->intentional_mark);
 +	asm_comment = create_asm_comment(asm_data, mark_str);
 +
-+	str_input = build_string(2, "0");
++	str_input = build_const_char_string(2, "0");
 +	input = create_asm_io_list(str_input, asm_data->input);
-+	str_output = build_string(4, "=rm");
++	str_output = build_const_char_string(4, "=rm");
 +	output = create_asm_io_list(str_output, asm_data->output);
 +
 +	asm_stmt = as_a_gasm(gimple_build_asm_vec(asm_comment, input, output, NULL, NULL));
@@ -212509,12 +212721,12 @@ index 0000000..663b6c9
 +}
 diff --git a/scripts/gcc-plugins/size_overflow_plugin/size_overflow_ipa.c b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_ipa.c
 new file mode 100644
-index 0000000..34b9974
+index 0000000..1fe86f3
 --- /dev/null
 +++ b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_ipa.c
 @@ -0,0 +1,1333 @@
 +/*
-+ * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2011-2017 by Emese Revfy <re.emese@gmail.com>
 + * Licensed under the GPL v2
 + *
 + * Homepage:
@@ -214359,12 +214571,12 @@ index 0000000..b5291e1
 +
 diff --git a/scripts/gcc-plugins/size_overflow_plugin/size_overflow_plugin.c b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_plugin.c
 new file mode 100644
-index 0000000..df0c102
+index 0000000..4645a29
 --- /dev/null
 +++ b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_plugin.c
-@@ -0,0 +1,313 @@
+@@ -0,0 +1,299 @@
 +/*
-+ * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2011-2017 by Emese Revfy <re.emese@gmail.com>
 + * Licensed under the GPL v2
 + *
 + * Homepage:
@@ -214589,11 +214801,6 @@ index 0000000..df0c102
 +	const int argc = plugin_info->argc;
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	bool enable = true;
-+	struct register_pass_info insert_size_overflow_asm_pass_info;
-+	struct register_pass_info size_overflow_pass_info;
-+#if BUILDING_GCC_VERSION >= 4009
-+	struct register_pass_info disable_ubsan_si_overflow_pass_info;
-+#endif
 +
 +	static const struct ggc_root_tab gt_ggc_r_gt_size_overflow[] = {
 +		{
@@ -214606,15 +214813,11 @@ index 0000000..df0c102
 +		LAST_GGC_ROOT_TAB
 +	};
 +
-+	insert_size_overflow_asm_pass_info.pass				= make_insert_size_overflow_asm_pass();
-+	insert_size_overflow_asm_pass_info.reference_pass_name		= "ssa";
-+	insert_size_overflow_asm_pass_info.ref_pass_instance_number	= 1;
-+	insert_size_overflow_asm_pass_info.pos_op			= PASS_POS_INSERT_AFTER;
-+
-+	size_overflow_pass_info.pass			= make_size_overflow_pass();
-+	size_overflow_pass_info.reference_pass_name	= "inline";
-+	size_overflow_pass_info.ref_pass_instance_number	= 1;
-+	size_overflow_pass_info.pos_op			= PASS_POS_INSERT_AFTER;
++	PASS_INFO(insert_size_overflow_asm, "ssa", 1, PASS_POS_INSERT_AFTER);
++	PASS_INFO(size_overflow, "inline", 1, PASS_POS_INSERT_AFTER);
++#if BUILDING_GCC_VERSION >= 4009
++	PASS_INFO(disable_ubsan_si_overflow, "ubsan", 1, PASS_POS_REPLACE);
++#endif
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -214662,11 +214865,6 @@ index 0000000..df0c102
 +		register_callback(plugin_name, PLUGIN_REGISTER_GGC_ROOTS, NULL, (void *)&gt_ggc_r_gt_size_overflow);
 +#if BUILDING_GCC_VERSION >= 4009
 +		flag_sanitize |= SANITIZE_SI_OVERFLOW;
-+		disable_ubsan_si_overflow_pass_info.pass			= make_disable_ubsan_si_overflow_pass();
-+		disable_ubsan_si_overflow_pass_info.reference_pass_name		= "ubsan";
-+		disable_ubsan_si_overflow_pass_info.ref_pass_instance_number	= 1;
-+		disable_ubsan_si_overflow_pass_info.pos_op			= PASS_POS_REPLACE;
-+
 +		register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &disable_ubsan_si_overflow_pass_info);
 +#endif
 +		register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &insert_size_overflow_asm_pass_info);
@@ -215153,12 +215351,12 @@ index 0000000..67cacb9
 +
 diff --git a/scripts/gcc-plugins/size_overflow_plugin/size_overflow_transform.c b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_transform.c
 new file mode 100644
-index 0000000..620a44a
+index 0000000..e2cfd20
 --- /dev/null
 +++ b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_transform.c
 @@ -0,0 +1,772 @@
 +/*
-+ * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2011-2017 by Emese Revfy <re.emese@gmail.com>
 + * Licensed under the GPL v2
 + *
 + * Homepage:
@@ -215208,7 +215406,7 @@ index 0000000..620a44a
 +
 +	gcc_assert(is_size_overflow_insert_check_asm(stmt));
 +
-+	list = build_tree_list(NULL_TREE, build_string(3, "rm"));
++	list = build_tree_list(NULL_TREE, build_const_char_string(3, "rm"));
 +	list = chainon(NULL_TREE, build_tree_list(list, new_input));
 +	gimple_asm_set_input_op(stmt, 0, list);
 +}
@@ -215931,12 +216129,12 @@ index 0000000..620a44a
 +}
 diff --git a/scripts/gcc-plugins/size_overflow_plugin/size_overflow_transform_core.c b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_transform_core.c
 new file mode 100644
-index 0000000..69e3a85
+index 0000000..7b24aea
 --- /dev/null
 +++ b/scripts/gcc-plugins/size_overflow_plugin/size_overflow_transform_core.c
-@@ -0,0 +1,1025 @@
+@@ -0,0 +1,1013 @@
 +/*
-+ * Copyright 2011-2016 by Emese Revfy <re.emese@gmail.com>
++ * Copyright 2011-2017 by Emese Revfy <re.emese@gmail.com>
 + * Licensed under the GPL v2
 + *
 + * Homepage:
@@ -216365,18 +216563,6 @@ index 0000000..69e3a85
 +
 +static tree create_string_param(tree string)
 +{
-+	tree i_type, a_type;
-+	const int length = TREE_STRING_LENGTH(string);
-+
-+	gcc_assert(length > 0);
-+
-+	i_type = build_index_type(build_int_cst(NULL_TREE, length - 1));
-+	a_type = build_array_type(char_type_node, i_type);
-+
-+	TREE_TYPE(string) = a_type;
-+	TREE_CONSTANT(string) = 1;
-+	TREE_READONLY(string) = 1;
-+
 +	return build1(ADDR_EXPR, ptr_type_node, string);
 +}
 +
@@ -216414,17 +216600,17 @@ index 0000000..69e3a85
 +
 +	loc_line = build_int_cstu(unsigned_type_node, xloc.line);
 +
-+	loc_file = build_string(strlen(xloc.file) + 1, xloc.file);
++	loc_file = build_const_char_string(strlen(xloc.file) + 1, xloc.file);
 +	loc_file = create_string_param(loc_file);
 +
-+	current_func = build_string(DECL_NAME_LENGTH(current_function_decl) + 1, DECL_NAME_POINTER(current_function_decl));
++	current_func = build_const_char_string(DECL_NAME_LENGTH(current_function_decl) + 1, DECL_NAME_POINTER(current_function_decl));
 +	current_func = create_string_param(current_func);
 +
 +	gcc_assert(DECL_NAME(SSA_NAME_VAR(arg)) != NULL);
 +	call_count++;
 +	len = asprintf(&ssa_name_buf, "%s_%u %s, count: %u, decl: %s; num: %u; context: %s;\n", DECL_NAME_POINTER(SSA_NAME_VAR(arg)), SSA_NAME_VERSION(arg), min ? "min" : "max", call_count, expand_from->next_node->decl_name, expand_from->next_node->num, expand_from->next_node->context);
 +	gcc_assert(len > 0);
-+	ssa_name = build_string(len + 1, ssa_name_buf);
++	ssa_name = build_const_char_string(len + 1, ssa_name_buf);
 +	free(ssa_name_buf);
 +	ssa_name = create_string_param(ssa_name);
 +
@@ -216962,12 +217148,12 @@ index 0000000..69e3a85
 +}
 diff --git a/scripts/gcc-plugins/stackleak_plugin.c b/scripts/gcc-plugins/stackleak_plugin.c
 new file mode 100644
-index 0000000..d8d3a9e
+index 0000000..b70f0bc
 --- /dev/null
 +++ b/scripts/gcc-plugins/stackleak_plugin.c
-@@ -0,0 +1,350 @@
+@@ -0,0 +1,342 @@
 +/*
-+ * Copyright 2011-2016 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2
 + *
 + * Note: the choice of the license means that the compilation process is
@@ -217249,8 +217435,7 @@ index 0000000..d8d3a9e
 +	const int argc = plugin_info->argc;
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	int i;
-+	struct register_pass_info stackleak_tree_instrument_pass_info;
-+	struct register_pass_info stackleak_final_pass_info;
++
 +	static const struct ggc_root_tab gt_ggc_r_gt_stackleak[] = {
 +		{
 +			.base = &track_function_decl,
@@ -217269,16 +217454,9 @@ index 0000000..d8d3a9e
 +		LAST_GGC_ROOT_TAB
 +	};
 +
-+	stackleak_tree_instrument_pass_info.pass			= make_stackleak_tree_instrument_pass();
-+//	stackleak_tree_instrument_pass_info.reference_pass_name		= "tree_profile";
-+	stackleak_tree_instrument_pass_info.reference_pass_name		= "optimized";
-+	stackleak_tree_instrument_pass_info.ref_pass_instance_number	= 1;
-+	stackleak_tree_instrument_pass_info.pos_op 			= PASS_POS_INSERT_BEFORE;
-+
-+	stackleak_final_pass_info.pass				= make_stackleak_final_pass();
-+	stackleak_final_pass_info.reference_pass_name		= "final";
-+	stackleak_final_pass_info.ref_pass_instance_number	= 1;
-+	stackleak_final_pass_info.pos_op 			= PASS_POS_INSERT_BEFORE;
++//	PASS_INFO(stackleak_tree_instrument, "tree_profile", 1, PASS_POS_INSERT_BEFORE);
++	PASS_INFO(stackleak_tree_instrument, "optimized", 1, PASS_POS_INSERT_BEFORE);
++	PASS_INFO(stackleak_final, "final", 1, PASS_POS_INSERT_BEFORE);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));
@@ -217318,12 +217496,12 @@ index 0000000..d8d3a9e
 +}
 diff --git a/scripts/gcc-plugins/structleak_plugin.c b/scripts/gcc-plugins/structleak_plugin.c
 new file mode 100644
-index 0000000..583faac
+index 0000000..0afee93
 --- /dev/null
 +++ b/scripts/gcc-plugins/structleak_plugin.c
-@@ -0,0 +1,239 @@
+@@ -0,0 +1,235 @@
 +/*
-+ * Copyright 2013-2016 by PaX Team <pageexec@freemail.hu>
++ * Copyright 2013-2017 by PaX Team <pageexec@freemail.hu>
 + * Licensed under the GPL v2
 + *
 + * Note: the choice of the license means that the compilation process is
@@ -217527,12 +217705,8 @@ index 0000000..583faac
 +	const int argc = plugin_info->argc;
 +	const struct plugin_argument * const argv = plugin_info->argv;
 +	bool enable = true;
-+	struct register_pass_info structleak_pass_info;
 +
-+	structleak_pass_info.pass			= make_structleak_pass();
-+	structleak_pass_info.reference_pass_name	= "early_optimizations";
-+	structleak_pass_info.ref_pass_instance_number	= 1;
-+	structleak_pass_info.pos_op			= PASS_POS_INSERT_BEFORE;
++	PASS_INFO(structleak, "early_optimizations", 1, PASS_POS_INSERT_BEFORE);
 +
 +	if (!plugin_default_version_check(version, &gcc_version)) {
 +		error(G_("incompatible gcc/plugin versions"));


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-01-05 13:52 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-05 13:51 [gentoo-commits] proj/hardened-patchset:master commit in: 4.8.15/ Anthony G. Basile
  -- strict thread matches above, loose matches on Subject: below --
2017-01-01 19:58 Anthony G. Basile

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox