diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arc/include/asm/mach_desc.h linux-libre-4.9.124-gnu/arch/arc/include/asm/mach_desc.h
--- linux-libre-4.9.123-gnu/arch/arc/include/asm/mach_desc.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arc/include/asm/mach_desc.h	2018-08-24 07:12:43.000000000 -0400
@@ -34,9 +34,7 @@ struct machine_desc {
 	const char		*name;
 	const char		**dt_compat;
 	void			(*init_early)(void);
-#ifdef CONFIG_SMP
 	void			(*init_per_cpu)(unsigned int);
-#endif
 	void			(*init_machine)(void);
 	void			(*init_late)(void);
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arc/kernel/irq.c linux-libre-4.9.124-gnu/arch/arc/kernel/irq.c
--- linux-libre-4.9.123-gnu/arch/arc/kernel/irq.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arc/kernel/irq.c	2018-08-24 07:12:43.000000000 -0400
@@ -31,10 +31,10 @@ void __init init_IRQ(void)
 	/* a SMP H/w block could do IPI IRQ request here */
 	if (plat_smp_ops.init_per_cpu)
 		plat_smp_ops.init_per_cpu(smp_processor_id());
+#endif
 
 	if (machine_desc->init_per_cpu)
 		machine_desc->init_per_cpu(smp_processor_id());
-#endif
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arc/kernel/process.c linux-libre-4.9.124-gnu/arch/arc/kernel/process.c
--- linux-libre-4.9.123-gnu/arch/arc/kernel/process.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arc/kernel/process.c	2018-08-24 07:12:43.000000000 -0400
@@ -44,7 +44,8 @@ SYSCALL_DEFINE0(arc_gettls)
 SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
 {
 	struct pt_regs *regs = current_pt_regs();
-	int uval = -EFAULT;
+	u32 uval;
+	int ret;
 
 	/*
 	 * This is only for old cores lacking LLOCK/SCOND, which by defintion
@@ -57,23 +58,47 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *,
 	/* Z indicates to userspace if operation succeded */
 	regs->status32 &= ~STATUS_Z_MASK;
 
-	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
-		return -EFAULT;
+	ret = access_ok(VERIFY_WRITE, uaddr, sizeof(*uaddr));
+	if (!ret)
+		 goto fail;
 
+again:
 	preempt_disable();
 
-	if (__get_user(uval, uaddr))
-		goto done;
+	ret = __get_user(uval, uaddr);
+	if (ret)
+		 goto fault;
 
-	if (uval == expected) {
-		if (!__put_user(new, uaddr))
-			regs->status32 |= STATUS_Z_MASK;
-	}
+	if (uval != expected)
+		 goto out;
 
-done:
-	preempt_enable();
+	ret = __put_user(new, uaddr);
+	if (ret)
+		 goto fault;
+
+	regs->status32 |= STATUS_Z_MASK;
 
+out:
+	preempt_enable();
 	return uval;
+
+fault:
+	preempt_enable();
+
+	if (unlikely(ret != -EFAULT))
+		 goto fail;
+
+	down_read(&current->mm->mmap_sem);
+	ret = fixup_user_fault(current, current->mm, (unsigned long) uaddr,
+			       FAULT_FLAG_WRITE, NULL);
+	up_read(&current->mm->mmap_sem);
+
+	if (likely(!ret))
+		 goto again;
+
+fail:
+	force_sig(SIGSEGV, current);
+	return ret;
 }
 
 void arch_cpu_idle(void)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arc/Makefile linux-libre-4.9.124-gnu/arch/arc/Makefile
--- linux-libre-4.9.123-gnu/arch/arc/Makefile	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arc/Makefile	2018-08-24 07:12:43.000000000 -0400
@@ -18,7 +18,7 @@ endif
 
 KBUILD_DEFCONFIG := nsim_700_defconfig
 
-cflags-y	+= -fno-common -pipe -fno-builtin -D__linux__
+cflags-y	+= -fno-common -pipe -fno-builtin -mmedium-calls -D__linux__
 cflags-$(CONFIG_ISA_ARCOMPACT)	+= -mA7
 cflags-$(CONFIG_ISA_ARCV2)	+= -mcpu=archs
 
@@ -141,16 +141,3 @@ dtbs: scripts
 
 archclean:
 	$(Q)$(MAKE) $(clean)=$(boot)
-
-# Hacks to enable final link due to absence of link-time branch relexation
-# and gcc choosing optimal(shorter) branches at -O3
-#
-# vineetg Feb 2010: -mlong-calls switched off for overall kernel build
-# However lib/decompress_inflate.o (.init.text) calls
-# zlib_inflate_workspacesize (.text) causing relocation errors.
-# Thus forcing all exten calls in this file to be long calls
-export CFLAGS_decompress_inflate.o = -mmedium-calls
-export CFLAGS_initramfs.o = -mmedium-calls
-ifdef CONFIG_SMP
-export CFLAGS_core.o = -mmedium-calls
-endif
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/boot/dts/am3517.dtsi linux-libre-4.9.124-gnu/arch/arm/boot/dts/am3517.dtsi
--- linux-libre-4.9.123-gnu/arch/arm/boot/dts/am3517.dtsi	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/boot/dts/am3517.dtsi	2018-08-24 07:12:43.000000000 -0400
@@ -74,6 +74,11 @@
 	};
 };
 
+/* Table Table 5-79 of the TRM shows 480ab000 is reserved */
+&usb_otg_hs {
+	status = "disabled";
+};
+
 &iva {
 	status = "disabled";
 };
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/boot/dts/am437x-sk-evm.dts linux-libre-4.9.124-gnu/arch/arm/boot/dts/am437x-sk-evm.dts
--- linux-libre-4.9.123-gnu/arch/arm/boot/dts/am437x-sk-evm.dts	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/boot/dts/am437x-sk-evm.dts	2018-08-24 07:12:43.000000000 -0400
@@ -533,6 +533,8 @@
 
 		touchscreen-size-x = <480>;
 		touchscreen-size-y = <272>;
+
+		wakeup-source;
 	};
 
 	tlv320aic3106: tlv320aic3106@1b {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/boot/dts/bcm-cygnus.dtsi linux-libre-4.9.124-gnu/arch/arm/boot/dts/bcm-cygnus.dtsi
--- linux-libre-4.9.123-gnu/arch/arm/boot/dts/bcm-cygnus.dtsi	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/boot/dts/bcm-cygnus.dtsi	2018-08-24 07:12:43.000000000 -0400
@@ -128,7 +128,7 @@
 			reg = <0x18008000 0x100>;
 			#address-cells = <1>;
 			#size-cells = <0>;
-			interrupts = <GIC_SPI 85 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
 			clock-frequency = <100000>;
 			status = "disabled";
 		};
@@ -157,7 +157,7 @@
 			reg = <0x1800b000 0x100>;
 			#address-cells = <1>;
 			#size-cells = <0>;
-			interrupts = <GIC_SPI 86 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
 			clock-frequency = <100000>;
 			status = "disabled";
 		};
@@ -168,7 +168,7 @@
 
 			#interrupt-cells = <1>;
 			interrupt-map-mask = <0 0 0 0>;
-			interrupt-map = <0 0 0 0 &gic GIC_SPI 100 IRQ_TYPE_NONE>;
+			interrupt-map = <0 0 0 0 &gic GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
 
 			linux,pci-domain = <0>;
 
@@ -190,10 +190,10 @@
 				compatible = "brcm,iproc-msi";
 				msi-controller;
 				interrupt-parent = <&gic>;
-				interrupts = <GIC_SPI 96 IRQ_TYPE_NONE>,
-					     <GIC_SPI 97 IRQ_TYPE_NONE>,
-					     <GIC_SPI 98 IRQ_TYPE_NONE>,
-					     <GIC_SPI 99 IRQ_TYPE_NONE>;
+				interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>,
+					     <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>,
+					     <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>,
+					     <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
 			};
 		};
 
@@ -203,7 +203,7 @@
 
 			#interrupt-cells = <1>;
 			interrupt-map-mask = <0 0 0 0>;
-			interrupt-map = <0 0 0 0 &gic GIC_SPI 106 IRQ_TYPE_NONE>;
+			interrupt-map = <0 0 0 0 &gic GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
 
 			linux,pci-domain = <1>;
 
@@ -225,10 +225,10 @@
 				compatible = "brcm,iproc-msi";
 				msi-controller;
 				interrupt-parent = <&gic>;
-				interrupts = <GIC_SPI 102 IRQ_TYPE_NONE>,
-					     <GIC_SPI 103 IRQ_TYPE_NONE>,
-					     <GIC_SPI 104 IRQ_TYPE_NONE>,
-					     <GIC_SPI 105 IRQ_TYPE_NONE>;
+				interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>,
+					     <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>,
+					     <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
+					     <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
 			};
 		};
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/boot/dts/bcm-nsp.dtsi linux-libre-4.9.124-gnu/arch/arm/boot/dts/bcm-nsp.dtsi
--- linux-libre-4.9.123-gnu/arch/arm/boot/dts/bcm-nsp.dtsi	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/boot/dts/bcm-nsp.dtsi	2018-08-24 07:12:43.000000000 -0400
@@ -288,7 +288,7 @@
 			reg = <0x38000 0x50>;
 			#address-cells = <1>;
 			#size-cells = <0>;
-			interrupts = <GIC_SPI 89 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
 			clock-frequency = <100000>;
 		};
 
@@ -375,7 +375,7 @@
 
 		#interrupt-cells = <1>;
 		interrupt-map-mask = <0 0 0 0>;
-		interrupt-map = <0 0 0 0 &gic GIC_SPI 131 IRQ_TYPE_NONE>;
+		interrupt-map = <0 0 0 0 &gic GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
 
 		linux,pci-domain = <0>;
 
@@ -397,10 +397,10 @@
 			compatible = "brcm,iproc-msi";
 			msi-controller;
 			interrupt-parent = <&gic>;
-			interrupts = <GIC_SPI 127 IRQ_TYPE_NONE>,
-				     <GIC_SPI 128 IRQ_TYPE_NONE>,
-				     <GIC_SPI 129 IRQ_TYPE_NONE>,
-				     <GIC_SPI 130 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>;
 			brcm,pcie-msi-inten;
 		};
 	};
@@ -411,7 +411,7 @@
 
 		#interrupt-cells = <1>;
 		interrupt-map-mask = <0 0 0 0>;
-		interrupt-map = <0 0 0 0 &gic GIC_SPI 137 IRQ_TYPE_NONE>;
+		interrupt-map = <0 0 0 0 &gic GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>;
 
 		linux,pci-domain = <1>;
 
@@ -433,10 +433,10 @@
 			compatible = "brcm,iproc-msi";
 			msi-controller;
 			interrupt-parent = <&gic>;
-			interrupts = <GIC_SPI 133 IRQ_TYPE_NONE>,
-				     <GIC_SPI 134 IRQ_TYPE_NONE>,
-				     <GIC_SPI 135 IRQ_TYPE_NONE>,
-				     <GIC_SPI 136 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
 			brcm,pcie-msi-inten;
 		};
 	};
@@ -447,7 +447,7 @@
 
 		#interrupt-cells = <1>;
 		interrupt-map-mask = <0 0 0 0>;
-		interrupt-map = <0 0 0 0 &gic GIC_SPI 143 IRQ_TYPE_NONE>;
+		interrupt-map = <0 0 0 0 &gic GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
 
 		linux,pci-domain = <2>;
 
@@ -469,10 +469,10 @@
 			compatible = "brcm,iproc-msi";
 			msi-controller;
 			interrupt-parent = <&gic>;
-			interrupts = <GIC_SPI 139 IRQ_TYPE_NONE>,
-				     <GIC_SPI 140 IRQ_TYPE_NONE>,
-				     <GIC_SPI 141 IRQ_TYPE_NONE>,
-				     <GIC_SPI 142 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
+				     <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>;
 			brcm,pcie-msi-inten;
 		};
 	};
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/boot/dts/da850.dtsi linux-libre-4.9.124-gnu/arch/arm/boot/dts/da850.dtsi
--- linux-libre-4.9.123-gnu/arch/arm/boot/dts/da850.dtsi	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/boot/dts/da850.dtsi	2018-08-24 07:12:43.000000000 -0400
@@ -377,11 +377,7 @@
 			gpio-controller;
 			#gpio-cells = <2>;
 			reg = <0x226000 0x1000>;
-			interrupts = <42 IRQ_TYPE_EDGE_BOTH
-				43 IRQ_TYPE_EDGE_BOTH 44 IRQ_TYPE_EDGE_BOTH
-				45 IRQ_TYPE_EDGE_BOTH 46 IRQ_TYPE_EDGE_BOTH
-				47 IRQ_TYPE_EDGE_BOTH 48 IRQ_TYPE_EDGE_BOTH
-				49 IRQ_TYPE_EDGE_BOTH 50 IRQ_TYPE_EDGE_BOTH>;
+			interrupts = <42 43 44 45 46 47 48 49 50>;
 			ti,ngpio = <144>;
 			ti,davinci-gpio-unbanked = <0>;
 			status = "disabled";
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/configs/imx_v4_v5_defconfig linux-libre-4.9.124-gnu/arch/arm/configs/imx_v4_v5_defconfig
--- linux-libre-4.9.123-gnu/arch/arm/configs/imx_v4_v5_defconfig	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/configs/imx_v4_v5_defconfig	2018-08-24 07:12:43.000000000 -0400
@@ -145,9 +145,11 @@ CONFIG_USB_STORAGE=y
 CONFIG_USB_CHIPIDEA=y
 CONFIG_USB_CHIPIDEA_UDC=y
 CONFIG_USB_CHIPIDEA_HOST=y
+CONFIG_USB_CHIPIDEA_ULPI=y
 CONFIG_NOP_USB_XCEIV=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_ETH=m
+CONFIG_USB_ULPI_BUS=y
 CONFIG_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_PLTFM=y
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/configs/imx_v6_v7_defconfig linux-libre-4.9.124-gnu/arch/arm/configs/imx_v6_v7_defconfig
--- linux-libre-4.9.123-gnu/arch/arm/configs/imx_v6_v7_defconfig	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/configs/imx_v6_v7_defconfig	2018-08-24 07:12:43.000000000 -0400
@@ -271,6 +271,7 @@ CONFIG_USB_STORAGE=y
 CONFIG_USB_CHIPIDEA=y
 CONFIG_USB_CHIPIDEA_UDC=y
 CONFIG_USB_CHIPIDEA_HOST=y
+CONFIG_USB_CHIPIDEA_ULPI=y
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
 CONFIG_USB_SERIAL_FTDI_SIO=m
@@ -307,6 +308,7 @@ CONFIG_USB_GADGETFS=m
 CONFIG_USB_FUNCTIONFS=m
 CONFIG_USB_MASS_STORAGE=m
 CONFIG_USB_G_SERIAL=m
+CONFIG_USB_ULPI_BUS=y
 CONFIG_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_PLTFM=y
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/mach-omap2/omap-smp.c linux-libre-4.9.124-gnu/arch/arm/mach-omap2/omap-smp.c
--- linux-libre-4.9.123-gnu/arch/arm/mach-omap2/omap-smp.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/mach-omap2/omap-smp.c	2018-08-24 07:12:43.000000000 -0400
@@ -104,6 +104,45 @@ void omap5_erratum_workaround_801819(voi
 static inline void omap5_erratum_workaround_801819(void) { }
 #endif
 
+#ifdef CONFIG_HARDEN_BRANCH_PREDICTOR
+/*
+ * Configure ACR and enable ACTLR[0] (Enable invalidates of BTB with
+ * ICIALLU) to activate the workaround for secondary Core.
+ * NOTE: it is assumed that the primary core's configuration is done
+ * by the boot loader (kernel will detect a misconfiguration and complain
+ * if this is not done).
+ *
+ * In General Purpose(GP) devices, ACR bit settings can only be done
+ * by ROM code in "secure world" using the smc call and there is no
+ * option to update the "firmware" on such devices. This also works for
+ * High security(HS) devices, as a backup option in case the
+ * "update" is not done in the "security firmware".
+ */
+static void omap5_secondary_harden_predictor(void)
+{
+	u32 acr, acr_mask;
+
+	asm volatile ("mrc p15, 0, %0, c1, c0, 1" : "=r" (acr));
+
+	/*
+	 * ACTLR[0] (Enable invalidates of BTB with ICIALLU)
+	 */
+	acr_mask = BIT(0);
+
+	/* Do we already have it done.. if yes, skip expensive smc */
+	if ((acr & acr_mask) == acr_mask)
+		return;
+
+	acr |= acr_mask;
+	omap_smc1(OMAP5_DRA7_MON_SET_ACR_INDEX, acr);
+
+	pr_debug("%s: ARM ACR setup for CVE_2017_5715 applied on CPU%d\n",
+		 __func__, smp_processor_id());
+}
+#else
+static inline void omap5_secondary_harden_predictor(void) { }
+#endif
+
 static void omap4_secondary_init(unsigned int cpu)
 {
 	/*
@@ -126,6 +165,8 @@ static void omap4_secondary_init(unsigne
 		set_cntfreq();
 		/* Configure ACR to disable streaming WA for 801819 */
 		omap5_erratum_workaround_801819();
+		/* Enable ACR to allow for ICUALLU workaround */
+		omap5_secondary_harden_predictor();
 	}
 
 	/*
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/mach-pxa/irq.c linux-libre-4.9.124-gnu/arch/arm/mach-pxa/irq.c
--- linux-libre-4.9.123-gnu/arch/arm/mach-pxa/irq.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/mach-pxa/irq.c	2018-08-24 07:12:43.000000000 -0400
@@ -185,7 +185,7 @@ static int pxa_irq_suspend(void)
 {
 	int i;
 
-	for (i = 0; i < pxa_internal_irq_nr / 32; i++) {
+	for (i = 0; i < DIV_ROUND_UP(pxa_internal_irq_nr, 32); i++) {
 		void __iomem *base = irq_base(i);
 
 		saved_icmr[i] = __raw_readl(base + ICMR);
@@ -204,7 +204,7 @@ static void pxa_irq_resume(void)
 {
 	int i;
 
-	for (i = 0; i < pxa_internal_irq_nr / 32; i++) {
+	for (i = 0; i < DIV_ROUND_UP(pxa_internal_irq_nr, 32); i++) {
 		void __iomem *base = irq_base(i);
 
 		__raw_writel(saved_icmr[i], base + ICMR);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm/mm/init.c linux-libre-4.9.124-gnu/arch/arm/mm/init.c
--- linux-libre-4.9.123-gnu/arch/arm/mm/init.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm/mm/init.c	2018-08-24 07:12:43.000000000 -0400
@@ -722,19 +722,28 @@ int __mark_rodata_ro(void *unused)
 	return 0;
 }
 
+static int kernel_set_to_readonly __read_mostly;
+
 void mark_rodata_ro(void)
 {
+	kernel_set_to_readonly = 1;
 	stop_machine(__mark_rodata_ro, NULL, NULL);
 }
 
 void set_kernel_text_rw(void)
 {
+	if (!kernel_set_to_readonly)
+		return;
+
 	set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), false,
 				current->active_mm);
 }
 
 void set_kernel_text_ro(void)
 {
+	if (!kernel_set_to_readonly)
+		return;
+
 	set_section_perms(ro_perms, ARRAY_SIZE(ro_perms), true,
 				current->active_mm);
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm64/boot/dts/broadcom/ns2.dtsi linux-libre-4.9.124-gnu/arch/arm64/boot/dts/broadcom/ns2.dtsi
--- linux-libre-4.9.123-gnu/arch/arm64/boot/dts/broadcom/ns2.dtsi	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm64/boot/dts/broadcom/ns2.dtsi	2018-08-24 07:12:43.000000000 -0400
@@ -393,7 +393,7 @@
 			reg = <0x66080000 0x100>;
 			#address-cells = <1>;
 			#size-cells = <0>;
-			interrupts = <GIC_SPI 394 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 394 IRQ_TYPE_LEVEL_HIGH>;
 			clock-frequency = <100000>;
 			status = "disabled";
 		};
@@ -421,7 +421,7 @@
 			reg = <0x660b0000 0x100>;
 			#address-cells = <1>;
 			#size-cells = <0>;
-			interrupts = <GIC_SPI 395 IRQ_TYPE_NONE>;
+			interrupts = <GIC_SPI 395 IRQ_TYPE_LEVEL_HIGH>;
 			clock-frequency = <100000>;
 			status = "disabled";
 		};
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/arm64/kernel/smp.c linux-libre-4.9.124-gnu/arch/arm64/kernel/smp.c
--- linux-libre-4.9.123-gnu/arch/arm64/kernel/smp.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/arm64/kernel/smp.c	2018-08-24 07:12:43.000000000 -0400
@@ -205,7 +205,7 @@ int __cpu_up(unsigned int cpu, struct ta
  * This is the secondary CPU boot entry.  We're using this CPUs
  * idle thread stack, but a set of temporary page tables.
  */
-asmlinkage void secondary_start_kernel(void)
+asmlinkage notrace void secondary_start_kernel(void)
 {
 	struct mm_struct *mm = &init_mm;
 	unsigned int cpu = smp_processor_id();
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/m68k/include/asm/mcf_pgalloc.h linux-libre-4.9.124-gnu/arch/m68k/include/asm/mcf_pgalloc.h
--- linux-libre-4.9.123-gnu/arch/m68k/include/asm/mcf_pgalloc.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/m68k/include/asm/mcf_pgalloc.h	2018-08-24 07:12:43.000000000 -0400
@@ -43,6 +43,7 @@ extern inline pmd_t *pmd_alloc_kernel(pg
 static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page,
 				  unsigned long address)
 {
+	pgtable_page_dtor(page);
 	__free_page(page);
 }
 
@@ -73,8 +74,9 @@ static inline struct page *pte_alloc_one
 	return page;
 }
 
-extern inline void pte_free(struct mm_struct *mm, struct page *page)
+static inline void pte_free(struct mm_struct *mm, struct page *page)
 {
+	pgtable_page_dtor(page);
 	__free_page(page);
 }
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/parisc/include/asm/spinlock.h linux-libre-4.9.124-gnu/arch/parisc/include/asm/spinlock.h
--- linux-libre-4.9.123-gnu/arch/parisc/include/asm/spinlock.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/parisc/include/asm/spinlock.h	2018-08-24 07:12:43.000000000 -0400
@@ -26,7 +26,6 @@ static inline void arch_spin_lock_flags(
 {
 	volatile unsigned int *a;
 
-	mb();
 	a = __ldcw_align(x);
 	while (__ldcw(a) == 0)
 		while (*a == 0)
@@ -36,16 +35,15 @@ static inline void arch_spin_lock_flags(
 				local_irq_disable();
 			} else
 				cpu_relax();
-	mb();
 }
 
 static inline void arch_spin_unlock(arch_spinlock_t *x)
 {
 	volatile unsigned int *a;
-	mb();
+
 	a = __ldcw_align(x);
-	*a = 1;
 	mb();
+	*a = 1;
 }
 
 static inline int arch_spin_trylock(arch_spinlock_t *x)
@@ -53,10 +51,8 @@ static inline int arch_spin_trylock(arch
 	volatile unsigned int *a;
 	int ret;
 
-	mb();
 	a = __ldcw_align(x);
         ret = __ldcw(a) != 0;
-	mb();
 
 	return ret;
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/parisc/kernel/syscall.S linux-libre-4.9.124-gnu/arch/parisc/kernel/syscall.S
--- linux-libre-4.9.123-gnu/arch/parisc/kernel/syscall.S	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/parisc/kernel/syscall.S	2018-08-24 07:12:43.000000000 -0400
@@ -629,12 +629,12 @@ cas_action:
 	stw	%r1, 4(%sr2,%r20)
 #endif
 	/* The load and store could fail */
-1:	ldw,ma	0(%r26), %r28
+1:	ldw	0(%r26), %r28
 	sub,<>	%r28, %r25, %r0
-2:	stw,ma	%r24, 0(%r26)
+2:	stw	%r24, 0(%r26)
 	/* Free lock */
 	sync
-	stw,ma	%r20, 0(%sr2,%r20)
+	stw	%r20, 0(%sr2,%r20)
 #if ENABLE_LWS_DEBUG
 	/* Clear thread register indicator */
 	stw	%r0, 4(%sr2,%r20)
@@ -798,30 +798,30 @@ cas2_action:
 	ldo	1(%r0),%r28
 
 	/* 8bit CAS */
-13:	ldb,ma	0(%r26), %r29
+13:	ldb	0(%r26), %r29
 	sub,=	%r29, %r25, %r0
 	b,n	cas2_end
-14:	stb,ma	%r24, 0(%r26)
+14:	stb	%r24, 0(%r26)
 	b	cas2_end
 	copy	%r0, %r28
 	nop
 	nop
 
 	/* 16bit CAS */
-15:	ldh,ma	0(%r26), %r29
+15:	ldh	0(%r26), %r29
 	sub,=	%r29, %r25, %r0
 	b,n	cas2_end
-16:	sth,ma	%r24, 0(%r26)
+16:	sth	%r24, 0(%r26)
 	b	cas2_end
 	copy	%r0, %r28
 	nop
 	nop
 
 	/* 32bit CAS */
-17:	ldw,ma	0(%r26), %r29
+17:	ldw	0(%r26), %r29
 	sub,=	%r29, %r25, %r0
 	b,n	cas2_end
-18:	stw,ma	%r24, 0(%r26)
+18:	stw	%r24, 0(%r26)
 	b	cas2_end
 	copy	%r0, %r28
 	nop
@@ -829,10 +829,10 @@ cas2_action:
 
 	/* 64bit CAS */
 #ifdef CONFIG_64BIT
-19:	ldd,ma	0(%r26), %r29
+19:	ldd	0(%r26), %r29
 	sub,*=	%r29, %r25, %r0
 	b,n	cas2_end
-20:	std,ma	%r24, 0(%r26)
+20:	std	%r24, 0(%r26)
 	copy	%r0, %r28
 #else
 	/* Compare first word */
@@ -851,7 +851,7 @@ cas2_action:
 cas2_end:
 	/* Free lock */
 	sync
-	stw,ma	%r20, 0(%sr2,%r20)
+	stw	%r20, 0(%sr2,%r20)
 	/* Enable interrupts */
 	ssm	PSW_SM_I, %r0
 	/* Return to userspace, set no error */
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/s390/net/bpf_jit_comp.c linux-libre-4.9.124-gnu/arch/s390/net/bpf_jit_comp.c
--- linux-libre-4.9.123-gnu/arch/s390/net/bpf_jit_comp.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/s390/net/bpf_jit_comp.c	2018-08-24 07:12:43.000000000 -0400
@@ -1386,6 +1386,7 @@ struct bpf_prog *bpf_int_jit_compile(str
 		goto free_addrs;
 	}
 	if (bpf_jit_prog(&jit, fp)) {
+		bpf_jit_binary_free(header);
 		fp = orig_fp;
 		goto free_addrs;
 	}
diff -druNp --no-dereference linux-libre-4.9.123-gnu/arch/x86/entry/entry_64.S linux-libre-4.9.124-gnu/arch/x86/entry/entry_64.S
--- linux-libre-4.9.123-gnu/arch/x86/entry/entry_64.S	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/arch/x86/entry/entry_64.S	2018-08-24 07:12:43.000000000 -0400
@@ -774,7 +774,7 @@ ENTRY(\sym)
 
 	call	\do_sym
 
-	jmp	error_exit			/* %ebx: no swapgs flag */
+	jmp	error_exit
 	.endif
 END(\sym)
 .endm
@@ -1043,7 +1043,6 @@ END(paranoid_exit)
 
 /*
  * Save all registers in pt_regs, and switch gs if needed.
- * Return: EBX=0: came from user mode; EBX=1: otherwise
  */
 ENTRY(error_entry)
 	cld
@@ -1056,7 +1055,6 @@ ENTRY(error_entry)
 	 * the kernel CR3 here.
 	 */
 	SWITCH_KERNEL_CR3
-	xorl	%ebx, %ebx
 	testb	$3, CS+8(%rsp)
 	jz	.Lerror_kernelspace
 
@@ -1087,7 +1085,6 @@ ENTRY(error_entry)
 	 * for these here too.
 	 */
 .Lerror_kernelspace:
-	incl	%ebx
 	leaq	native_irq_return_iret(%rip), %rcx
 	cmpq	%rcx, RIP+8(%rsp)
 	je	.Lerror_bad_iret
@@ -1119,28 +1116,19 @@ ENTRY(error_entry)
 
 	/*
 	 * Pretend that the exception came from user mode: set up pt_regs
-	 * as if we faulted immediately after IRET and clear EBX so that
-	 * error_exit knows that we will be returning to user mode.
+	 * as if we faulted immediately after IRET.
 	 */
 	mov	%rsp, %rdi
 	call	fixup_bad_iret
 	mov	%rax, %rsp
-	decl	%ebx
 	jmp	.Lerror_entry_from_usermode_after_swapgs
 END(error_entry)
 
-
-/*
- * On entry, EBX is a "return to kernel mode" flag:
- *   1: already in kernel mode, don't need SWAPGS
- *   0: user gsbase is loaded, we need SWAPGS and standard preparation for return to usermode
- */
 ENTRY(error_exit)
-	movl	%ebx, %eax
 	DISABLE_INTERRUPTS(CLBR_NONE)
 	TRACE_IRQS_OFF
-	testl	%eax, %eax
-	jnz	retint_kernel
+	testb	$3, CS(%rsp)
+	jz	retint_kernel
 	jmp	retint_user
 END(error_exit)
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/acpi/nfit/core.c linux-libre-4.9.124-gnu/drivers/acpi/nfit/core.c
--- linux-libre-4.9.123-gnu/drivers/acpi/nfit/core.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/acpi/nfit/core.c	2018-08-24 07:12:43.000000000 -0400
@@ -201,6 +201,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_desc
 	const u8 *uuid;
 	int rc, i;
 
+	if (cmd_rc)
+		*cmd_rc = -EINVAL;
 	func = cmd;
 	if (cmd == ND_CMD_CALL) {
 		call_pkg = buf;
@@ -288,6 +290,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_desc
 		 * If we return an error (like elsewhere) then caller wouldn't
 		 * be able to rely upon data returned to make calculation.
 		 */
+		if (cmd_rc)
+			*cmd_rc = 0;
 		return 0;
 	}
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/ata/libahci.c linux-libre-4.9.124-gnu/drivers/ata/libahci.c
--- linux-libre-4.9.123-gnu/drivers/ata/libahci.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/ata/libahci.c	2018-08-24 07:12:43.000000000 -0400
@@ -35,6 +35,7 @@
 #include <linux/kernel.h>
 #include <linux/gfp.h>
 #include <linux/module.h>
+#include <linux/nospec.h>
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
@@ -1124,10 +1125,12 @@ static ssize_t ahci_led_store(struct ata
 
 	/* get the slot number from the message */
 	pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8;
-	if (pmp < EM_MAX_SLOTS)
+	if (pmp < EM_MAX_SLOTS) {
+		pmp = array_index_nospec(pmp, EM_MAX_SLOTS);
 		emp = &pp->em_priv[pmp];
-	else
+	} else {
 		return -EINVAL;
+	}
 
 	/* mask off the activity bits if we are in sw_activity
 	 * mode, user should turn off sw_activity before setting
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/dma/k3dma.c linux-libre-4.9.124-gnu/drivers/dma/k3dma.c
--- linux-libre-4.9.123-gnu/drivers/dma/k3dma.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/dma/k3dma.c	2018-08-24 07:12:43.000000000 -0400
@@ -792,7 +792,7 @@ static struct dma_chan *k3_of_dma_simple
 	struct k3_dma_dev *d = ofdma->of_dma_data;
 	unsigned int request = dma_spec->args[0];
 
-	if (request > d->dma_requests)
+	if (request >= d->dma_requests)
 		return NULL;
 
 	return dma_get_slave_channel(&(d->chans[request].vc.chan));
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/dma/pl330.c linux-libre-4.9.124-gnu/drivers/dma/pl330.c
--- linux-libre-4.9.123-gnu/drivers/dma/pl330.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/dma/pl330.c	2018-08-24 07:12:43.000000000 -0400
@@ -2951,7 +2951,7 @@ pl330_probe(struct amba_device *adev, co
 	pd->src_addr_widths = PL330_DMA_BUSWIDTHS;
 	pd->dst_addr_widths = PL330_DMA_BUSWIDTHS;
 	pd->directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
-	pd->residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT;
+	pd->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
 	pd->max_burst = ((pl330->quirks & PL330_QUIRK_BROKEN_NO_FLUSHP) ?
 			 1 : PL330_MAX_BURST);
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/gpu/drm/arm/malidp_hw.c linux-libre-4.9.124-gnu/drivers/gpu/drm/arm/malidp_hw.c
--- linux-libre-4.9.123-gnu/drivers/gpu/drm/arm/malidp_hw.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/gpu/drm/arm/malidp_hw.c	2018-08-24 07:12:43.000000000 -0400
@@ -432,7 +432,8 @@ const struct malidp_hw_device malidp_dev
 				.vsync_irq = MALIDP500_DE_IRQ_VSYNC,
 			},
 			.se_irq_map = {
-				.irq_mask = MALIDP500_SE_IRQ_CONF_MODE,
+				.irq_mask = MALIDP500_SE_IRQ_CONF_MODE |
+					    MALIDP500_SE_IRQ_GLOBAL,
 				.vsync_irq = 0,
 			},
 			.dc_irq_map = {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/gpu/drm/armada/armada_hw.h linux-libre-4.9.124-gnu/drivers/gpu/drm/armada/armada_hw.h
--- linux-libre-4.9.123-gnu/drivers/gpu/drm/armada/armada_hw.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/gpu/drm/armada/armada_hw.h	2018-08-24 07:12:43.000000000 -0400
@@ -160,6 +160,7 @@ enum {
 	CFG_ALPHAM_GRA		= 0x1 << 16,
 	CFG_ALPHAM_CFG		= 0x2 << 16,
 	CFG_ALPHA_MASK		= 0xff << 8,
+#define CFG_ALPHA(x)		((x) << 8)
 	CFG_PIXCMD_MASK		= 0xff,
 };
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/gpu/drm/armada/armada_overlay.c linux-libre-4.9.124-gnu/drivers/gpu/drm/armada/armada_overlay.c
--- linux-libre-4.9.123-gnu/drivers/gpu/drm/armada/armada_overlay.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/gpu/drm/armada/armada_overlay.c	2018-08-24 07:12:43.000000000 -0400
@@ -27,6 +27,7 @@ struct armada_ovl_plane_properties {
 	uint16_t contrast;
 	uint16_t saturation;
 	uint32_t colorkey_mode;
+	uint32_t colorkey_enable;
 };
 
 struct armada_ovl_plane {
@@ -62,11 +63,13 @@ armada_ovl_update_attr(struct armada_ovl
 	writel_relaxed(0x00002000, dcrtc->base + LCD_SPU_CBSH_HUE);
 
 	spin_lock_irq(&dcrtc->irq_lock);
-	armada_updatel(prop->colorkey_mode | CFG_ALPHAM_GRA,
-		     CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK,
-		     dcrtc->base + LCD_SPU_DMA_CTRL1);
-
-	armada_updatel(ADV_GRACOLORKEY, 0, dcrtc->base + LCD_SPU_ADV_REG);
+	armada_updatel(prop->colorkey_mode,
+		       CFG_CKMODE_MASK | CFG_ALPHAM_MASK | CFG_ALPHA_MASK,
+		       dcrtc->base + LCD_SPU_DMA_CTRL1);
+	if (dcrtc->variant->has_spu_adv_reg)
+		armada_updatel(prop->colorkey_enable,
+			       ADV_GRACOLORKEY | ADV_VIDCOLORKEY,
+			       dcrtc->base + LCD_SPU_ADV_REG);
 	spin_unlock_irq(&dcrtc->irq_lock);
 }
 
@@ -340,8 +343,17 @@ static int armada_ovl_plane_set_property
 		dplane->prop.colorkey_vb |= K2B(val);
 		update_attr = true;
 	} else if (property == priv->colorkey_mode_prop) {
-		dplane->prop.colorkey_mode &= ~CFG_CKMODE_MASK;
-		dplane->prop.colorkey_mode |= CFG_CKMODE(val);
+		if (val == CKMODE_DISABLE) {
+			dplane->prop.colorkey_mode =
+				CFG_CKMODE(CKMODE_DISABLE) |
+				CFG_ALPHAM_CFG | CFG_ALPHA(255);
+			dplane->prop.colorkey_enable = 0;
+		} else {
+			dplane->prop.colorkey_mode =
+				CFG_CKMODE(val) |
+				CFG_ALPHAM_GRA | CFG_ALPHA(0);
+			dplane->prop.colorkey_enable = ADV_GRACOLORKEY;
+		}
 		update_attr = true;
 	} else if (property == priv->brightness_prop) {
 		dplane->prop.brightness = val - 256;
@@ -470,7 +482,9 @@ int armada_overlay_plane_create(struct d
 	dplane->prop.colorkey_yr = 0xfefefe00;
 	dplane->prop.colorkey_ug = 0x01010100;
 	dplane->prop.colorkey_vb = 0x01010100;
-	dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB);
+	dplane->prop.colorkey_mode = CFG_CKMODE(CKMODE_RGB) |
+				     CFG_ALPHAM_GRA | CFG_ALPHA(0);
+	dplane->prop.colorkey_enable = ADV_GRACOLORKEY;
 	dplane->prop.brightness = 0;
 	dplane->prop.contrast = 0x4000;
 	dplane->prop.saturation = 0x4000;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/gpu/drm/exynos/exynos5433_drm_decon.c linux-libre-4.9.124-gnu/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
--- linux-libre-4.9.123-gnu/drivers/gpu/drm/exynos/exynos5433_drm_decon.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/gpu/drm/exynos/exynos5433_drm_decon.c	2018-08-24 07:12:43.000000000 -0400
@@ -199,7 +199,7 @@ static void decon_win_set_pixfmt(struct
 	unsigned long val;
 
 	val = readl(ctx->addr + DECON_WINCONx(win));
-	val &= ~WINCONx_BPPMODE_MASK;
+	val &= WINCONx_ENWIN_F;
 
 	switch (fb->pixel_format) {
 	case DRM_FORMAT_XRGB1555:
@@ -291,8 +291,8 @@ static void decon_update_plane(struct ex
 		COORDINATE_Y(state->crtc.y + state->crtc.h - 1);
 	writel(val, ctx->addr + DECON_VIDOSDxB(win));
 
-	val = VIDOSD_Wx_ALPHA_R_F(0x0) | VIDOSD_Wx_ALPHA_G_F(0x0) |
-		VIDOSD_Wx_ALPHA_B_F(0x0);
+	val = VIDOSD_Wx_ALPHA_R_F(0xff) | VIDOSD_Wx_ALPHA_G_F(0xff) |
+		VIDOSD_Wx_ALPHA_B_F(0xff);
 	writel(val, ctx->addr + DECON_VIDOSDxC(win));
 
 	val = VIDOSD_Wx_ALPHA_R_F(0x0) | VIDOSD_Wx_ALPHA_G_F(0x0) |
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/gpu/drm/exynos/exynos_drm_gsc.c linux-libre-4.9.124-gnu/drivers/gpu/drm/exynos/exynos_drm_gsc.c
--- linux-libre-4.9.123-gnu/drivers/gpu/drm/exynos/exynos_drm_gsc.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/gpu/drm/exynos/exynos_drm_gsc.c	2018-08-24 07:12:43.000000000 -0400
@@ -532,21 +532,25 @@ static int gsc_src_set_fmt(struct device
 			GSC_IN_CHROMA_ORDER_CRCB);
 		break;
 	case DRM_FORMAT_NV21:
+		cfg |= (GSC_IN_CHROMA_ORDER_CRCB | GSC_IN_YUV420_2P);
+		break;
 	case DRM_FORMAT_NV61:
-		cfg |= (GSC_IN_CHROMA_ORDER_CRCB |
-			GSC_IN_YUV420_2P);
+		cfg |= (GSC_IN_CHROMA_ORDER_CRCB | GSC_IN_YUV422_2P);
 		break;
 	case DRM_FORMAT_YUV422:
 		cfg |= GSC_IN_YUV422_3P;
 		break;
 	case DRM_FORMAT_YUV420:
+		cfg |= (GSC_IN_CHROMA_ORDER_CBCR | GSC_IN_YUV420_3P);
+		break;
 	case DRM_FORMAT_YVU420:
-		cfg |= GSC_IN_YUV420_3P;
+		cfg |= (GSC_IN_CHROMA_ORDER_CRCB | GSC_IN_YUV420_3P);
 		break;
 	case DRM_FORMAT_NV12:
+		cfg |= (GSC_IN_CHROMA_ORDER_CBCR | GSC_IN_YUV420_2P);
+		break;
 	case DRM_FORMAT_NV16:
-		cfg |= (GSC_IN_CHROMA_ORDER_CBCR |
-			GSC_IN_YUV420_2P);
+		cfg |= (GSC_IN_CHROMA_ORDER_CBCR | GSC_IN_YUV422_2P);
 		break;
 	default:
 		dev_err(ippdrv->dev, "invalid target yuv order 0x%x.\n", fmt);
@@ -806,18 +810,25 @@ static int gsc_dst_set_fmt(struct device
 			GSC_OUT_CHROMA_ORDER_CRCB);
 		break;
 	case DRM_FORMAT_NV21:
-	case DRM_FORMAT_NV61:
 		cfg |= (GSC_OUT_CHROMA_ORDER_CRCB | GSC_OUT_YUV420_2P);
 		break;
+	case DRM_FORMAT_NV61:
+		cfg |= (GSC_OUT_CHROMA_ORDER_CRCB | GSC_OUT_YUV422_2P);
+		break;
 	case DRM_FORMAT_YUV422:
+		cfg |= GSC_OUT_YUV422_3P;
+		break;
 	case DRM_FORMAT_YUV420:
+		cfg |= (GSC_OUT_CHROMA_ORDER_CBCR | GSC_OUT_YUV420_3P);
+		break;
 	case DRM_FORMAT_YVU420:
-		cfg |= GSC_OUT_YUV420_3P;
+		cfg |= (GSC_OUT_CHROMA_ORDER_CRCB | GSC_OUT_YUV420_3P);
 		break;
 	case DRM_FORMAT_NV12:
+		cfg |= (GSC_OUT_CHROMA_ORDER_CBCR | GSC_OUT_YUV420_2P);
+		break;
 	case DRM_FORMAT_NV16:
-		cfg |= (GSC_OUT_CHROMA_ORDER_CBCR |
-			GSC_OUT_YUV420_2P);
+		cfg |= (GSC_OUT_CHROMA_ORDER_CBCR | GSC_OUT_YUV422_2P);
 		break;
 	default:
 		dev_err(ippdrv->dev, "invalid target yuv order 0x%x.\n", fmt);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/gpu/drm/exynos/regs-gsc.h linux-libre-4.9.124-gnu/drivers/gpu/drm/exynos/regs-gsc.h
--- linux-libre-4.9.123-gnu/drivers/gpu/drm/exynos/regs-gsc.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/gpu/drm/exynos/regs-gsc.h	2018-08-24 07:12:43.000000000 -0400
@@ -138,6 +138,7 @@
 #define GSC_OUT_YUV420_3P		(3 << 4)
 #define GSC_OUT_YUV422_1P		(4 << 4)
 #define GSC_OUT_YUV422_2P		(5 << 4)
+#define GSC_OUT_YUV422_3P		(6 << 4)
 #define GSC_OUT_YUV444			(7 << 4)
 #define GSC_OUT_TILE_TYPE_MASK		(1 << 2)
 #define GSC_OUT_TILE_C_16x8		(0 << 2)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/gpu/drm/nouveau/nouveau_gem.c linux-libre-4.9.124-gnu/drivers/gpu/drm/nouveau/nouveau_gem.c
--- linux-libre-4.9.123-gnu/drivers/gpu/drm/nouveau/nouveau_gem.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/gpu/drm/nouveau/nouveau_gem.c	2018-08-24 07:12:43.000000000 -0400
@@ -601,7 +601,7 @@ nouveau_gem_pushbuf_reloc_apply(struct n
 		struct nouveau_bo *nvbo;
 		uint32_t data;
 
-		if (unlikely(r->bo_index > req->nr_buffers)) {
+		if (unlikely(r->bo_index >= req->nr_buffers)) {
 			NV_PRINTK(err, cli, "reloc bo index invalid\n");
 			ret = -EINVAL;
 			break;
@@ -611,7 +611,7 @@ nouveau_gem_pushbuf_reloc_apply(struct n
 		if (b->presumed.valid)
 			continue;
 
-		if (unlikely(r->reloc_bo_index > req->nr_buffers)) {
+		if (unlikely(r->reloc_bo_index >= req->nr_buffers)) {
 			NV_PRINTK(err, cli, "reloc container bo index invalid\n");
 			ret = -EINVAL;
 			break;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/hid/wacom_wac.c linux-libre-4.9.124-gnu/drivers/hid/wacom_wac.c
--- linux-libre-4.9.123-gnu/drivers/hid/wacom_wac.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/hid/wacom_wac.c	2018-08-24 07:12:43.000000000 -0400
@@ -2429,8 +2429,14 @@ void wacom_setup_device_quirks(struct wa
 			if (features->type >= INTUOSHT && features->type <= BAMBOO_PT)
 				features->device_type |= WACOM_DEVICETYPE_PAD;
 
-			features->x_max = 4096;
-			features->y_max = 4096;
+			if (features->type == INTUOSHT2) {
+				features->x_max = features->x_max / 10;
+				features->y_max = features->y_max / 10;
+			}
+			else {
+				features->x_max = 4096;
+				features->y_max = 4096;
+			}
 		}
 		else if (features->pktlen == WACOM_PKGLEN_BBTOUCH) {
 			features->device_type |= WACOM_DEVICETYPE_PAD;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/i2c/busses/i2c-imx.c linux-libre-4.9.124-gnu/drivers/i2c/busses/i2c-imx.c
--- linux-libre-4.9.123-gnu/drivers/i2c/busses/i2c-imx.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/i2c/busses/i2c-imx.c	2018-08-24 07:12:43.000000000 -0400
@@ -665,9 +665,6 @@ static int i2c_imx_dma_read(struct imx_i
 	struct imx_i2c_dma *dma = i2c_imx->dma;
 	struct device *dev = &i2c_imx->adapter.dev;
 
-	temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
-	temp |= I2CR_DMAEN;
-	imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
 
 	dma->chan_using = dma->chan_rx;
 	dma->dma_transfer_dir = DMA_DEV_TO_MEM;
@@ -780,6 +777,7 @@ static int i2c_imx_read(struct imx_i2c_s
 	int i, result;
 	unsigned int temp;
 	int block_data = msgs->flags & I2C_M_RECV_LEN;
+	int use_dma = i2c_imx->dma && msgs->len >= DMA_THRESHOLD && !block_data;
 
 	dev_dbg(&i2c_imx->adapter.dev,
 		"<%s> write slave address: addr=0x%x\n",
@@ -806,12 +804,14 @@ static int i2c_imx_read(struct imx_i2c_s
 	 */
 	if ((msgs->len - 1) || block_data)
 		temp &= ~I2CR_TXAK;
+	if (use_dma)
+		temp |= I2CR_DMAEN;
 	imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
 	imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); /* dummy read */
 
 	dev_dbg(&i2c_imx->adapter.dev, "<%s> read data\n", __func__);
 
-	if (i2c_imx->dma && msgs->len >= DMA_THRESHOLD && !block_data)
+	if (use_dma)
 		return i2c_imx_dma_read(i2c_imx, msgs, is_lastmsg);
 
 	/* read data */
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/iio/pressure/bmp280-core.c linux-libre-4.9.124-gnu/drivers/iio/pressure/bmp280-core.c
--- linux-libre-4.9.123-gnu/drivers/iio/pressure/bmp280-core.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/iio/pressure/bmp280-core.c	2018-08-24 07:12:43.000000000 -0400
@@ -347,10 +347,9 @@ static int bmp280_read_humid(struct bmp2
 	adc_humidity = be16_to_cpu(tmp);
 	comp_humidity = bmp280_compensate_humidity(data, adc_humidity);
 
-	*val = comp_humidity;
-	*val2 = 1024;
+	*val = comp_humidity * 1000 / 1024;
 
-	return IIO_VAL_FRACTIONAL;
+	return IIO_VAL_INT;
 }
 
 static int bmp280_read_raw(struct iio_dev *indio_dev,
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/infiniband/hw/mlx5/srq.c linux-libre-4.9.124-gnu/drivers/infiniband/hw/mlx5/srq.c
--- linux-libre-4.9.123-gnu/drivers/infiniband/hw/mlx5/srq.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/infiniband/hw/mlx5/srq.c	2018-08-24 07:12:43.000000000 -0400
@@ -268,18 +268,24 @@ struct ib_srq *mlx5_ib_create_srq(struct
 
 	desc_size = sizeof(struct mlx5_wqe_srq_next_seg) +
 		    srq->msrq.max_gs * sizeof(struct mlx5_wqe_data_seg);
-	if (desc_size == 0 || srq->msrq.max_gs > desc_size)
-		return ERR_PTR(-EINVAL);
+	if (desc_size == 0 || srq->msrq.max_gs > desc_size) {
+		err = -EINVAL;
+		goto err_srq;
+	}
 	desc_size = roundup_pow_of_two(desc_size);
 	desc_size = max_t(size_t, 32, desc_size);
-	if (desc_size < sizeof(struct mlx5_wqe_srq_next_seg))
-		return ERR_PTR(-EINVAL);
+	if (desc_size < sizeof(struct mlx5_wqe_srq_next_seg)) {
+		err = -EINVAL;
+		goto err_srq;
+	}
 	srq->msrq.max_avail_gather = (desc_size - sizeof(struct mlx5_wqe_srq_next_seg)) /
 		sizeof(struct mlx5_wqe_data_seg);
 	srq->msrq.wqe_shift = ilog2(desc_size);
 	buf_size = srq->msrq.max * desc_size;
-	if (buf_size < desc_size)
-		return ERR_PTR(-EINVAL);
+	if (buf_size < desc_size) {
+		err = -EINVAL;
+		goto err_srq;
+	}
 	in.type = init_attr->srq_type;
 
 	if (pd->uobject)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/infiniband/sw/rxe/rxe_req.c linux-libre-4.9.124-gnu/drivers/infiniband/sw/rxe/rxe_req.c
--- linux-libre-4.9.123-gnu/drivers/infiniband/sw/rxe/rxe_req.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/infiniband/sw/rxe/rxe_req.c	2018-08-24 07:12:43.000000000 -0400
@@ -648,6 +648,9 @@ next_wqe:
 		} else {
 			goto exit;
 		}
+		if ((wqe->wr.send_flags & IB_SEND_SIGNALED) ||
+		    qp->sq_sig_type == IB_SIGNAL_ALL_WR)
+			rxe_run_task(&qp->comp.task, 1);
 		qp->req.wqe_index = next_index(qp->sq.queue,
 						qp->req.wqe_index);
 		goto next_wqe;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/md/raid10.c linux-libre-4.9.124-gnu/drivers/md/raid10.c
--- linux-libre-4.9.123-gnu/drivers/md/raid10.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/md/raid10.c	2018-08-24 07:12:43.000000000 -0400
@@ -3734,6 +3734,13 @@ static int raid10_run(struct mddev *mdde
 			    disk->rdev->saved_raid_disk < 0)
 				conf->fullsync = 1;
 		}
+
+		if (disk->replacement &&
+		    !test_bit(In_sync, &disk->replacement->flags) &&
+		    disk->replacement->saved_raid_disk < 0) {
+			conf->fullsync = 1;
+		}
+
 		disk->recovery_disabled = mddev->recovery_disabled - 1;
 	}
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c	2018-08-22 10:28:28.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c	2018-08-24 11:03:44.000000000 -0400
@@ -1265,6 +1265,11 @@ void __bnx2x_link_report(struct bnx2x *b
 {
 	struct bnx2x_link_report_data cur_data;
 
+	if (bp->force_link_down) {
+		bp->link_vars.link_up = 0;
+		return;
+	}
+
 	/* reread mf_cfg */
 	if (IS_PF(bp) && !CHIP_IS_E1(bp))
 		bnx2x_read_mf_cfg(bp);
@@ -2821,6 +2826,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int
 		bp->pending_max = 0;
 	}
 
+	bp->force_link_down = false;
 	if (bp->port.pmf) {
 		rc = bnx2x_initial_phy_init(bp, load_mode);
 		if (rc)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h	2018-08-24 07:12:43.000000000 -0400
@@ -1529,6 +1529,7 @@ struct bnx2x {
 	struct link_vars	link_vars;
 	u32			link_cnt;
 	struct bnx2x_link_report_data last_reported_link;
+	bool			force_link_down;
 
 	struct mdio_if_info	mdio;
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c	2018-08-22 10:28:28.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c	2018-08-24 11:03:44.000000000 -0400
@@ -10273,6 +10273,12 @@ static void bnx2x_sp_rtnl_task(struct wo
 		bp->sp_rtnl_state = 0;
 		smp_mb();
 
+		/* Immediately indicate link as down */
+		bp->link_vars.link_up = 0;
+		bp->force_link_down = true;
+		netif_carrier_off(bp->dev);
+		BNX2X_ERR("Indicating link is down due to Tx-timeout\n");
+
 		bnx2x_nic_unload(bp, UNLOAD_NORMAL, true);
 		bnx2x_nic_load(bp, LOAD_NORMAL);
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2018-08-24 07:12:43.000000000 -0400
@@ -5560,7 +5560,7 @@ static int __bnxt_open_nic(struct bnxt *
 		rc = bnxt_request_irq(bp);
 		if (rc) {
 			netdev_err(bp->dev, "bnxt_request_irq err: %x\n", rc);
-			goto open_err;
+			goto open_err_irq;
 		}
 	}
 
@@ -5593,6 +5593,8 @@ static int __bnxt_open_nic(struct bnxt *
 
 open_err:
 	bnxt_disable_napi(bp);
+
+open_err_irq:
 	bnxt_del_napi(bp);
 
 open_err_free_mem:
@@ -6862,11 +6864,11 @@ int bnxt_get_max_rings(struct bnxt *bp,
 	int rx, tx, cp;
 
 	_bnxt_get_max_rings(bp, &rx, &tx, &cp);
+	*max_rx = rx;
+	*max_tx = tx;
 	if (!rx || !tx || !cp)
 		return -ENOMEM;
 
-	*max_rx = rx;
-	*max_tx = tx;
 	return bnxt_trim_rings(bp, max_rx, max_tx, cp, shared);
 }
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c linux-libre-4.9.124-gnu/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c	2018-08-22 10:28:56.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c	2018-08-24 11:04:10.000000000 -0400
@@ -272,7 +272,7 @@ static void dcb_tx_queue_prio_enable(str
 				"Can't %s DCB Priority on port %d, TX Queue %d: err=%d\n",
 				enable ? "set" : "unset", pi->port_id, i, -err);
 		else
-			txq->dcb_prio = value;
+			txq->dcb_prio = enable ? value : 0;
 	}
 }
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/cisco/enic/enic_clsf.c linux-libre-4.9.124-gnu/drivers/net/ethernet/cisco/enic/enic_clsf.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/cisco/enic/enic_clsf.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/cisco/enic/enic_clsf.c	2018-08-24 07:12:43.000000000 -0400
@@ -78,7 +78,6 @@ void enic_rfs_flw_tbl_init(struct enic *
 	enic->rfs_h.max = enic->config.num_arfs;
 	enic->rfs_h.free = enic->rfs_h.max;
 	enic->rfs_h.toclean = 0;
-	enic_rfs_timer_start(enic);
 }
 
 void enic_rfs_flw_tbl_free(struct enic *enic)
@@ -87,7 +86,6 @@ void enic_rfs_flw_tbl_free(struct enic *
 
 	enic_rfs_timer_stop(enic);
 	spin_lock_bh(&enic->rfs_h.lock);
-	enic->rfs_h.free = 0;
 	for (i = 0; i < (1 << ENIC_RFS_FLW_BITSHIFT); i++) {
 		struct hlist_head *hhead;
 		struct hlist_node *tmp;
@@ -98,6 +96,7 @@ void enic_rfs_flw_tbl_free(struct enic *
 			enic_delfltr(enic, n->fltr_id);
 			hlist_del(&n->node);
 			kfree(n);
+			enic->rfs_h.free++;
 		}
 	}
 	spin_unlock_bh(&enic->rfs_h.lock);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/cisco/enic/enic_main.c linux-libre-4.9.124-gnu/drivers/net/ethernet/cisco/enic/enic_main.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/cisco/enic/enic_main.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/cisco/enic/enic_main.c	2018-08-24 07:12:43.000000000 -0400
@@ -1760,7 +1760,7 @@ static int enic_open(struct net_device *
 		vnic_intr_unmask(&enic->intr[i]);
 
 	enic_notify_timer_start(enic);
-	enic_rfs_flw_tbl_init(enic);
+	enic_rfs_timer_start(enic);
 
 	return 0;
 
@@ -2692,6 +2692,7 @@ static int enic_probe(struct pci_dev *pd
 	enic->notify_timer.function = enic_notify_timer;
 	enic->notify_timer.data = (unsigned long)enic;
 
+	enic_rfs_flw_tbl_init(enic);
 	enic_set_rx_coal_setting(enic);
 	INIT_WORK(&enic->reset, enic_reset);
 	INIT_WORK(&enic->tx_hang_reset, enic_tx_hang_reset);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c linux-libre-4.9.124-gnu/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c	2018-08-24 07:12:43.000000000 -0400
@@ -1847,7 +1847,12 @@ s32 ixgbe_set_rar_generic(struct ixgbe_h
 	if (enable_addr != 0)
 		rar_high |= IXGBE_RAH_AV;
 
+	/* Record lower 32 bits of MAC address and then make
+	 * sure that write is flushed to hardware before writing
+	 * the upper 16 bits and setting the valid bit.
+	 */
 	IXGBE_WRITE_REG(hw, IXGBE_RAL(index), rar_low);
+	IXGBE_WRITE_FLUSH(hw);
 	IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
 
 	return 0;
@@ -1879,8 +1884,13 @@ s32 ixgbe_clear_rar_generic(struct ixgbe
 	rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
 	rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV);
 
-	IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0);
+	/* Clear the address valid bit and upper 16 bits of the address
+	 * before clearing the lower bits. This way we aren't updating
+	 * a live filter.
+	 */
 	IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
+	IXGBE_WRITE_FLUSH(hw);
+	IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0);
 
 	/* clear VMDq pool/queue selection for this RAR */
 	hw->mac.ops.clear_vmdq(hw, index, IXGBE_CLEAR_VMDQ_ALL);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/qlogic/qed/qed_main.c linux-libre-4.9.124-gnu/drivers/net/ethernet/qlogic/qed/qed_main.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/qlogic/qed/qed_main.c	2018-08-22 10:29:19.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/qlogic/qed/qed_main.c	2018-08-24 11:04:41.000000000 -0400
@@ -502,8 +502,16 @@ static irqreturn_t qed_single_int(int ir
 		/* Fastpath interrupts */
 		for (j = 0; j < 64; j++) {
 			if ((0x2ULL << j) & status) {
-				hwfn->simd_proto_handler[j].func(
-					hwfn->simd_proto_handler[j].token);
+				struct qed_simd_fp_handler *p_handler =
+					&hwfn->simd_proto_handler[j];
+
+				if (p_handler->func)
+					p_handler->func(p_handler->token);
+				else
+					DP_NOTICE(hwfn,
+						  "Not calling fastpath handler as it is NULL [handler #%d, status 0x%llx]\n",
+						  j, status);
+
 				status &= ~(0x2ULL << j);
 				rc = IRQ_HANDLED;
 			}
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c linux-libre-4.9.124-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c	2018-08-24 07:12:43.000000000 -0400
@@ -1128,6 +1128,8 @@ static ssize_t qlcnic_83xx_sysfs_flash_w
 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
 
 	ret = kstrtoul(buf, 16, &data);
+	if (ret)
+		return ret;
 
 	switch (data) {
 	case QLC_83XX_FLASH_SECTOR_ERASE_CMD:
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/qualcomm/qca_spi.c linux-libre-4.9.124-gnu/drivers/net/ethernet/qualcomm/qca_spi.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/qualcomm/qca_spi.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/qualcomm/qca_spi.c	2018-08-24 07:12:43.000000000 -0400
@@ -635,7 +635,7 @@ qcaspi_netdev_open(struct net_device *de
 		return ret;
 	}
 
-	netif_start_queue(qca->net_dev);
+	/* SPI thread takes care of TX queue */
 
 	return 0;
 }
@@ -739,6 +739,9 @@ qcaspi_netdev_tx_timeout(struct net_devi
 	qca->net_dev->stats.tx_errors++;
 	/* Trigger tx queue flush and QCA7000 reset */
 	qca->sync = QCASPI_SYNC_UNKNOWN;
+
+	if (qca->spi_thread)
+		wake_up_process(qca->spi_thread);
 }
 
 static int
@@ -865,22 +868,22 @@ qca_spi_probe(struct spi_device *spi)
 
 	if ((qcaspi_clkspeed < QCASPI_CLK_SPEED_MIN) ||
 	    (qcaspi_clkspeed > QCASPI_CLK_SPEED_MAX)) {
-		dev_info(&spi->dev, "Invalid clkspeed: %d\n",
-			 qcaspi_clkspeed);
+		dev_err(&spi->dev, "Invalid clkspeed: %d\n",
+			qcaspi_clkspeed);
 		return -EINVAL;
 	}
 
 	if ((qcaspi_burst_len < QCASPI_BURST_LEN_MIN) ||
 	    (qcaspi_burst_len > QCASPI_BURST_LEN_MAX)) {
-		dev_info(&spi->dev, "Invalid burst len: %d\n",
-			 qcaspi_burst_len);
+		dev_err(&spi->dev, "Invalid burst len: %d\n",
+			qcaspi_burst_len);
 		return -EINVAL;
 	}
 
 	if ((qcaspi_pluggable < QCASPI_PLUGGABLE_MIN) ||
 	    (qcaspi_pluggable > QCASPI_PLUGGABLE_MAX)) {
-		dev_info(&spi->dev, "Invalid pluggable: %d\n",
-			 qcaspi_pluggable);
+		dev_err(&spi->dev, "Invalid pluggable: %d\n",
+			qcaspi_pluggable);
 		return -EINVAL;
 	}
 
@@ -941,8 +944,8 @@ qca_spi_probe(struct spi_device *spi)
 	}
 
 	if (register_netdev(qcaspi_devs)) {
-		dev_info(&spi->dev, "Unable to register net device %s\n",
-			 qcaspi_devs->name);
+		dev_err(&spi->dev, "Unable to register net device %s\n",
+			qcaspi_devs->name);
 		free_netdev(qcaspi_devs);
 		return -EFAULT;
 	}
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/renesas/ravb_main.c linux-libre-4.9.124-gnu/drivers/net/ethernet/renesas/ravb_main.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/renesas/ravb_main.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/renesas/ravb_main.c	2018-08-24 07:12:43.000000000 -0400
@@ -955,6 +955,13 @@ static void ravb_adjust_link(struct net_
 	struct ravb_private *priv = netdev_priv(ndev);
 	struct phy_device *phydev = ndev->phydev;
 	bool new_state = false;
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->lock, flags);
+
+	/* Disable TX and RX right over here, if E-MAC change is ignored */
+	if (priv->no_avb_link)
+		ravb_rcv_snd_disable(ndev);
 
 	if (phydev->link) {
 		if (phydev->duplex != priv->duplex) {
@@ -972,18 +979,21 @@ static void ravb_adjust_link(struct net_
 			ravb_modify(ndev, ECMR, ECMR_TXF, 0);
 			new_state = true;
 			priv->link = phydev->link;
-			if (priv->no_avb_link)
-				ravb_rcv_snd_enable(ndev);
 		}
 	} else if (priv->link) {
 		new_state = true;
 		priv->link = 0;
 		priv->speed = 0;
 		priv->duplex = -1;
-		if (priv->no_avb_link)
-			ravb_rcv_snd_disable(ndev);
 	}
 
+	/* Enable TX and RX right over here, if E-MAC change is ignored */
+	if (priv->no_avb_link && phydev->link)
+		ravb_rcv_snd_enable(ndev);
+
+	mmiowb();
+	spin_unlock_irqrestore(&priv->lock, flags);
+
 	if (new_state && netif_msg_link(priv))
 		phy_print_status(phydev);
 }
@@ -1085,52 +1095,18 @@ static int ravb_get_link_ksettings(struc
 static int ravb_set_link_ksettings(struct net_device *ndev,
 				   const struct ethtool_link_ksettings *cmd)
 {
-	struct ravb_private *priv = netdev_priv(ndev);
-	unsigned long flags;
-	int error;
-
 	if (!ndev->phydev)
 		return -ENODEV;
 
-	spin_lock_irqsave(&priv->lock, flags);
-
-	/* Disable TX and RX */
-	ravb_rcv_snd_disable(ndev);
-
-	error = phy_ethtool_ksettings_set(ndev->phydev, cmd);
-	if (error)
-		goto error_exit;
-
-	if (cmd->base.duplex == DUPLEX_FULL)
-		priv->duplex = 1;
-	else
-		priv->duplex = 0;
-
-	ravb_set_duplex(ndev);
-
-error_exit:
-	mdelay(1);
-
-	/* Enable TX and RX */
-	ravb_rcv_snd_enable(ndev);
-
-	mmiowb();
-	spin_unlock_irqrestore(&priv->lock, flags);
-
-	return error;
+	return phy_ethtool_ksettings_set(ndev->phydev, cmd);
 }
 
 static int ravb_nway_reset(struct net_device *ndev)
 {
-	struct ravb_private *priv = netdev_priv(ndev);
 	int error = -ENODEV;
-	unsigned long flags;
 
-	if (ndev->phydev) {
-		spin_lock_irqsave(&priv->lock, flags);
+	if (ndev->phydev)
 		error = phy_start_aneg(ndev->phydev);
-		spin_unlock_irqrestore(&priv->lock, flags);
-	}
 
 	return error;
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/renesas/sh_eth.c linux-libre-4.9.124-gnu/drivers/net/ethernet/renesas/sh_eth.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/renesas/sh_eth.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/renesas/sh_eth.c	2018-08-24 07:12:43.000000000 -0400
@@ -1743,8 +1743,15 @@ static void sh_eth_adjust_link(struct ne
 {
 	struct sh_eth_private *mdp = netdev_priv(ndev);
 	struct phy_device *phydev = ndev->phydev;
+	unsigned long flags;
 	int new_state = 0;
 
+	spin_lock_irqsave(&mdp->lock, flags);
+
+	/* Disable TX and RX right over here, if E-MAC change is ignored */
+	if (mdp->cd->no_psr || mdp->no_ether_link)
+		sh_eth_rcv_snd_disable(ndev);
+
 	if (phydev->link) {
 		if (phydev->duplex != mdp->duplex) {
 			new_state = 1;
@@ -1763,18 +1770,21 @@ static void sh_eth_adjust_link(struct ne
 			sh_eth_modify(ndev, ECMR, ECMR_TXF, 0);
 			new_state = 1;
 			mdp->link = phydev->link;
-			if (mdp->cd->no_psr || mdp->no_ether_link)
-				sh_eth_rcv_snd_enable(ndev);
 		}
 	} else if (mdp->link) {
 		new_state = 1;
 		mdp->link = 0;
 		mdp->speed = 0;
 		mdp->duplex = -1;
-		if (mdp->cd->no_psr || mdp->no_ether_link)
-			sh_eth_rcv_snd_disable(ndev);
 	}
 
+	/* Enable TX and RX right over here, if E-MAC change is ignored */
+	if ((mdp->cd->no_psr || mdp->no_ether_link) && phydev->link)
+		sh_eth_rcv_snd_enable(ndev);
+
+	mmiowb();
+	spin_unlock_irqrestore(&mdp->lock, flags);
+
 	if (new_state && netif_msg_link(mdp))
 		phy_print_status(phydev);
 }
@@ -1856,39 +1866,10 @@ static int sh_eth_get_link_ksettings(str
 static int sh_eth_set_link_ksettings(struct net_device *ndev,
 				     const struct ethtool_link_ksettings *cmd)
 {
-	struct sh_eth_private *mdp = netdev_priv(ndev);
-	unsigned long flags;
-	int ret;
-
 	if (!ndev->phydev)
 		return -ENODEV;
 
-	spin_lock_irqsave(&mdp->lock, flags);
-
-	/* disable tx and rx */
-	sh_eth_rcv_snd_disable(ndev);
-
-	ret = phy_ethtool_ksettings_set(ndev->phydev, cmd);
-	if (ret)
-		goto error_exit;
-
-	if (cmd->base.duplex == DUPLEX_FULL)
-		mdp->duplex = 1;
-	else
-		mdp->duplex = 0;
-
-	if (mdp->cd->set_duplex)
-		mdp->cd->set_duplex(ndev);
-
-error_exit:
-	mdelay(1);
-
-	/* enable tx and rx */
-	sh_eth_rcv_snd_enable(ndev);
-
-	spin_unlock_irqrestore(&mdp->lock, flags);
-
-	return ret;
+	return phy_ethtool_ksettings_set(ndev->phydev, cmd);
 }
 
 /* If it is ever necessary to increase SH_ETH_REG_DUMP_MAX_REGS, the
@@ -2079,18 +2060,10 @@ static void sh_eth_get_regs(struct net_d
 
 static int sh_eth_nway_reset(struct net_device *ndev)
 {
-	struct sh_eth_private *mdp = netdev_priv(ndev);
-	unsigned long flags;
-	int ret;
-
 	if (!ndev->phydev)
 		return -ENODEV;
 
-	spin_lock_irqsave(&mdp->lock, flags);
-	ret = phy_start_aneg(ndev->phydev);
-	spin_unlock_irqrestore(&mdp->lock, flags);
-
-	return ret;
+	return phy_start_aneg(ndev->phydev);
 }
 
 static u32 sh_eth_get_msglevel(struct net_device *ndev)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c linux-libre-4.9.124-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c	2018-08-24 07:12:43.000000000 -0400
@@ -55,6 +55,7 @@ struct socfpga_dwmac {
 	struct	device *dev;
 	struct regmap *sys_mgr_base_addr;
 	struct reset_control *stmmac_rst;
+	struct reset_control *stmmac_ocp_rst;
 	void __iomem *splitter_base;
 	bool f2h_ptp_ref_clk;
 	struct tse_pcs pcs;
@@ -262,8 +263,8 @@ static int socfpga_dwmac_set_phy_mode(st
 		val = SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII;
 
 	/* Assert reset to the enet controller before changing the phy mode */
-	if (dwmac->stmmac_rst)
-		reset_control_assert(dwmac->stmmac_rst);
+	reset_control_assert(dwmac->stmmac_ocp_rst);
+	reset_control_assert(dwmac->stmmac_rst);
 
 	regmap_read(sys_mgr_base_addr, reg_offset, &ctrl);
 	ctrl &= ~(SYSMGR_EMACGRP_CTRL_PHYSEL_MASK << reg_shift);
@@ -285,8 +286,8 @@ static int socfpga_dwmac_set_phy_mode(st
 	/* Deassert reset for the phy configuration to be sampled by
 	 * the enet controller, and operation to start in requested mode
 	 */
-	if (dwmac->stmmac_rst)
-		reset_control_deassert(dwmac->stmmac_rst);
+	reset_control_deassert(dwmac->stmmac_ocp_rst);
+	reset_control_deassert(dwmac->stmmac_rst);
 	if (phymode == PHY_INTERFACE_MODE_SGMII) {
 		if (tse_pcs_init(dwmac->pcs.tse_pcs_base, &dwmac->pcs) != 0) {
 			dev_err(dwmac->dev, "Unable to initialize TSE PCS");
@@ -321,6 +322,15 @@ static int socfpga_dwmac_probe(struct pl
 		goto err_remove_config_dt;
 	}
 
+	dwmac->stmmac_ocp_rst = devm_reset_control_get_optional(dev, "stmmaceth-ocp");
+	if (IS_ERR(dwmac->stmmac_ocp_rst)) {
+		ret = PTR_ERR(dwmac->stmmac_ocp_rst);
+		dev_err(dev, "error getting reset control of ocp %d\n", ret);
+		goto err_remove_config_dt;
+	}
+
+	reset_control_deassert(dwmac->stmmac_ocp_rst);
+
 	ret = socfpga_dwmac_parse_data(dwmac, dev);
 	if (ret) {
 		dev_err(dev, "Unable to parse OF data\n");
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/stmicro/stmmac/Kconfig linux-libre-4.9.124-gnu/drivers/net/ethernet/stmicro/stmmac/Kconfig
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/stmicro/stmmac/Kconfig	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/stmicro/stmmac/Kconfig	2018-08-24 07:12:43.000000000 -0400
@@ -83,7 +83,7 @@ config DWMAC_ROCKCHIP
 config DWMAC_SOCFPGA
 	tristate "SOCFPGA dwmac support"
 	default ARCH_SOCFPGA
-	depends on OF && (ARCH_SOCFPGA || COMPILE_TEST)
+	depends on OF && (ARCH_SOCFPGA || ARCH_STRATIX10 || COMPILE_TEST)
 	select MFD_SYSCON
 	help
 	  Support for ethernet controller on Altera SOCFPGA
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ethernet/ti/davinci_emac.c linux-libre-4.9.124-gnu/drivers/net/ethernet/ti/davinci_emac.c
--- linux-libre-4.9.123-gnu/drivers/net/ethernet/ti/davinci_emac.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ethernet/ti/davinci_emac.c	2018-08-24 07:12:43.000000000 -0400
@@ -1387,6 +1387,10 @@ static int emac_devioctl(struct net_devi
 
 static int match_first_device(struct device *dev, void *data)
 {
+	if (dev->parent && dev->parent->of_node)
+		return of_device_is_compatible(dev->parent->of_node,
+					       "ti,davinci_mdio");
+
 	return !strncmp(dev_name(dev), "davinci_mdio", 12);
 }
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/hamradio/bpqether.c linux-libre-4.9.124-gnu/drivers/net/hamradio/bpqether.c
--- linux-libre-4.9.123-gnu/drivers/net/hamradio/bpqether.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/hamradio/bpqether.c	2018-08-24 07:12:43.000000000 -0400
@@ -89,10 +89,6 @@
 static const char banner[] __initconst = KERN_INFO \
 	"AX.25: bpqether driver version 004\n";
 
-static char bcast_addr[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
-
-static char bpq_eth_addr[6];
-
 static int bpq_rcv(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *);
 static int bpq_device_event(struct notifier_block *, unsigned long, void *);
 
@@ -515,8 +511,8 @@ static int bpq_new_device(struct net_dev
 	bpq->ethdev = edev;
 	bpq->axdev = ndev;
 
-	memcpy(bpq->dest_addr, bcast_addr, sizeof(bpq_eth_addr));
-	memcpy(bpq->acpt_addr, bcast_addr, sizeof(bpq_eth_addr));
+	eth_broadcast_addr(bpq->dest_addr);
+	eth_broadcast_addr(bpq->acpt_addr);
 
 	err = register_netdevice(ndev);
 	if (err)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ieee802154/at86rf230.c linux-libre-4.9.124-gnu/drivers/net/ieee802154/at86rf230.c
--- linux-libre-4.9.123-gnu/drivers/net/ieee802154/at86rf230.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ieee802154/at86rf230.c	2018-08-24 07:12:43.000000000 -0400
@@ -941,7 +941,7 @@ at86rf230_xmit(struct ieee802154_hw *hw,
 static int
 at86rf230_ed(struct ieee802154_hw *hw, u8 *level)
 {
-	BUG_ON(!level);
+	WARN_ON(!level);
 	*level = 0xbe;
 	return 0;
 }
@@ -1117,8 +1117,7 @@ at86rf230_set_hw_addr_filt(struct ieee80
 	if (changed & IEEE802154_AFILT_SADDR_CHANGED) {
 		u16 addr = le16_to_cpu(filt->short_addr);
 
-		dev_vdbg(&lp->spi->dev,
-			 "at86rf230_set_hw_addr_filt called for saddr\n");
+		dev_vdbg(&lp->spi->dev, "%s called for saddr\n", __func__);
 		__at86rf230_write(lp, RG_SHORT_ADDR_0, addr);
 		__at86rf230_write(lp, RG_SHORT_ADDR_1, addr >> 8);
 	}
@@ -1126,8 +1125,7 @@ at86rf230_set_hw_addr_filt(struct ieee80
 	if (changed & IEEE802154_AFILT_PANID_CHANGED) {
 		u16 pan = le16_to_cpu(filt->pan_id);
 
-		dev_vdbg(&lp->spi->dev,
-			 "at86rf230_set_hw_addr_filt called for pan id\n");
+		dev_vdbg(&lp->spi->dev, "%s called for pan id\n", __func__);
 		__at86rf230_write(lp, RG_PAN_ID_0, pan);
 		__at86rf230_write(lp, RG_PAN_ID_1, pan >> 8);
 	}
@@ -1136,15 +1134,13 @@ at86rf230_set_hw_addr_filt(struct ieee80
 		u8 i, addr[8];
 
 		memcpy(addr, &filt->ieee_addr, 8);
-		dev_vdbg(&lp->spi->dev,
-			 "at86rf230_set_hw_addr_filt called for IEEE addr\n");
+		dev_vdbg(&lp->spi->dev, "%s called for IEEE addr\n", __func__);
 		for (i = 0; i < 8; i++)
 			__at86rf230_write(lp, RG_IEEE_ADDR_0 + i, addr[i]);
 	}
 
 	if (changed & IEEE802154_AFILT_PANC_CHANGED) {
-		dev_vdbg(&lp->spi->dev,
-			 "at86rf230_set_hw_addr_filt called for panc change\n");
+		dev_vdbg(&lp->spi->dev, "%s called for panc change\n", __func__);
 		if (filt->pan_coord)
 			at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 1);
 		else
@@ -1248,7 +1244,6 @@ at86rf230_set_cca_mode(struct ieee802154
 	return at86rf230_write_subreg(lp, SR_CCA_MODE, val);
 }
 
-
 static int
 at86rf230_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm)
 {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ieee802154/fakelb.c linux-libre-4.9.124-gnu/drivers/net/ieee802154/fakelb.c
--- linux-libre-4.9.123-gnu/drivers/net/ieee802154/fakelb.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ieee802154/fakelb.c	2018-08-24 07:12:43.000000000 -0400
@@ -49,7 +49,7 @@ struct fakelb_phy {
 
 static int fakelb_hw_ed(struct ieee802154_hw *hw, u8 *level)
 {
-	BUG_ON(!level);
+	WARN_ON(!level);
 	*level = 0xbe;
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/ipvlan/ipvlan_main.c linux-libre-4.9.124-gnu/drivers/net/ipvlan/ipvlan_main.c
--- linux-libre-4.9.123-gnu/drivers/net/ipvlan/ipvlan_main.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/ipvlan/ipvlan_main.c	2018-08-24 07:12:43.000000000 -0400
@@ -63,10 +63,23 @@ static int ipvlan_set_port_mode(struct i
 {
 	struct ipvl_dev *ipvlan;
 	struct net_device *mdev = port->dev;
-	int err = 0;
+	unsigned int flags;
+	int err;
 
 	ASSERT_RTNL();
 	if (port->mode != nval) {
+		list_for_each_entry(ipvlan, &port->ipvlans, pnode) {
+			flags = ipvlan->dev->flags;
+			if (nval == IPVLAN_MODE_L3 || nval == IPVLAN_MODE_L3S) {
+				err = dev_change_flags(ipvlan->dev,
+						       flags | IFF_NOARP);
+			} else {
+				err = dev_change_flags(ipvlan->dev,
+						       flags & ~IFF_NOARP);
+			}
+			if (unlikely(err))
+				goto fail;
+		}
 		if (nval == IPVLAN_MODE_L3S) {
 			/* New mode is L3S */
 			err = ipvlan_register_nf_hook();
@@ -74,21 +87,28 @@ static int ipvlan_set_port_mode(struct i
 				mdev->l3mdev_ops = &ipvl_l3mdev_ops;
 				mdev->priv_flags |= IFF_L3MDEV_MASTER;
 			} else
-				return err;
+				goto fail;
 		} else if (port->mode == IPVLAN_MODE_L3S) {
 			/* Old mode was L3S */
 			mdev->priv_flags &= ~IFF_L3MDEV_MASTER;
 			ipvlan_unregister_nf_hook();
 			mdev->l3mdev_ops = NULL;
 		}
-		list_for_each_entry(ipvlan, &port->ipvlans, pnode) {
-			if (nval == IPVLAN_MODE_L3 || nval == IPVLAN_MODE_L3S)
-				ipvlan->dev->flags |= IFF_NOARP;
-			else
-				ipvlan->dev->flags &= ~IFF_NOARP;
-		}
 		port->mode = nval;
 	}
+	return 0;
+
+fail:
+	/* Undo the flags changes that have been done so far. */
+	list_for_each_entry_continue_reverse(ipvlan, &port->ipvlans, pnode) {
+		flags = ipvlan->dev->flags;
+		if (port->mode == IPVLAN_MODE_L3 ||
+		    port->mode == IPVLAN_MODE_L3S)
+			dev_change_flags(ipvlan->dev, flags | IFF_NOARP);
+		else
+			dev_change_flags(ipvlan->dev, flags & ~IFF_NOARP);
+	}
+
 	return err;
 }
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/usb/rtl8150.c linux-libre-4.9.124-gnu/drivers/net/usb/rtl8150.c
--- linux-libre-4.9.123-gnu/drivers/net/usb/rtl8150.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/usb/rtl8150.c	2018-08-24 07:12:43.000000000 -0400
@@ -681,7 +681,7 @@ static void rtl8150_set_multicast(struct
 		   (netdev->flags & IFF_ALLMULTI)) {
 		rx_creg &= 0xfffe;
 		rx_creg |= 0x0002;
-		dev_info(&netdev->dev, "%s: allmulti set\n", netdev->name);
+		dev_dbg(&netdev->dev, "%s: allmulti set\n", netdev->name);
 	} else {
 		/* ~RX_MULTICAST, ~RX_PROMISCUOUS */
 		rx_creg &= 0x00fc;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/usb/smsc75xx.c linux-libre-4.9.124-gnu/drivers/net/usb/smsc75xx.c
--- linux-libre-4.9.123-gnu/drivers/net/usb/smsc75xx.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/usb/smsc75xx.c	2018-08-24 07:12:43.000000000 -0400
@@ -82,6 +82,9 @@ static bool turbo_mode = true;
 module_param(turbo_mode, bool, 0644);
 MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");
 
+static int smsc75xx_link_ok_nopm(struct usbnet *dev);
+static int smsc75xx_phy_gig_workaround(struct usbnet *dev);
+
 static int __must_check __smsc75xx_read_reg(struct usbnet *dev, u32 index,
 					    u32 *data, int in_pm)
 {
@@ -852,6 +855,9 @@ static int smsc75xx_phy_initialize(struc
 		return -EIO;
 	}
 
+	/* phy workaround for gig link */
+	smsc75xx_phy_gig_workaround(dev);
+
 	smsc75xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
 		ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP |
 		ADVERTISE_PAUSE_ASYM);
@@ -990,6 +996,62 @@ static int smsc75xx_wait_ready(struct us
 	return -EIO;
 }
 
+static int smsc75xx_phy_gig_workaround(struct usbnet *dev)
+{
+	struct mii_if_info *mii = &dev->mii;
+	int ret = 0, timeout = 0;
+	u32 buf, link_up = 0;
+
+	/* Set the phy in Gig loopback */
+	smsc75xx_mdio_write(dev->net, mii->phy_id, MII_BMCR, 0x4040);
+
+	/* Wait for the link up */
+	do {
+		link_up = smsc75xx_link_ok_nopm(dev);
+		usleep_range(10000, 20000);
+		timeout++;
+	} while ((!link_up) && (timeout < 1000));
+
+	if (timeout >= 1000) {
+		netdev_warn(dev->net, "Timeout waiting for PHY link up\n");
+		return -EIO;
+	}
+
+	/* phy reset */
+	ret = smsc75xx_read_reg(dev, PMT_CTL, &buf);
+	if (ret < 0) {
+		netdev_warn(dev->net, "Failed to read PMT_CTL: %d\n", ret);
+		return ret;
+	}
+
+	buf |= PMT_CTL_PHY_RST;
+
+	ret = smsc75xx_write_reg(dev, PMT_CTL, buf);
+	if (ret < 0) {
+		netdev_warn(dev->net, "Failed to write PMT_CTL: %d\n", ret);
+		return ret;
+	}
+
+	timeout = 0;
+	do {
+		usleep_range(10000, 20000);
+		ret = smsc75xx_read_reg(dev, PMT_CTL, &buf);
+		if (ret < 0) {
+			netdev_warn(dev->net, "Failed to read PMT_CTL: %d\n",
+				    ret);
+			return ret;
+		}
+		timeout++;
+	} while ((buf & PMT_CTL_PHY_RST) && (timeout < 100));
+
+	if (timeout >= 100) {
+		netdev_warn(dev->net, "timeout waiting for PHY Reset\n");
+		return -EIO;
+	}
+
+	return 0;
+}
+
 static int smsc75xx_reset(struct usbnet *dev)
 {
 	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c linux-libre-4.9.124-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
--- linux-libre-4.9.123-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c	2018-08-22 10:31:10.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c	2018-08-24 11:06:41.000000000 -0400
@@ -4229,6 +4229,13 @@ void brcmf_sdio_remove(struct brcmf_sdio
 	brcmf_dbg(TRACE, "Enter\n");
 
 	if (bus) {
+		/* Stop watchdog task */
+		if (bus->watchdog_tsk) {
+			send_sig(SIGTERM, bus->watchdog_tsk, 1);
+			kthread_stop(bus->watchdog_tsk);
+			bus->watchdog_tsk = NULL;
+		}
+
 		/* De-register interrupt handler */
 		brcmf_sdiod_intr_unregister(bus->sdiodev);
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/nfc/pn533/usb.c linux-libre-4.9.124-gnu/drivers/nfc/pn533/usb.c
--- linux-libre-4.9.123-gnu/drivers/nfc/pn533/usb.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/nfc/pn533/usb.c	2018-08-24 07:12:43.000000000 -0400
@@ -71,7 +71,7 @@ static void pn533_recv_response(struct u
 	struct sk_buff *skb = NULL;
 
 	if (!urb->status) {
-		skb = alloc_skb(urb->actual_length, GFP_KERNEL);
+		skb = alloc_skb(urb->actual_length, GFP_ATOMIC);
 		if (!skb) {
 			nfc_err(&phy->udev->dev, "failed to alloc memory\n");
 		} else {
@@ -180,7 +180,7 @@ static int pn533_usb_send_frame(struct p
 
 	if (dev->protocol_type == PN533_PROTO_REQ_RESP) {
 		/* request for response for sent packet directly */
-		rc = pn533_submit_urb_for_response(phy, GFP_ATOMIC);
+		rc = pn533_submit_urb_for_response(phy, GFP_KERNEL);
 		if (rc)
 			goto error;
 	} else if (dev->protocol_type == PN533_PROTO_REQ_ACK_RESP) {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/nvme/target/core.c linux-libre-4.9.124-gnu/drivers/nvme/target/core.c
--- linux-libre-4.9.123-gnu/drivers/nvme/target/core.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/nvme/target/core.c	2018-08-24 07:12:43.000000000 -0400
@@ -578,6 +578,14 @@ static void nvmet_start_ctrl(struct nvme
 	}
 
 	ctrl->csts = NVME_CSTS_RDY;
+
+	/*
+	 * Controllers that are not yet enabled should not really enforce the
+	 * keep alive timeout, but we still want to track a timeout and cleanup
+	 * in case a host died before it enabled the controller.  Hence, simply
+	 * reset the keep alive timer when the controller is enabled.
+	 */
+	mod_delayed_work(system_wq, &ctrl->ka_work, ctrl->kato * HZ);
 }
 
 static void nvmet_clear_ctrl(struct nvmet_ctrl *ctrl)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/host/pcie-rcar.c linux-libre-4.9.124-gnu/drivers/pci/host/pcie-rcar.c
--- linux-libre-4.9.123-gnu/drivers/pci/host/pcie-rcar.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/host/pcie-rcar.c	2018-08-24 07:12:43.000000000 -0400
@@ -1102,7 +1102,7 @@ static int rcar_pcie_parse_request_of_pc
 		struct resource *res = win->res;
 
 		if (resource_type(res) == IORESOURCE_IO) {
-			err = pci_remap_iospace(res, iobase);
+			err = devm_pci_remap_iospace(dev, res, iobase);
 			if (err) {
 				dev_warn(dev, "error %d: failed to map resource %pR\n",
 					 err, res);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/host/pcie-xilinx.c linux-libre-4.9.124-gnu/drivers/pci/host/pcie-xilinx.c
--- linux-libre-4.9.123-gnu/drivers/pci/host/pcie-xilinx.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/host/pcie-xilinx.c	2018-08-24 07:12:43.000000000 -0400
@@ -527,6 +527,7 @@ static int xilinx_pcie_init_irq_domain(s
 	port->leg_domain = irq_domain_add_linear(pcie_intc_node, 4,
 						 &intx_domain_ops,
 						 port);
+	of_node_put(pcie_intc_node);
 	if (!port->leg_domain) {
 		dev_err(dev, "Failed to get a INTx IRQ domain\n");
 		return -ENODEV;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/host/pcie-xilinx-nwl.c linux-libre-4.9.124-gnu/drivers/pci/host/pcie-xilinx-nwl.c
--- linux-libre-4.9.123-gnu/drivers/pci/host/pcie-xilinx-nwl.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/host/pcie-xilinx-nwl.c	2018-08-24 07:12:43.000000000 -0400
@@ -532,7 +532,7 @@ static int nwl_pcie_init_irq_domain(stru
 							INTX_NUM,
 							&legacy_domain_ops,
 							pcie);
-
+	of_node_put(legacy_intc_node);
 	if (!pcie->legacy_irq_domain) {
 		dev_err(dev, "failed to create IRQ domain\n");
 		return -ENOMEM;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/host/pci-host-common.c linux-libre-4.9.124-gnu/drivers/pci/host/pci-host-common.c
--- linux-libre-4.9.123-gnu/drivers/pci/host/pci-host-common.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/host/pci-host-common.c	2018-08-24 07:12:43.000000000 -0400
@@ -45,7 +45,7 @@ static int gen_pci_parse_request_of_pci_
 
 		switch (resource_type(res)) {
 		case IORESOURCE_IO:
-			err = pci_remap_iospace(res, iobase);
+			err = devm_pci_remap_iospace(dev, res, iobase);
 			if (err) {
 				dev_warn(dev, "error %d: failed to map resource %pR\n",
 					 err, res);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/host/pci-versatile.c linux-libre-4.9.124-gnu/drivers/pci/host/pci-versatile.c
--- linux-libre-4.9.123-gnu/drivers/pci/host/pci-versatile.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/host/pci-versatile.c	2018-08-24 07:12:43.000000000 -0400
@@ -89,7 +89,7 @@ static int versatile_pci_parse_request_o
 
 		switch (resource_type(res)) {
 		case IORESOURCE_IO:
-			err = pci_remap_iospace(res, iobase);
+			err = devm_pci_remap_iospace(dev, res, iobase);
 			if (err) {
 				dev_warn(dev, "error %d: failed to map resource %pR\n",
 					 err, res);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/hotplug/pciehp_core.c linux-libre-4.9.124-gnu/drivers/pci/hotplug/pciehp_core.c
--- linux-libre-4.9.123-gnu/drivers/pci/hotplug/pciehp_core.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/hotplug/pciehp_core.c	2018-08-24 07:12:43.000000000 -0400
@@ -76,6 +76,12 @@ static int reset_slot(struct hotplug_slo
  */
 static void release_slot(struct hotplug_slot *hotplug_slot)
 {
+	struct slot *slot = hotplug_slot->private;
+
+	/* queued work needs hotplug_slot name */
+	cancel_delayed_work(&slot->work);
+	drain_workqueue(slot->wq);
+
 	kfree(hotplug_slot->ops);
 	kfree(hotplug_slot->info);
 	kfree(hotplug_slot);
@@ -278,6 +284,7 @@ static void pciehp_remove(struct pcie_de
 {
 	struct controller *ctrl = get_service_data(dev);
 
+	pcie_shutdown_notification(ctrl);
 	cleanup_slot(ctrl);
 	pciehp_release_ctrl(ctrl);
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/hotplug/pciehp.h linux-libre-4.9.124-gnu/drivers/pci/hotplug/pciehp.h
--- linux-libre-4.9.123-gnu/drivers/pci/hotplug/pciehp.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/hotplug/pciehp.h	2018-08-24 07:12:43.000000000 -0400
@@ -132,6 +132,7 @@ int pciehp_unconfigure_device(struct slo
 void pciehp_queue_pushbutton_work(struct work_struct *work);
 struct controller *pcie_init(struct pcie_device *dev);
 int pcie_init_notification(struct controller *ctrl);
+void pcie_shutdown_notification(struct controller *ctrl);
 int pciehp_enable_slot(struct slot *p_slot);
 int pciehp_disable_slot(struct slot *p_slot);
 void pcie_reenable_notification(struct controller *ctrl);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/hotplug/pciehp_hpc.c linux-libre-4.9.124-gnu/drivers/pci/hotplug/pciehp_hpc.c
--- linux-libre-4.9.123-gnu/drivers/pci/hotplug/pciehp_hpc.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/hotplug/pciehp_hpc.c	2018-08-24 07:12:43.000000000 -0400
@@ -562,8 +562,6 @@ static irqreturn_t pciehp_isr(int irq, v
 {
 	struct controller *ctrl = (struct controller *)dev_id;
 	struct pci_dev *pdev = ctrl_dev(ctrl);
-	struct pci_bus *subordinate = pdev->subordinate;
-	struct pci_dev *dev;
 	struct slot *slot = ctrl->slot;
 	u16 status, events;
 	u8 present;
@@ -611,14 +609,9 @@ static irqreturn_t pciehp_isr(int irq, v
 		wake_up(&ctrl->queue);
 	}
 
-	if (subordinate) {
-		list_for_each_entry(dev, &subordinate->devices, bus_list) {
-			if (dev->ignore_hotplug) {
-				ctrl_dbg(ctrl, "ignoring hotplug event %#06x (%s requested no hotplug)\n",
-					 events, pci_name(dev));
-				return IRQ_HANDLED;
-			}
-		}
+	if (pdev->ignore_hotplug) {
+		ctrl_dbg(ctrl, "ignoring hotplug event %#06x\n", events);
+		return IRQ_HANDLED;
 	}
 
 	/* Check Attention Button Pressed */
@@ -786,7 +779,7 @@ int pcie_init_notification(struct contro
 	return 0;
 }
 
-static void pcie_shutdown_notification(struct controller *ctrl)
+void pcie_shutdown_notification(struct controller *ctrl)
 {
 	if (ctrl->notification_enabled) {
 		pcie_disable_notification(ctrl);
@@ -821,7 +814,7 @@ abort:
 static void pcie_cleanup_slot(struct controller *ctrl)
 {
 	struct slot *slot = ctrl->slot;
-	cancel_delayed_work(&slot->work);
+
 	destroy_workqueue(slot->wq);
 	kfree(slot);
 }
@@ -902,7 +895,6 @@ abort:
 
 void pciehp_release_ctrl(struct controller *ctrl)
 {
-	pcie_shutdown_notification(ctrl);
 	pcie_cleanup_slot(ctrl);
 	kfree(ctrl);
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/hotplug/pci_hotplug_core.c linux-libre-4.9.124-gnu/drivers/pci/hotplug/pci_hotplug_core.c
--- linux-libre-4.9.123-gnu/drivers/pci/hotplug/pci_hotplug_core.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/hotplug/pci_hotplug_core.c	2018-08-24 07:12:43.000000000 -0400
@@ -455,8 +455,17 @@ int __pci_hp_register(struct hotplug_slo
 	list_add(&slot->slot_list, &pci_hotplug_slot_list);
 
 	result = fs_add_slot(pci_slot);
+	if (result)
+		goto err_list_del;
+
 	kobject_uevent(&pci_slot->kobj, KOBJ_ADD);
 	dbg("Added slot %s to the list\n", name);
+	goto out;
+
+err_list_del:
+	list_del(&slot->slot_list);
+	pci_slot->hotplug = NULL;
+	pci_destroy_slot(pci_slot);
 out:
 	mutex_unlock(&pci_hp_mutex);
 	return result;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/pci.c linux-libre-4.9.124-gnu/drivers/pci/pci.c
--- linux-libre-4.9.123-gnu/drivers/pci/pci.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/pci.c	2018-08-24 07:12:43.000000000 -0400
@@ -3407,6 +3407,44 @@ void pci_unmap_iospace(struct resource *
 #endif
 }
 
+static void devm_pci_unmap_iospace(struct device *dev, void *ptr)
+{
+	struct resource **res = ptr;
+
+	pci_unmap_iospace(*res);
+}
+
+/**
+ * devm_pci_remap_iospace - Managed pci_remap_iospace()
+ * @dev: Generic device to remap IO address for
+ * @res: Resource describing the I/O space
+ * @phys_addr: physical address of range to be mapped
+ *
+ * Managed pci_remap_iospace().  Map is automatically unmapped on driver
+ * detach.
+ */
+int devm_pci_remap_iospace(struct device *dev, const struct resource *res,
+			   phys_addr_t phys_addr)
+{
+	const struct resource **ptr;
+	int error;
+
+	ptr = devres_alloc(devm_pci_unmap_iospace, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return -ENOMEM;
+
+	error = pci_remap_iospace(res, phys_addr);
+	if (error) {
+		devres_free(ptr);
+	} else	{
+		*ptr = res;
+		devres_add(dev, ptr);
+	}
+
+	return error;
+}
+EXPORT_SYMBOL(devm_pci_remap_iospace);
+
 static void __pci_set_master(struct pci_dev *dev, bool enable)
 {
 	u16 old_cmd, cmd;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pci/probe.c linux-libre-4.9.124-gnu/drivers/pci/probe.c
--- linux-libre-4.9.123-gnu/drivers/pci/probe.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pci/probe.c	2018-08-24 07:12:43.000000000 -0400
@@ -1363,6 +1363,10 @@ static void pci_configure_mps(struct pci
 	if (!pci_is_pcie(dev) || !bridge || !pci_is_pcie(bridge))
 		return;
 
+	/* MPS and MRRS fields are of type 'RsvdP' for VFs, short-circuit out */
+	if (dev->is_virtfn)
+		return;
+
 	mps = pcie_get_mps(dev);
 	p_mps = pcie_get_mps(bridge);
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/pinctrl/bcm/pinctrl-nsp-mux.c linux-libre-4.9.124-gnu/drivers/pinctrl/bcm/pinctrl-nsp-mux.c
--- linux-libre-4.9.123-gnu/drivers/pinctrl/bcm/pinctrl-nsp-mux.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/pinctrl/bcm/pinctrl-nsp-mux.c	2018-08-24 07:12:43.000000000 -0400
@@ -460,8 +460,8 @@ static int nsp_pinmux_enable(struct pinc
 	const struct nsp_pin_function *func;
 	const struct nsp_pin_group *grp;
 
-	if (grp_select > pinctrl->num_groups ||
-		func_select > pinctrl->num_functions)
+	if (grp_select >= pinctrl->num_groups ||
+	    func_select >= pinctrl->num_functions)
 		return -EINVAL;
 
 	func = &pinctrl->functions[func_select];
@@ -577,6 +577,8 @@ static int nsp_pinmux_probe(struct platf
 		return PTR_ERR(pinctrl->base0);
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+	if (!res)
+		return -EINVAL;
 	pinctrl->base1 = devm_ioremap_nocache(&pdev->dev, res->start,
 					      resource_size(res));
 	if (!pinctrl->base1) {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/scsi/xen-scsifront.c linux-libre-4.9.124-gnu/drivers/scsi/xen-scsifront.c
--- linux-libre-4.9.123-gnu/drivers/scsi/xen-scsifront.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/scsi/xen-scsifront.c	2018-08-24 07:12:43.000000000 -0400
@@ -676,10 +676,17 @@ static int scsifront_dev_reset_handler(s
 static int scsifront_sdev_configure(struct scsi_device *sdev)
 {
 	struct vscsifrnt_info *info = shost_priv(sdev->host);
+	int err;
 
-	if (info && current == info->curr)
-		xenbus_printf(XBT_NIL, info->dev->nodename,
+	if (info && current == info->curr) {
+		err = xenbus_printf(XBT_NIL, info->dev->nodename,
 			      info->dev_state_path, "%d", XenbusStateConnected);
+		if (err) {
+			xenbus_dev_error(info->dev, err,
+				"%s: writing dev_state_path", __func__);
+			return err;
+		}
+	}
 
 	return 0;
 }
@@ -687,10 +694,15 @@ static int scsifront_sdev_configure(stru
 static void scsifront_sdev_destroy(struct scsi_device *sdev)
 {
 	struct vscsifrnt_info *info = shost_priv(sdev->host);
+	int err;
 
-	if (info && current == info->curr)
-		xenbus_printf(XBT_NIL, info->dev->nodename,
+	if (info && current == info->curr) {
+		err = xenbus_printf(XBT_NIL, info->dev->nodename,
 			      info->dev_state_path, "%d", XenbusStateClosed);
+		if (err)
+			xenbus_dev_error(info->dev, err,
+				"%s: writing dev_state_path", __func__);
+	}
 }
 
 static struct scsi_host_template scsifront_sht = {
@@ -1025,9 +1037,12 @@ static void scsifront_do_lun_hotplug(str
 
 			if (scsi_add_device(info->host, chn, tgt, lun)) {
 				dev_err(&dev->dev, "scsi_add_device\n");
-				xenbus_printf(XBT_NIL, dev->nodename,
+				err = xenbus_printf(XBT_NIL, dev->nodename,
 					      info->dev_state_path,
 					      "%d", XenbusStateClosed);
+				if (err)
+					xenbus_dev_error(dev, err,
+						"%s: writing dev_state_path", __func__);
 			}
 			break;
 		case VSCSIFRONT_OP_DEL_LUN:
@@ -1041,10 +1056,14 @@ static void scsifront_do_lun_hotplug(str
 			}
 			break;
 		case VSCSIFRONT_OP_READD_LUN:
-			if (device_state == XenbusStateConnected)
-				xenbus_printf(XBT_NIL, dev->nodename,
+			if (device_state == XenbusStateConnected) {
+				err = xenbus_printf(XBT_NIL, dev->nodename,
 					      info->dev_state_path,
 					      "%d", XenbusStateConnected);
+				if (err)
+					xenbus_dev_error(dev, err,
+						"%s: writing dev_state_path", __func__);
+			}
 			break;
 		default:
 			break;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/usb/dwc2/gadget.c linux-libre-4.9.124-gnu/drivers/usb/dwc2/gadget.c
--- linux-libre-4.9.123-gnu/drivers/usb/dwc2/gadget.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/usb/dwc2/gadget.c	2018-08-24 07:12:43.000000000 -0400
@@ -3948,9 +3948,11 @@ int dwc2_gadget_init(struct dwc2_hsotg *
 	}
 
 	ret = usb_add_gadget_udc(dev, &hsotg->gadget);
-	if (ret)
+	if (ret) {
+		dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep,
+					   hsotg->ctrl_req);
 		return ret;
-
+	}
 	dwc2_hsotg_dump(hsotg);
 
 	return 0;
@@ -3963,6 +3965,7 @@ int dwc2_gadget_init(struct dwc2_hsotg *
 int dwc2_hsotg_remove(struct dwc2_hsotg *hsotg)
 {
 	usb_del_gadget_udc(&hsotg->gadget);
+	dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep, hsotg->ctrl_req);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/usb/dwc2/hcd_intr.c linux-libre-4.9.124-gnu/drivers/usb/dwc2/hcd_intr.c
--- linux-libre-4.9.123-gnu/drivers/usb/dwc2/hcd_intr.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/usb/dwc2/hcd_intr.c	2018-08-24 07:12:43.000000000 -0400
@@ -922,9 +922,8 @@ static int dwc2_xfercomp_isoc_split_in(s
 	frame_desc = &qtd->urb->iso_descs[qtd->isoc_frame_index];
 	len = dwc2_get_actual_xfer_length(hsotg, chan, chnum, qtd,
 					  DWC2_HC_XFER_COMPLETE, NULL);
-	if (!len) {
+	if (!len && !qtd->isoc_split_offset) {
 		qtd->complete_split = 0;
-		qtd->isoc_split_offset = 0;
 		return 0;
 	}
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/usb/dwc3/dwc3-of-simple.c linux-libre-4.9.124-gnu/drivers/usb/dwc3/dwc3-of-simple.c
--- linux-libre-4.9.123-gnu/drivers/usb/dwc3/dwc3-of-simple.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/usb/dwc3/dwc3-of-simple.c	2018-08-24 07:12:43.000000000 -0400
@@ -132,8 +132,9 @@ static int dwc3_of_simple_remove(struct
 
 	of_platform_depopulate(dev);
 
-	pm_runtime_put_sync(dev);
 	pm_runtime_disable(dev);
+	pm_runtime_put_noidle(dev);
+	pm_runtime_set_suspended(dev);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/usb/gadget/composite.c linux-libre-4.9.124-gnu/drivers/usb/gadget/composite.c
--- linux-libre-4.9.123-gnu/drivers/usb/gadget/composite.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/usb/gadget/composite.c	2018-08-24 07:12:43.000000000 -0400
@@ -1712,6 +1712,8 @@ composite_setup(struct usb_gadget *gadge
 		 */
 		if (w_value && !f->get_alt)
 			break;
+
+		spin_lock(&cdev->lock);
 		value = f->set_alt(f, w_index, w_value);
 		if (value == USB_GADGET_DELAYED_STATUS) {
 			DBG(cdev,
@@ -1721,6 +1723,7 @@ composite_setup(struct usb_gadget *gadge
 			DBG(cdev, "delayed_status count %d\n",
 					cdev->delayed_status);
 		}
+		spin_unlock(&cdev->lock);
 		break;
 	case USB_REQ_GET_INTERFACE:
 		if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE))
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/usb/host/xhci.c linux-libre-4.9.124-gnu/drivers/usb/host/xhci.c
--- linux-libre-4.9.123-gnu/drivers/usb/host/xhci.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/usb/host/xhci.c	2018-08-24 07:12:43.000000000 -0400
@@ -1056,8 +1056,13 @@ int xhci_resume(struct xhci_hcd *xhci, b
 		command = readl(&xhci->op_regs->command);
 		command |= CMD_CRS;
 		writel(command, &xhci->op_regs->command);
+		/*
+		 * Some controllers take up to 55+ ms to complete the controller
+		 * restore so setting the timeout to 100ms. Xhci specification
+		 * doesn't mention any timeout value.
+		 */
 		if (xhci_handshake(&xhci->op_regs->status,
-			      STS_RESTORE, 0, 10 * 1000)) {
+			      STS_RESTORE, 0, 100 * 1000)) {
 			xhci_warn(xhci, "WARN: xHC restore state timeout\n");
 			spin_unlock_irq(&xhci->lock);
 			return -ETIMEDOUT;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/usb/host/xhci-tegra.c linux-libre-4.9.124-gnu/drivers/usb/host/xhci-tegra.c
--- linux-libre-4.9.123-gnu/drivers/usb/host/xhci-tegra.c	2018-08-22 10:39:37.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/usb/host/xhci-tegra.c	2018-08-24 11:15:37.000000000 -0400
@@ -482,7 +482,7 @@ static void tegra_xusb_mbox_handle(struc
 	unsigned long mask;
 	unsigned int port;
 	bool idle, enable;
-	int err;
+	int err = 0;
 
 	memset(&rsp, 0, sizeof(rsp));
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/xen/manage.c linux-libre-4.9.124-gnu/drivers/xen/manage.c
--- linux-libre-4.9.123-gnu/drivers/xen/manage.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/xen/manage.c	2018-08-24 07:12:43.000000000 -0400
@@ -291,8 +291,15 @@ static void sysrq_handler(struct xenbus_
 		return;
 	}
 
-	if (sysrq_key != '\0')
-		xenbus_printf(xbt, "control", "sysrq", "%c", '\0');
+	if (sysrq_key != '\0') {
+		err = xenbus_printf(xbt, "control", "sysrq", "%c", '\0');
+		if (err) {
+			pr_err("%s: Error %d writing sysrq in control/sysrq\n",
+			       __func__, err);
+			xenbus_transaction_end(xbt, 1);
+			return;
+		}
+	}
 
 	err = xenbus_transaction_end(xbt, 0);
 	if (err == -EAGAIN)
@@ -344,7 +351,12 @@ static int setup_shutdown_watcher(void)
 			continue;
 		snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
 			 shutdown_handlers[idx].command);
-		xenbus_printf(XBT_NIL, "control", node, "%u", 1);
+		err = xenbus_printf(XBT_NIL, "control", node, "%u", 1);
+		if (err) {
+			pr_err("%s: Error %d writing %s\n", __func__,
+				err, node);
+			return err;
+		}
 	}
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/drivers/xen/xen-scsiback.c linux-libre-4.9.124-gnu/drivers/xen/xen-scsiback.c
--- linux-libre-4.9.123-gnu/drivers/xen/xen-scsiback.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/drivers/xen/xen-scsiback.c	2018-08-24 07:12:43.000000000 -0400
@@ -1014,6 +1014,7 @@ static void scsiback_do_add_lun(struct v
 {
 	struct v2p_entry *entry;
 	unsigned long flags;
+	int err;
 
 	if (try) {
 		spin_lock_irqsave(&info->v2p_lock, flags);
@@ -1029,8 +1030,11 @@ static void scsiback_do_add_lun(struct v
 			scsiback_del_translation_entry(info, vir);
 		}
 	} else if (!try) {
-		xenbus_printf(XBT_NIL, info->dev->nodename, state,
+		err = xenbus_printf(XBT_NIL, info->dev->nodename, state,
 			      "%d", XenbusStateClosed);
+		if (err)
+			xenbus_dev_error(info->dev, err,
+				"%s: writing %s", __func__, state);
 	}
 }
 
@@ -1069,8 +1073,11 @@ static void scsiback_do_1lun_hotplug(str
 	snprintf(str, sizeof(str), "vscsi-devs/%s/p-dev", ent);
 	val = xenbus_read(XBT_NIL, dev->nodename, str, NULL);
 	if (IS_ERR(val)) {
-		xenbus_printf(XBT_NIL, dev->nodename, state,
+		err = xenbus_printf(XBT_NIL, dev->nodename, state,
 			      "%d", XenbusStateClosed);
+		if (err)
+			xenbus_dev_error(info->dev, err,
+				"%s: writing %s", __func__, state);
 		return;
 	}
 	strlcpy(phy, val, VSCSI_NAMELEN);
@@ -1081,8 +1088,11 @@ static void scsiback_do_1lun_hotplug(str
 	err = xenbus_scanf(XBT_NIL, dev->nodename, str, "%u:%u:%u:%u",
 			   &vir.hst, &vir.chn, &vir.tgt, &vir.lun);
 	if (XENBUS_EXIST_ERR(err)) {
-		xenbus_printf(XBT_NIL, dev->nodename, state,
+		err = xenbus_printf(XBT_NIL, dev->nodename, state,
 			      "%d", XenbusStateClosed);
+		if (err)
+			xenbus_dev_error(info->dev, err,
+				"%s: writing %s", __func__, state);
 		return;
 	}
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/fs/ceph/inode.c linux-libre-4.9.124-gnu/fs/ceph/inode.c
--- linux-libre-4.9.123-gnu/fs/ceph/inode.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/fs/ceph/inode.c	2018-08-24 07:12:43.000000000 -0400
@@ -1077,6 +1077,7 @@ static struct dentry *splice_dentry(stru
 	if (IS_ERR(realdn)) {
 		pr_err("splice_dentry error %ld %p inode %p ino %llx.%llx\n",
 		       PTR_ERR(realdn), dn, in, ceph_vinop(in));
+		dput(dn);
 		dn = realdn; /* note realdn contains the error */
 		goto out;
 	} else if (realdn) {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/fs/ext4/mballoc.c linux-libre-4.9.124-gnu/fs/ext4/mballoc.c
--- linux-libre-4.9.123-gnu/fs/ext4/mballoc.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/fs/ext4/mballoc.c	2018-08-24 07:12:43.000000000 -0400
@@ -26,6 +26,7 @@
 #include <linux/log2.h>
 #include <linux/module.h>
 #include <linux/slab.h>
+#include <linux/nospec.h>
 #include <linux/backing-dev.h>
 #include <trace/events/ext4.h>
 
@@ -2144,7 +2145,8 @@ ext4_mb_regular_allocator(struct ext4_al
 		 * This should tell if fe_len is exactly power of 2
 		 */
 		if ((ac->ac_g_ex.fe_len & (~(1 << (i - 1)))) == 0)
-			ac->ac_2order = i - 1;
+			ac->ac_2order = array_index_nospec(i - 1,
+							   sb->s_blocksize_bits + 2);
 	}
 
 	/* if stream allocation is enabled, use global goal */
diff -druNp --no-dereference linux-libre-4.9.123-gnu/fs/reiserfs/xattr.c linux-libre-4.9.124-gnu/fs/reiserfs/xattr.c
--- linux-libre-4.9.123-gnu/fs/reiserfs/xattr.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/fs/reiserfs/xattr.c	2018-08-24 07:12:43.000000000 -0400
@@ -791,8 +791,10 @@ static int listxattr_filler(struct dir_c
 			return 0;
 		size = namelen + 1;
 		if (b->buf) {
-			if (size > b->size)
+			if (b->pos + size > b->size) {
+				b->pos = -ERANGE;
 				return -ERANGE;
+			}
 			memcpy(b->buf + b->pos, name, namelen);
 			b->buf[b->pos + namelen] = 0;
 		}
diff -druNp --no-dereference linux-libre-4.9.123-gnu/include/linux/fsl/guts.h linux-libre-4.9.124-gnu/include/linux/fsl/guts.h
--- linux-libre-4.9.123-gnu/include/linux/fsl/guts.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/include/linux/fsl/guts.h	2018-08-24 07:12:43.000000000 -0400
@@ -16,6 +16,7 @@
 #define __FSL_GUTS_H__
 
 #include <linux/types.h>
+#include <linux/io.h>
 
 /**
  * Global Utility Registers.
diff -druNp --no-dereference linux-libre-4.9.123-gnu/include/linux/pci.h linux-libre-4.9.124-gnu/include/linux/pci.h
--- linux-libre-4.9.123-gnu/include/linux/pci.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/include/linux/pci.h	2018-08-24 07:12:43.000000000 -0400
@@ -1190,6 +1190,8 @@ int pci_register_io_range(phys_addr_t ad
 unsigned long pci_address_to_pio(phys_addr_t addr);
 phys_addr_t pci_pio_to_address(unsigned long pio);
 int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr);
+int devm_pci_remap_iospace(struct device *dev, const struct resource *res,
+			   phys_addr_t phys_addr);
 void pci_unmap_iospace(struct resource *res);
 
 static inline pci_bus_addr_t pci_bus_address(struct pci_dev *pdev, int bar)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/include/net/ipv6.h linux-libre-4.9.124-gnu/include/net/ipv6.h
--- linux-libre-4.9.123-gnu/include/net/ipv6.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/include/net/ipv6.h	2018-08-24 07:12:43.000000000 -0400
@@ -312,14 +312,7 @@ struct ipv6_txoptions *ipv6_dup_options(
 struct ipv6_txoptions *ipv6_renew_options(struct sock *sk,
 					  struct ipv6_txoptions *opt,
 					  int newtype,
-					  struct ipv6_opt_hdr __user *newopt,
-					  int newoptlen);
-struct ipv6_txoptions *
-ipv6_renew_options_kern(struct sock *sk,
-			struct ipv6_txoptions *opt,
-			int newtype,
-			struct ipv6_opt_hdr *newopt,
-			int newoptlen);
+					  struct ipv6_opt_hdr *newopt);
 struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
 					  struct ipv6_txoptions *opt);
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/include/net/net_namespace.h linux-libre-4.9.124-gnu/include/net/net_namespace.h
--- linux-libre-4.9.123-gnu/include/net/net_namespace.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/include/net/net_namespace.h	2018-08-24 07:12:43.000000000 -0400
@@ -116,6 +116,7 @@ struct net {
 #endif
 #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)
 	struct netns_nf_frag	nf_frag;
+	struct ctl_table_header *nf_frag_frags_hdr;
 #endif
 	struct sock		*nfnl;
 	struct sock		*nfnl_stash;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/include/net/netns/ipv6.h linux-libre-4.9.124-gnu/include/net/netns/ipv6.h
--- linux-libre-4.9.123-gnu/include/net/netns/ipv6.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/include/net/netns/ipv6.h	2018-08-24 07:12:43.000000000 -0400
@@ -89,7 +89,6 @@ struct netns_ipv6 {
 
 #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)
 struct netns_nf_frag {
-	struct netns_sysctl_ipv6 sysctl;
 	struct netns_frags	frags;
 };
 #endif
diff -druNp --no-dereference linux-libre-4.9.123-gnu/include/net/tc_act/tc_tunnel_key.h linux-libre-4.9.124-gnu/include/net/tc_act/tc_tunnel_key.h
--- linux-libre-4.9.123-gnu/include/net/tc_act/tc_tunnel_key.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/include/net/tc_act/tc_tunnel_key.h	2018-08-24 07:12:43.000000000 -0400
@@ -16,7 +16,6 @@
 struct tcf_tunnel_key_params {
 	struct rcu_head		rcu;
 	int			tcft_action;
-	int			action;
 	struct metadata_dst     *tcft_enc_metadata;
 };
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/include/net/tcp.h linux-libre-4.9.124-gnu/include/net/tcp.h
--- linux-libre-4.9.123-gnu/include/net/tcp.h	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/include/net/tcp.h	2018-08-24 07:12:43.000000000 -0400
@@ -850,8 +850,6 @@ enum tcp_ca_event {
 	CA_EVENT_LOSS,		/* loss timeout */
 	CA_EVENT_ECN_NO_CE,	/* ECT set, but not CE marked */
 	CA_EVENT_ECN_IS_CE,	/* received CE marked IP packet */
-	CA_EVENT_DELAYED_ACK,	/* Delayed ack is sent */
-	CA_EVENT_NON_DELAYED_ACK,
 };
 
 /* Information about inbound ACK, passed to cong_ops->in_ack_event() */
diff -druNp --no-dereference linux-libre-4.9.123-gnu/kernel/locking/lockdep.c linux-libre-4.9.124-gnu/kernel/locking/lockdep.c
--- linux-libre-4.9.123-gnu/kernel/locking/lockdep.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/kernel/locking/lockdep.c	2018-08-24 07:12:43.000000000 -0400
@@ -1240,11 +1240,11 @@ unsigned long lockdep_count_forward_deps
 	this.parent = NULL;
 	this.class = class;
 
-	local_irq_save(flags);
+	raw_local_irq_save(flags);
 	arch_spin_lock(&lockdep_lock);
 	ret = __lockdep_count_forward_deps(&this);
 	arch_spin_unlock(&lockdep_lock);
-	local_irq_restore(flags);
+	raw_local_irq_restore(flags);
 
 	return ret;
 }
@@ -1267,11 +1267,11 @@ unsigned long lockdep_count_backward_dep
 	this.parent = NULL;
 	this.class = class;
 
-	local_irq_save(flags);
+	raw_local_irq_save(flags);
 	arch_spin_lock(&lockdep_lock);
 	ret = __lockdep_count_backward_deps(&this);
 	arch_spin_unlock(&lockdep_lock);
-	local_irq_restore(flags);
+	raw_local_irq_restore(flags);
 
 	return ret;
 }
@@ -4273,7 +4273,7 @@ void debug_check_no_locks_freed(const vo
 	if (unlikely(!debug_locks))
 		return;
 
-	local_irq_save(flags);
+	raw_local_irq_save(flags);
 	for (i = 0; i < curr->lockdep_depth; i++) {
 		hlock = curr->held_locks + i;
 
@@ -4284,7 +4284,7 @@ void debug_check_no_locks_freed(const vo
 		print_freed_lock_bug(curr, mem_from, mem_from + mem_len, hlock);
 		break;
 	}
-	local_irq_restore(flags);
+	raw_local_irq_restore(flags);
 }
 EXPORT_SYMBOL_GPL(debug_check_no_locks_freed);
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/kernel/trace/trace.c linux-libre-4.9.124-gnu/kernel/trace/trace.c
--- linux-libre-4.9.123-gnu/kernel/trace/trace.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/kernel/trace/trace.c	2018-08-24 07:12:43.000000000 -0400
@@ -2525,6 +2525,7 @@ out_nobuffer:
 }
 EXPORT_SYMBOL_GPL(trace_vbprintk);
 
+__printf(3, 0)
 static int
 __trace_array_vprintk(struct ring_buffer *buffer,
 		      unsigned long ip, const char *fmt, va_list args)
@@ -2579,12 +2580,14 @@ out_nobuffer:
 	return len;
 }
 
+__printf(3, 0)
 int trace_array_vprintk(struct trace_array *tr,
 			unsigned long ip, const char *fmt, va_list args)
 {
 	return __trace_array_vprintk(tr->trace_buffer.buffer, ip, fmt, args);
 }
 
+__printf(3, 0)
 int trace_array_printk(struct trace_array *tr,
 		       unsigned long ip, const char *fmt, ...)
 {
@@ -2600,6 +2603,7 @@ int trace_array_printk(struct trace_arra
 	return ret;
 }
 
+__printf(3, 4)
 int trace_array_printk_buf(struct ring_buffer *buffer,
 			   unsigned long ip, const char *fmt, ...)
 {
@@ -2615,6 +2619,7 @@ int trace_array_printk_buf(struct ring_b
 	return ret;
 }
 
+__printf(2, 0)
 int trace_vprintk(unsigned long ip, const char *fmt, va_list args)
 {
 	return trace_array_vprintk(&global_trace, ip, fmt, args);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/Makefile linux-libre-4.9.124-gnu/Makefile
--- linux-libre-4.9.123-gnu/Makefile	2018-08-22 10:12:45.000000000 -0400
+++ linux-libre-4.9.124-gnu/Makefile	2018-08-24 10:46:40.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 9
-SUBLEVEL = 123
+SUBLEVEL = 124
 EXTRAVERSION = -gnu
 NAME = Roaring Lionus
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/mm/kasan/kasan.c linux-libre-4.9.124-gnu/mm/kasan/kasan.c
--- linux-libre-4.9.123-gnu/mm/kasan/kasan.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/mm/kasan/kasan.c	2018-08-24 07:12:43.000000000 -0400
@@ -660,12 +660,13 @@ void kasan_kfree_large(const void *ptr)
 int kasan_module_alloc(void *addr, size_t size)
 {
 	void *ret;
+	size_t scaled_size;
 	size_t shadow_size;
 	unsigned long shadow_start;
 
 	shadow_start = (unsigned long)kasan_mem_to_shadow(addr);
-	shadow_size = round_up(size >> KASAN_SHADOW_SCALE_SHIFT,
-			PAGE_SIZE);
+	scaled_size = (size + KASAN_SHADOW_MASK) >> KASAN_SHADOW_SCALE_SHIFT;
+	shadow_size = round_up(scaled_size, PAGE_SIZE);
 
 	if (WARN_ON(!PAGE_ALIGNED(shadow_start)))
 		return -EINVAL;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/batman-adv/bat_iv_ogm.c linux-libre-4.9.124-gnu/net/batman-adv/bat_iv_ogm.c
--- linux-libre-4.9.123-gnu/net/batman-adv/bat_iv_ogm.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/batman-adv/bat_iv_ogm.c	2018-08-24 07:12:43.000000000 -0400
@@ -2704,7 +2704,7 @@ static int batadv_iv_gw_dump_entry(struc
 {
 	struct batadv_neigh_ifinfo *router_ifinfo = NULL;
 	struct batadv_neigh_node *router;
-	struct batadv_gw_node *curr_gw;
+	struct batadv_gw_node *curr_gw = NULL;
 	int ret = 0;
 	void *hdr;
 
@@ -2752,6 +2752,8 @@ static int batadv_iv_gw_dump_entry(struc
 	ret = 0;
 
 out:
+	if (curr_gw)
+		batadv_gw_node_put(curr_gw);
 	if (router_ifinfo)
 		batadv_neigh_ifinfo_put(router_ifinfo);
 	if (router)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/batman-adv/bat_v.c linux-libre-4.9.124-gnu/net/batman-adv/bat_v.c
--- linux-libre-4.9.123-gnu/net/batman-adv/bat_v.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/batman-adv/bat_v.c	2018-08-24 07:12:43.000000000 -0400
@@ -919,7 +919,7 @@ static int batadv_v_gw_dump_entry(struct
 {
 	struct batadv_neigh_ifinfo *router_ifinfo = NULL;
 	struct batadv_neigh_node *router;
-	struct batadv_gw_node *curr_gw;
+	struct batadv_gw_node *curr_gw = NULL;
 	int ret = 0;
 	void *hdr;
 
@@ -987,6 +987,8 @@ static int batadv_v_gw_dump_entry(struct
 	ret = 0;
 
 out:
+	if (curr_gw)
+		batadv_gw_node_put(curr_gw);
 	if (router_ifinfo)
 		batadv_neigh_ifinfo_put(router_ifinfo);
 	if (router)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/core/dev.c linux-libre-4.9.124-gnu/net/core/dev.c
--- linux-libre-4.9.123-gnu/net/core/dev.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/core/dev.c	2018-08-24 07:12:43.000000000 -0400
@@ -7945,7 +7945,8 @@ int dev_change_net_namespace(struct net_
 		/* We get here if we can't use the current device name */
 		if (!pat)
 			goto out;
-		if (dev_get_valid_name(net, dev, pat) < 0)
+		err = dev_get_valid_name(net, dev, pat);
+		if (err < 0)
 			goto out;
 	}
 
@@ -7957,7 +7958,6 @@ int dev_change_net_namespace(struct net_
 	dev_close(dev);
 
 	/* And unlink it from device chain */
-	err = -ENODEV;
 	unlist_netdevice(dev);
 
 	synchronize_net();
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ieee802154/6lowpan/core.c linux-libre-4.9.124-gnu/net/ieee802154/6lowpan/core.c
--- linux-libre-4.9.123-gnu/net/ieee802154/6lowpan/core.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ieee802154/6lowpan/core.c	2018-08-24 07:12:43.000000000 -0400
@@ -90,12 +90,18 @@ static int lowpan_neigh_construct(struct
 	return 0;
 }
 
+static int lowpan_get_iflink(const struct net_device *dev)
+{
+	return lowpan_802154_dev(dev)->wdev->ifindex;
+}
+
 static const struct net_device_ops lowpan_netdev_ops = {
 	.ndo_init		= lowpan_dev_init,
 	.ndo_start_xmit		= lowpan_xmit,
 	.ndo_open		= lowpan_open,
 	.ndo_stop		= lowpan_stop,
 	.ndo_neigh_construct    = lowpan_neigh_construct,
+	.ndo_get_iflink         = lowpan_get_iflink,
 };
 
 static void lowpan_setup(struct net_device *ldev)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv4/netfilter/ip_tables.c linux-libre-4.9.124-gnu/net/ipv4/netfilter/ip_tables.c
--- linux-libre-4.9.123-gnu/net/ipv4/netfilter/ip_tables.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv4/netfilter/ip_tables.c	2018-08-24 07:12:43.000000000 -0400
@@ -1913,6 +1913,7 @@ static struct xt_match ipt_builtin_mt[]
 		.checkentry = icmp_checkentry,
 		.proto      = IPPROTO_ICMP,
 		.family     = NFPROTO_IPV4,
+		.me	    = THIS_MODULE,
 	},
 };
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv4/tcp.c linux-libre-4.9.124-gnu/net/ipv4/tcp.c
--- linux-libre-4.9.123-gnu/net/ipv4/tcp.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv4/tcp.c	2018-08-24 07:12:43.000000000 -0400
@@ -1696,7 +1696,7 @@ int tcp_recvmsg(struct sock *sk, struct
 			 * shouldn't happen.
 			 */
 			if (WARN(before(*seq, TCP_SKB_CB(skb)->seq),
-				 "recvmsg bug: copied %X seq %X rcvnxt %X fl %X\n",
+				 "TCP recvmsg seq # bug: copied %X, seq %X, rcvnxt %X, fl %X\n",
 				 *seq, TCP_SKB_CB(skb)->seq, tp->rcv_nxt,
 				 flags))
 				break;
@@ -1711,7 +1711,7 @@ int tcp_recvmsg(struct sock *sk, struct
 			if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN)
 				goto found_fin_ok;
 			WARN(!(flags & MSG_PEEK),
-			     "recvmsg bug 2: copied %X seq %X rcvnxt %X fl %X\n",
+			     "TCP recvmsg seq # bug 2: copied %X, seq %X, rcvnxt %X, fl %X\n",
 			     *seq, TCP_SKB_CB(skb)->seq, tp->rcv_nxt, flags);
 		}
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv4/tcp_dctcp.c linux-libre-4.9.124-gnu/net/ipv4/tcp_dctcp.c
--- linux-libre-4.9.123-gnu/net/ipv4/tcp_dctcp.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv4/tcp_dctcp.c	2018-08-24 07:12:43.000000000 -0400
@@ -55,7 +55,6 @@ struct dctcp {
 	u32 dctcp_alpha;
 	u32 next_seq;
 	u32 ce_state;
-	u32 delayed_ack_reserved;
 	u32 loss_cwnd;
 };
 
@@ -96,7 +95,6 @@ static void dctcp_init(struct sock *sk)
 
 		ca->dctcp_alpha = min(dctcp_alpha_on_init, DCTCP_MAX_ALPHA);
 
-		ca->delayed_ack_reserved = 0;
 		ca->loss_cwnd = 0;
 		ca->ce_state = 0;
 
@@ -230,25 +228,6 @@ static void dctcp_state(struct sock *sk,
 	}
 }
 
-static void dctcp_update_ack_reserved(struct sock *sk, enum tcp_ca_event ev)
-{
-	struct dctcp *ca = inet_csk_ca(sk);
-
-	switch (ev) {
-	case CA_EVENT_DELAYED_ACK:
-		if (!ca->delayed_ack_reserved)
-			ca->delayed_ack_reserved = 1;
-		break;
-	case CA_EVENT_NON_DELAYED_ACK:
-		if (ca->delayed_ack_reserved)
-			ca->delayed_ack_reserved = 0;
-		break;
-	default:
-		/* Don't care for the rest. */
-		break;
-	}
-}
-
 static void dctcp_cwnd_event(struct sock *sk, enum tcp_ca_event ev)
 {
 	switch (ev) {
@@ -258,10 +237,6 @@ static void dctcp_cwnd_event(struct sock
 	case CA_EVENT_ECN_NO_CE:
 		dctcp_ce_state_1_to_0(sk);
 		break;
-	case CA_EVENT_DELAYED_ACK:
-	case CA_EVENT_NON_DELAYED_ACK:
-		dctcp_update_ack_reserved(sk, ev);
-		break;
 	default:
 		/* Don't care for the rest. */
 		break;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv4/tcp_output.c linux-libre-4.9.124-gnu/net/ipv4/tcp_output.c
--- linux-libre-4.9.123-gnu/net/ipv4/tcp_output.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv4/tcp_output.c	2018-08-24 07:12:43.000000000 -0400
@@ -3444,8 +3444,6 @@ void tcp_send_delayed_ack(struct sock *s
 	int ato = icsk->icsk_ack.ato;
 	unsigned long timeout;
 
-	tcp_ca_event(sk, CA_EVENT_DELAYED_ACK);
-
 	if (ato > TCP_DELACK_MIN) {
 		const struct tcp_sock *tp = tcp_sk(sk);
 		int max_ato = HZ / 2;
@@ -3502,8 +3500,6 @@ void __tcp_send_ack(struct sock *sk, u32
 	if (sk->sk_state == TCP_CLOSE)
 		return;
 
-	tcp_ca_event(sk, CA_EVENT_NON_DELAYED_ACK);
-
 	/* We are not putting this on the write queue, so
 	 * tcp_transmit_skb() will set the ownership to this
 	 * sock.
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv6/calipso.c linux-libre-4.9.124-gnu/net/ipv6/calipso.c
--- linux-libre-4.9.123-gnu/net/ipv6/calipso.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv6/calipso.c	2018-08-24 07:12:43.000000000 -0400
@@ -799,8 +799,7 @@ static int calipso_opt_update(struct soc
 {
 	struct ipv6_txoptions *old = txopt_get(inet6_sk(sk)), *txopts;
 
-	txopts = ipv6_renew_options_kern(sk, old, IPV6_HOPOPTS,
-					 hop, hop ? ipv6_optlen(hop) : 0);
+	txopts = ipv6_renew_options(sk, old, IPV6_HOPOPTS, hop);
 	txopt_put(old);
 	if (IS_ERR(txopts))
 		return PTR_ERR(txopts);
@@ -1222,8 +1221,7 @@ static int calipso_req_setattr(struct re
 	if (IS_ERR(new))
 		return PTR_ERR(new);
 
-	txopts = ipv6_renew_options_kern(sk, req_inet->ipv6_opt, IPV6_HOPOPTS,
-					 new, new ? ipv6_optlen(new) : 0);
+	txopts = ipv6_renew_options(sk, req_inet->ipv6_opt, IPV6_HOPOPTS, new);
 
 	kfree(new);
 
@@ -1260,8 +1258,7 @@ static void calipso_req_delattr(struct r
 	if (calipso_opt_del(req_inet->ipv6_opt->hopopt, &new))
 		return; /* Nothing to do */
 
-	txopts = ipv6_renew_options_kern(sk, req_inet->ipv6_opt, IPV6_HOPOPTS,
-					 new, new ? ipv6_optlen(new) : 0);
+	txopts = ipv6_renew_options(sk, req_inet->ipv6_opt, IPV6_HOPOPTS, new);
 
 	if (!IS_ERR(txopts)) {
 		txopts = xchg(&req_inet->ipv6_opt, txopts);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv6/exthdrs.c linux-libre-4.9.124-gnu/net/ipv6/exthdrs.c
--- linux-libre-4.9.123-gnu/net/ipv6/exthdrs.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv6/exthdrs.c	2018-08-24 07:12:43.000000000 -0400
@@ -760,29 +760,21 @@ ipv6_dup_options(struct sock *sk, struct
 }
 EXPORT_SYMBOL_GPL(ipv6_dup_options);
 
-static int ipv6_renew_option(void *ohdr,
-			     struct ipv6_opt_hdr __user *newopt, int newoptlen,
-			     int inherit,
-			     struct ipv6_opt_hdr **hdr,
-			     char **p)
+static void ipv6_renew_option(int renewtype,
+			      struct ipv6_opt_hdr **dest,
+			      struct ipv6_opt_hdr *old,
+			      struct ipv6_opt_hdr *new,
+			      int newtype, char **p)
 {
-	if (inherit) {
-		if (ohdr) {
-			memcpy(*p, ohdr, ipv6_optlen((struct ipv6_opt_hdr *)ohdr));
-			*hdr = (struct ipv6_opt_hdr *)*p;
-			*p += CMSG_ALIGN(ipv6_optlen(*hdr));
-		}
-	} else {
-		if (newopt) {
-			if (copy_from_user(*p, newopt, newoptlen))
-				return -EFAULT;
-			*hdr = (struct ipv6_opt_hdr *)*p;
-			if (ipv6_optlen(*hdr) > newoptlen)
-				return -EINVAL;
-			*p += CMSG_ALIGN(newoptlen);
-		}
-	}
-	return 0;
+	struct ipv6_opt_hdr *src;
+
+	src = (renewtype == newtype ? new : old);
+	if (!src)
+		return;
+
+	memcpy(*p, src, ipv6_optlen(src));
+	*dest = (struct ipv6_opt_hdr *)*p;
+	*p += CMSG_ALIGN(ipv6_optlen(*dest));
 }
 
 /**
@@ -808,13 +800,11 @@ static int ipv6_renew_option(void *ohdr,
  */
 struct ipv6_txoptions *
 ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt,
-		   int newtype,
-		   struct ipv6_opt_hdr __user *newopt, int newoptlen)
+		   int newtype, struct ipv6_opt_hdr *newopt)
 {
 	int tot_len = 0;
 	char *p;
 	struct ipv6_txoptions *opt2;
-	int err;
 
 	if (opt) {
 		if (newtype != IPV6_HOPOPTS && opt->hopopt)
@@ -827,8 +817,8 @@ ipv6_renew_options(struct sock *sk, stru
 			tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt));
 	}
 
-	if (newopt && newoptlen)
-		tot_len += CMSG_ALIGN(newoptlen);
+	if (newopt)
+		tot_len += CMSG_ALIGN(ipv6_optlen(newopt));
 
 	if (!tot_len)
 		return NULL;
@@ -843,29 +833,19 @@ ipv6_renew_options(struct sock *sk, stru
 	opt2->tot_len = tot_len;
 	p = (char *)(opt2 + 1);
 
-	err = ipv6_renew_option(opt ? opt->hopopt : NULL, newopt, newoptlen,
-				newtype != IPV6_HOPOPTS,
-				&opt2->hopopt, &p);
-	if (err)
-		goto out;
-
-	err = ipv6_renew_option(opt ? opt->dst0opt : NULL, newopt, newoptlen,
-				newtype != IPV6_RTHDRDSTOPTS,
-				&opt2->dst0opt, &p);
-	if (err)
-		goto out;
-
-	err = ipv6_renew_option(opt ? opt->srcrt : NULL, newopt, newoptlen,
-				newtype != IPV6_RTHDR,
-				(struct ipv6_opt_hdr **)&opt2->srcrt, &p);
-	if (err)
-		goto out;
-
-	err = ipv6_renew_option(opt ? opt->dst1opt : NULL, newopt, newoptlen,
-				newtype != IPV6_DSTOPTS,
-				&opt2->dst1opt, &p);
-	if (err)
-		goto out;
+	ipv6_renew_option(IPV6_HOPOPTS, &opt2->hopopt,
+			  (opt ? opt->hopopt : NULL),
+			  newopt, newtype, &p);
+	ipv6_renew_option(IPV6_RTHDRDSTOPTS, &opt2->dst0opt,
+			  (opt ? opt->dst0opt : NULL),
+			  newopt, newtype, &p);
+	ipv6_renew_option(IPV6_RTHDR,
+			  (struct ipv6_opt_hdr **)&opt2->srcrt,
+			  (opt ? (struct ipv6_opt_hdr *)opt->srcrt : NULL),
+			  newopt, newtype, &p);
+	ipv6_renew_option(IPV6_DSTOPTS, &opt2->dst1opt,
+			  (opt ? opt->dst1opt : NULL),
+			  newopt, newtype, &p);
 
 	opt2->opt_nflen = (opt2->hopopt ? ipv6_optlen(opt2->hopopt) : 0) +
 			  (opt2->dst0opt ? ipv6_optlen(opt2->dst0opt) : 0) +
@@ -873,37 +853,6 @@ ipv6_renew_options(struct sock *sk, stru
 	opt2->opt_flen = (opt2->dst1opt ? ipv6_optlen(opt2->dst1opt) : 0);
 
 	return opt2;
-out:
-	sock_kfree_s(sk, opt2, opt2->tot_len);
-	return ERR_PTR(err);
-}
-
-/**
- * ipv6_renew_options_kern - replace a specific ext hdr with a new one.
- *
- * @sk: sock from which to allocate memory
- * @opt: original options
- * @newtype: option type to replace in @opt
- * @newopt: new option of type @newtype to replace (kernel-mem)
- * @newoptlen: length of @newopt
- *
- * See ipv6_renew_options().  The difference is that @newopt is
- * kernel memory, rather than user memory.
- */
-struct ipv6_txoptions *
-ipv6_renew_options_kern(struct sock *sk, struct ipv6_txoptions *opt,
-			int newtype, struct ipv6_opt_hdr *newopt,
-			int newoptlen)
-{
-	struct ipv6_txoptions *ret_val;
-	const mm_segment_t old_fs = get_fs();
-
-	set_fs(KERNEL_DS);
-	ret_val = ipv6_renew_options(sk, opt, newtype,
-				     (struct ipv6_opt_hdr __user *)newopt,
-				     newoptlen);
-	set_fs(old_fs);
-	return ret_val;
 }
 
 struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space,
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv6/ipv6_sockglue.c linux-libre-4.9.124-gnu/net/ipv6/ipv6_sockglue.c
--- linux-libre-4.9.123-gnu/net/ipv6/ipv6_sockglue.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv6/ipv6_sockglue.c	2018-08-24 07:12:43.000000000 -0400
@@ -390,6 +390,12 @@ static int do_ipv6_setsockopt(struct soc
 	case IPV6_DSTOPTS:
 	{
 		struct ipv6_txoptions *opt;
+		struct ipv6_opt_hdr *new = NULL;
+
+		/* hop-by-hop / destination options are privileged option */
+		retv = -EPERM;
+		if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW))
+			break;
 
 		/* remove any sticky options header with a zero option
 		 * length, per RFC3542.
@@ -401,17 +407,22 @@ static int do_ipv6_setsockopt(struct soc
 		else if (optlen < sizeof(struct ipv6_opt_hdr) ||
 			 optlen & 0x7 || optlen > 8 * 255)
 			goto e_inval;
-
-		/* hop-by-hop / destination options are privileged option */
-		retv = -EPERM;
-		if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW))
-			break;
+		else {
+			new = memdup_user(optval, optlen);
+			if (IS_ERR(new)) {
+				retv = PTR_ERR(new);
+				break;
+			}
+			if (unlikely(ipv6_optlen(new) > optlen)) {
+				kfree(new);
+				goto e_inval;
+			}
+		}
 
 		opt = rcu_dereference_protected(np->opt,
 						lockdep_sock_is_held(sk));
-		opt = ipv6_renew_options(sk, opt, optname,
-					 (struct ipv6_opt_hdr __user *)optval,
-					 optlen);
+		opt = ipv6_renew_options(sk, opt, optname, new);
+		kfree(new);
 		if (IS_ERR(opt)) {
 			retv = PTR_ERR(opt);
 			break;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv6/mcast.c linux-libre-4.9.124-gnu/net/ipv6/mcast.c
--- linux-libre-4.9.123-gnu/net/ipv6/mcast.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv6/mcast.c	2018-08-24 07:12:43.000000000 -0400
@@ -2084,7 +2084,8 @@ void ipv6_mc_dad_complete(struct inet6_d
 		mld_send_initial_cr(idev);
 		idev->mc_dad_count--;
 		if (idev->mc_dad_count)
-			mld_dad_start_timer(idev, idev->mc_maxdelay);
+			mld_dad_start_timer(idev,
+					    unsolicited_report_interval(idev));
 	}
 }
 
@@ -2096,7 +2097,8 @@ static void mld_dad_timer_expire(unsigne
 	if (idev->mc_dad_count) {
 		idev->mc_dad_count--;
 		if (idev->mc_dad_count)
-			mld_dad_start_timer(idev, idev->mc_maxdelay);
+			mld_dad_start_timer(idev,
+					    unsolicited_report_interval(idev));
 	}
 	in6_dev_put(idev);
 }
@@ -2454,7 +2456,8 @@ static void mld_ifc_timer_expire(unsigne
 	if (idev->mc_ifc_count) {
 		idev->mc_ifc_count--;
 		if (idev->mc_ifc_count)
-			mld_ifc_start_timer(idev, idev->mc_maxdelay);
+			mld_ifc_start_timer(idev,
+					    unsolicited_report_interval(idev));
 	}
 	in6_dev_put(idev);
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv6/netfilter/ip6_tables.c linux-libre-4.9.124-gnu/net/ipv6/netfilter/ip6_tables.c
--- linux-libre-4.9.123-gnu/net/ipv6/netfilter/ip6_tables.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv6/netfilter/ip6_tables.c	2018-08-24 07:12:43.000000000 -0400
@@ -1934,6 +1934,7 @@ static struct xt_match ip6t_builtin_mt[]
 		.checkentry = icmp6_checkentry,
 		.proto      = IPPROTO_ICMPV6,
 		.family     = NFPROTO_IPV6,
+		.me	    = THIS_MODULE,
 	},
 };
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/ipv6/netfilter/nf_conntrack_reasm.c linux-libre-4.9.124-gnu/net/ipv6/netfilter/nf_conntrack_reasm.c
--- linux-libre-4.9.123-gnu/net/ipv6/netfilter/nf_conntrack_reasm.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/ipv6/netfilter/nf_conntrack_reasm.c	2018-08-24 07:12:43.000000000 -0400
@@ -117,7 +117,7 @@ static int nf_ct_frag6_sysctl_register(s
 	if (hdr == NULL)
 		goto err_reg;
 
-	net->nf_frag.sysctl.frags_hdr = hdr;
+	net->nf_frag_frags_hdr = hdr;
 	return 0;
 
 err_reg:
@@ -131,8 +131,8 @@ static void __net_exit nf_ct_frags6_sysc
 {
 	struct ctl_table *table;
 
-	table = net->nf_frag.sysctl.frags_hdr->ctl_table_arg;
-	unregister_net_sysctl_table(net->nf_frag.sysctl.frags_hdr);
+	table = net->nf_frag_frags_hdr->ctl_table_arg;
+	unregister_net_sysctl_table(net->nf_frag_frags_hdr);
 	if (!net_eq(net, &init_net))
 		kfree(table);
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/netfilter/nf_conntrack_core.c linux-libre-4.9.124-gnu/net/netfilter/nf_conntrack_core.c
--- linux-libre-4.9.123-gnu/net/netfilter/nf_conntrack_core.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/netfilter/nf_conntrack_core.c	2018-08-24 07:12:43.000000000 -0400
@@ -1822,7 +1822,7 @@ int nf_conntrack_set_hashsize(const char
 		return -EOPNOTSUPP;
 
 	/* On boot, we can set this without any fancy locking. */
-	if (!nf_conntrack_htable_size)
+	if (!nf_conntrack_hash)
 		return param_set_uint(val, kp);
 
 	rc = kstrtouint(val, 0, &hashsize);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/netfilter/nf_conntrack_proto_dccp.c linux-libre-4.9.124-gnu/net/netfilter/nf_conntrack_proto_dccp.c
--- linux-libre-4.9.123-gnu/net/netfilter/nf_conntrack_proto_dccp.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/netfilter/nf_conntrack_proto_dccp.c	2018-08-24 07:12:43.000000000 -0400
@@ -244,14 +244,14 @@ dccp_state_table[CT_DCCP_ROLE_MAX + 1][D
 		 * We currently ignore Sync packets
 		 *
 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
-			sIG, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
+			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
 		},
 		[DCCP_PKT_SYNCACK] = {
 		/*
 		 * We currently ignore SyncAck packets
 		 *
 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
-			sIG, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
+			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
 		},
 	},
 	[CT_DCCP_ROLE_SERVER] = {
@@ -372,14 +372,14 @@ dccp_state_table[CT_DCCP_ROLE_MAX + 1][D
 		 * We currently ignore Sync packets
 		 *
 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
-			sIG, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
+			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
 		},
 		[DCCP_PKT_SYNCACK] = {
 		/*
 		 * We currently ignore SyncAck packets
 		 *
 		 *	sNO, sRQ, sRS, sPO, sOP, sCR, sCG, sTW */
-			sIG, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
+			sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG,
 		},
 	},
 };
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/netfilter/nf_log.c linux-libre-4.9.124-gnu/net/netfilter/nf_log.c
--- linux-libre-4.9.123-gnu/net/netfilter/nf_log.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/netfilter/nf_log.c	2018-08-24 07:12:43.000000000 -0400
@@ -426,6 +426,10 @@ static int nf_log_proc_dostring(struct c
 	if (write) {
 		struct ctl_table tmp = *table;
 
+		/* proc_dostring() can append to existing strings, so we need to
+		 * initialize it as an empty string.
+		 */
+		buf[0] = '\0';
 		tmp.data = buf;
 		r = proc_dostring(&tmp, write, buffer, lenp, ppos);
 		if (r)
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/packet/af_packet.c linux-libre-4.9.124-gnu/net/packet/af_packet.c
--- linux-libre-4.9.123-gnu/net/packet/af_packet.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/packet/af_packet.c	2018-08-24 07:12:43.000000000 -0400
@@ -2917,6 +2917,8 @@ static int packet_snd(struct socket *soc
 			goto out_free;
 	} else if (reserve) {
 		skb_reserve(skb, -reserve);
+		if (len < reserve)
+			skb_reset_network_header(skb);
 	}
 
 	/* Returns -EFAULT on error */
@@ -4273,6 +4275,8 @@ static int packet_set_ring(struct sock *
 	}
 
 	if (req->tp_block_nr) {
+		unsigned int min_frame_size;
+
 		/* Sanity tests and some calculations */
 		err = -EBUSY;
 		if (unlikely(rb->pg_vec))
@@ -4295,12 +4299,12 @@ static int packet_set_ring(struct sock *
 			goto out;
 		if (unlikely(!PAGE_ALIGNED(req->tp_block_size)))
 			goto out;
+		min_frame_size = po->tp_hdrlen + po->tp_reserve;
 		if (po->tp_version >= TPACKET_V3 &&
-		    req->tp_block_size <=
-		    BLK_PLUS_PRIV((u64)req_u->req3.tp_sizeof_priv) + sizeof(struct tpacket3_hdr))
+		    req->tp_block_size <
+		    BLK_PLUS_PRIV((u64)req_u->req3.tp_sizeof_priv) + min_frame_size)
 			goto out;
-		if (unlikely(req->tp_frame_size < po->tp_hdrlen +
-					po->tp_reserve))
+		if (unlikely(req->tp_frame_size < min_frame_size))
 			goto out;
 		if (unlikely(req->tp_frame_size & (TPACKET_ALIGNMENT - 1)))
 			goto out;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/qrtr/qrtr.c linux-libre-4.9.124-gnu/net/qrtr/qrtr.c
--- linux-libre-4.9.123-gnu/net/qrtr/qrtr.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/qrtr/qrtr.c	2018-08-24 07:12:43.000000000 -0400
@@ -621,6 +621,10 @@ static int qrtr_sendmsg(struct socket *s
 	node = NULL;
 	if (addr->sq_node == QRTR_NODE_BCAST) {
 		enqueue_fn = qrtr_bcast_enqueue;
+		if (addr->sq_port != QRTR_PORT_CTRL) {
+			release_sock(sk);
+			return -ENOTCONN;
+		}
 	} else if (addr->sq_node == ipc->us.sq_node) {
 		enqueue_fn = qrtr_local_enqueue;
 	} else {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/sched/act_tunnel_key.c linux-libre-4.9.124-gnu/net/sched/act_tunnel_key.c
--- linux-libre-4.9.123-gnu/net/sched/act_tunnel_key.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/sched/act_tunnel_key.c	2018-08-24 07:12:43.000000000 -0400
@@ -39,7 +39,7 @@ static int tunnel_key_act(struct sk_buff
 
 	tcf_lastuse_update(&t->tcf_tm);
 	bstats_cpu_update(this_cpu_ptr(t->common.cpu_bstats), skb);
-	action = params->action;
+	action = READ_ONCE(t->tcf_action);
 
 	switch (params->tcft_action) {
 	case TCA_TUNNEL_KEY_ACT_RELEASE:
@@ -170,7 +170,7 @@ static int tunnel_key_init(struct net *n
 
 	params_old = rtnl_dereference(t->params);
 
-	params_new->action = parm->action;
+	t->tcf_action = parm->action;
 	params_new->tcft_action = parm->t_action;
 	params_new->tcft_enc_metadata = metadata;
 
@@ -242,13 +242,13 @@ static int tunnel_key_dump(struct sk_buf
 		.index    = t->tcf_index,
 		.refcnt   = t->tcf_refcnt - ref,
 		.bindcnt  = t->tcf_bindcnt - bind,
+		.action   = t->tcf_action,
 	};
 	struct tcf_t tm;
 
 	params = rtnl_dereference(t->params);
 
 	opt.t_action = params->tcft_action;
-	opt.action = params->action;
 
 	if (nla_put(skb, TCA_TUNNEL_KEY_PARMS, sizeof(opt), &opt))
 		goto nla_put_failure;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/wireless/nl80211.c linux-libre-4.9.124-gnu/net/wireless/nl80211.c
--- linux-libre-4.9.123-gnu/net/wireless/nl80211.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/wireless/nl80211.c	2018-08-24 07:12:43.000000000 -0400
@@ -5847,7 +5847,7 @@ do {									    \
 				  nl80211_check_s32);
 	/*
 	 * Check HT operation mode based on
-	 * IEEE 802.11 2012 8.4.2.59 HT Operation element.
+	 * IEEE 802.11-2016 9.4.2.57 HT Operation element.
 	 */
 	if (tb[NL80211_MESHCONF_HT_OPMODE]) {
 		ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]);
@@ -5857,22 +5857,9 @@ do {									    \
 				  IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
 			return -EINVAL;
 
-		if ((ht_opmode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) &&
-		    (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
-			return -EINVAL;
+		/* NON_HT_STA bit is reserved, but some programs set it */
+		ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
 
-		switch (ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION) {
-		case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
-		case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
-			if (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)
-				return -EINVAL;
-			break;
-		case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
-		case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
-			if (!(ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT))
-				return -EINVAL;
-			break;
-		}
 		cfg->ht_opmode = ht_opmode;
 		mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1));
 	}
diff -druNp --no-dereference linux-libre-4.9.123-gnu/net/xfrm/xfrm_user.c linux-libre-4.9.124-gnu/net/xfrm/xfrm_user.c
--- linux-libre-4.9.123-gnu/net/xfrm/xfrm_user.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/net/xfrm/xfrm_user.c	2018-08-24 07:12:43.000000000 -0400
@@ -1628,9 +1628,11 @@ static inline size_t userpolicy_type_att
 #ifdef CONFIG_XFRM_SUB_POLICY
 static int copy_to_user_policy_type(u8 type, struct sk_buff *skb)
 {
-	struct xfrm_userpolicy_type upt = {
-		.type = type,
-	};
+	struct xfrm_userpolicy_type upt;
+
+	/* Sadly there are two holes in struct xfrm_userpolicy_type */
+	memset(&upt, 0, sizeof(upt));
+	upt.type = type;
 
 	return nla_put(skb, XFRMA_POLICY_TYPE, sizeof(upt), &upt);
 }
diff -druNp --no-dereference linux-libre-4.9.123-gnu/samples/bpf/parse_varlen.c linux-libre-4.9.124-gnu/samples/bpf/parse_varlen.c
--- linux-libre-4.9.123-gnu/samples/bpf/parse_varlen.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/samples/bpf/parse_varlen.c	2018-08-24 07:12:43.000000000 -0400
@@ -6,6 +6,7 @@
  */
 #define KBUILD_MODNAME "foo"
 #include <linux/if_ether.h>
+#include <linux/if_vlan.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <linux/in.h>
@@ -108,11 +109,6 @@ static int parse_ipv6(void *data, uint64
 	return 0;
 }
 
-struct vlan_hdr {
-	uint16_t h_vlan_TCI;
-	uint16_t h_vlan_encapsulated_proto;
-};
-
 SEC("varlen")
 int handle_ingress(struct __sk_buff *skb)
 {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/samples/bpf/test_overhead_user.c linux-libre-4.9.124-gnu/samples/bpf/test_overhead_user.c
--- linux-libre-4.9.123-gnu/samples/bpf/test_overhead_user.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/samples/bpf/test_overhead_user.c	2018-08-24 07:12:43.000000000 -0400
@@ -6,6 +6,7 @@
  */
 #define _GNU_SOURCE
 #include <sched.h>
+#include <errno.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <asm/unistd.h>
@@ -44,8 +45,13 @@ static void test_task_rename(int cpu)
 		exit(1);
 	}
 	start_time = time_get_ns();
-	for (i = 0; i < MAX_CNT; i++)
-		write(fd, buf, sizeof(buf));
+	for (i = 0; i < MAX_CNT; i++) {
+		if (write(fd, buf, sizeof(buf)) < 0) {
+			printf("task rename failed: %s\n", strerror(errno));
+			close(fd);
+			return;
+		}
+	}
 	printf("task_rename:%d: %lld events per sec\n",
 	       cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
 	close(fd);
@@ -63,8 +69,13 @@ static void test_urandom_read(int cpu)
 		exit(1);
 	}
 	start_time = time_get_ns();
-	for (i = 0; i < MAX_CNT; i++)
-		read(fd, buf, sizeof(buf));
+	for (i = 0; i < MAX_CNT; i++) {
+		if (read(fd, buf, sizeof(buf)) < 0) {
+			printf("failed to read from /dev/urandom: %s\n", strerror(errno));
+			close(fd);
+			return;
+		}
+	}
 	printf("urandom_read:%d: %lld events per sec\n",
 	       cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
 	close(fd);
diff -druNp --no-dereference linux-libre-4.9.123-gnu/security/smack/smack_lsm.c linux-libre-4.9.124-gnu/security/smack/smack_lsm.c
--- linux-libre-4.9.123-gnu/security/smack/smack_lsm.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/security/smack/smack_lsm.c	2018-08-24 07:12:43.000000000 -0400
@@ -2307,6 +2307,7 @@ static void smack_task_to_inode(struct t
 	struct smack_known *skp = smk_of_task_struct(p);
 
 	isp->smk_inode = skp;
+	isp->smk_flags |= SMK_INODE_INSTANT;
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.9.123-gnu/sound/core/seq/seq_clientmgr.c linux-libre-4.9.124-gnu/sound/core/seq/seq_clientmgr.c
--- linux-libre-4.9.123-gnu/sound/core/seq/seq_clientmgr.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/sound/core/seq/seq_clientmgr.c	2018-08-24 07:12:43.000000000 -0400
@@ -2002,7 +2002,8 @@ static int snd_seq_ioctl_query_next_clie
 	struct snd_seq_client *cptr = NULL;
 
 	/* search for next client */
-	info->client++;
+	if (info->client < INT_MAX)
+		info->client++;
 	if (info->client < 0)
 		info->client = 0;
 	for (; info->client < SNDRV_SEQ_MAX_CLIENTS; info->client++) {
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/build/Makefile linux-libre-4.9.124-gnu/tools/build/Makefile
--- linux-libre-4.9.123-gnu/tools/build/Makefile	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/build/Makefile	2018-08-24 07:12:43.000000000 -0400
@@ -42,7 +42,7 @@ $(OUTPUT)fixdep-in.o: FORCE
 	$(Q)$(MAKE) $(build)=fixdep
 
 $(OUTPUT)fixdep: $(OUTPUT)fixdep-in.o
-	$(QUIET_LINK)$(HOSTCC) $(LDFLAGS) -o $@ $<
+	$(QUIET_LINK)$(HOSTCC) $(HOSTLDFLAGS) -o $@ $<
 
 FORCE:
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/objtool/elf.c linux-libre-4.9.124-gnu/tools/objtool/elf.c
--- linux-libre-4.9.123-gnu/tools/objtool/elf.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/objtool/elf.c	2018-08-24 07:12:43.000000000 -0400
@@ -302,19 +302,34 @@ static int read_symbols(struct elf *elf)
 				continue;
 			sym->pfunc = sym->cfunc = sym;
 			coldstr = strstr(sym->name, ".cold.");
-			if (coldstr) {
-				coldstr[0] = '\0';
-				pfunc = find_symbol_by_name(elf, sym->name);
-				coldstr[0] = '.';
+			if (!coldstr)
+				continue;
 
-				if (!pfunc) {
-					WARN("%s(): can't find parent function",
-					     sym->name);
-					goto err;
-				}
+			coldstr[0] = '\0';
+			pfunc = find_symbol_by_name(elf, sym->name);
+			coldstr[0] = '.';
 
-				sym->pfunc = pfunc;
-				pfunc->cfunc = sym;
+			if (!pfunc) {
+				WARN("%s(): can't find parent function",
+				     sym->name);
+				goto err;
+			}
+
+			sym->pfunc = pfunc;
+			pfunc->cfunc = sym;
+
+			/*
+			 * Unfortunately, -fnoreorder-functions puts the child
+			 * inside the parent.  Remove the overlap so we can
+			 * have sane assumptions.
+			 *
+			 * Note that pfunc->len now no longer matches
+			 * pfunc->sym.st_size.
+			 */
+			if (sym->sec == pfunc->sec &&
+			    sym->offset >= pfunc->offset &&
+			    sym->offset + sym->len == pfunc->offset + pfunc->len) {
+				pfunc->len -= sym->len;
 			}
 		}
 	}
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c linux-libre-4.9.124-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c
--- linux-libre-4.9.123-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c	2018-08-24 07:12:43.000000000 -0400
@@ -243,7 +243,7 @@ int arch_skip_callchain_idx(struct threa
 	u64 ip;
 	u64 skip_slot = -1;
 
-	if (chain->nr < 3)
+	if (!chain || chain->nr < 3)
 		return skip_slot;
 
 	ip = chain->ips[2];
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/perf/bench/numa.c linux-libre-4.9.124-gnu/tools/perf/bench/numa.c
--- linux-libre-4.9.123-gnu/tools/perf/bench/numa.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/perf/bench/numa.c	2018-08-24 07:12:43.000000000 -0400
@@ -1093,7 +1093,7 @@ static void *worker_thread(void *__tdata
 	u8 *global_data;
 	u8 *process_data;
 	u8 *thread_data;
-	u64 bytes_done;
+	u64 bytes_done, secs;
 	long work_done;
 	u32 l;
 	struct rusage rusage;
@@ -1249,7 +1249,8 @@ static void *worker_thread(void *__tdata
 	timersub(&stop, &start0, &diff);
 	td->runtime_ns = diff.tv_sec * NSEC_PER_SEC;
 	td->runtime_ns += diff.tv_usec * NSEC_PER_USEC;
-	td->speed_gbs = bytes_done / (td->runtime_ns / NSEC_PER_SEC) / 1e9;
+	secs = td->runtime_ns / NSEC_PER_SEC;
+	td->speed_gbs = secs ? bytes_done / secs / 1e9 : 0;
 
 	getrusage(RUSAGE_THREAD, &rusage);
 	td->system_time_ns = rusage.ru_stime.tv_sec * NSEC_PER_SEC;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/perf/tests/topology.c linux-libre-4.9.124-gnu/tools/perf/tests/topology.c
--- linux-libre-4.9.123-gnu/tools/perf/tests/topology.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/perf/tests/topology.c	2018-08-24 07:12:43.000000000 -0400
@@ -42,6 +42,7 @@ static int session_write_header(char *pa
 
 	perf_header__set_feat(&session->header, HEADER_CPU_TOPOLOGY);
 	perf_header__set_feat(&session->header, HEADER_NRCPUS);
+	perf_header__set_feat(&session->header, HEADER_ARCH);
 
 	session->header.data_size += DATA_SIZE;
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/perf/util/llvm-utils.c linux-libre-4.9.124-gnu/tools/perf/util/llvm-utils.c
--- linux-libre-4.9.123-gnu/tools/perf/util/llvm-utils.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/perf/util/llvm-utils.c	2018-08-24 07:12:43.000000000 -0400
@@ -260,16 +260,16 @@ static const char *kinc_fetch_script =
 "#!/usr/bin/env sh\n"
 "if ! test -d \"$KBUILD_DIR\"\n"
 "then\n"
-"	exit -1\n"
+"	exit 1\n"
 "fi\n"
 "if ! test -f \"$KBUILD_DIR/include/generated/autoconf.h\"\n"
 "then\n"
-"	exit -1\n"
+"	exit 1\n"
 "fi\n"
 "TMPDIR=`mktemp -d`\n"
 "if test -z \"$TMPDIR\"\n"
 "then\n"
-"    exit -1\n"
+"    exit 1\n"
 "fi\n"
 "cat << EOF > $TMPDIR/Makefile\n"
 "obj-y := dummy.o\n"
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/testing/selftests/pstore/pstore_post_reboot_tests linux-libre-4.9.124-gnu/tools/testing/selftests/pstore/pstore_post_reboot_tests
--- linux-libre-4.9.123-gnu/tools/testing/selftests/pstore/pstore_post_reboot_tests	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/testing/selftests/pstore/pstore_post_reboot_tests	2018-08-24 07:12:43.000000000 -0400
@@ -7,13 +7,16 @@
 #
 # Released under the terms of the GPL v2.
 
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
 . ./common_tests
 
 if [ -e $REBOOT_FLAG  ]; then
     rm $REBOOT_FLAG
 else
     prlog "pstore_crash_test has not been executed yet. we skip further tests."
-    exit 0
+    exit $ksft_skip
 fi
 
 prlog -n "Mounting pstore filesystem ... "
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/testing/selftests/static_keys/test_static_keys.sh linux-libre-4.9.124-gnu/tools/testing/selftests/static_keys/test_static_keys.sh
--- linux-libre-4.9.123-gnu/tools/testing/selftests/static_keys/test_static_keys.sh	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/testing/selftests/static_keys/test_static_keys.sh	2018-08-24 07:12:43.000000000 -0400
@@ -1,6 +1,19 @@
 #!/bin/sh
 # Runs static keys kernel module tests
 
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
+if ! /sbin/modprobe -q -n test_static_key_base; then
+	echo "static_key: module test_static_key_base is not found [SKIP]"
+	exit $ksft_skip
+fi
+
+if ! /sbin/modprobe -q -n test_static_keys; then
+	echo "static_key: module test_static_keys is not found [SKIP]"
+	exit $ksft_skip
+fi
+
 if /sbin/modprobe -q test_static_key_base; then
 	if /sbin/modprobe -q test_static_keys; then
 		echo "static_key: ok"
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/testing/selftests/sync/config linux-libre-4.9.124-gnu/tools/testing/selftests/sync/config
--- linux-libre-4.9.123-gnu/tools/testing/selftests/sync/config	1969-12-31 19:00:00.000000000 -0500
+++ linux-libre-4.9.124-gnu/tools/testing/selftests/sync/config	2018-08-24 07:12:43.000000000 -0400
@@ -0,0 +1,4 @@
+CONFIG_STAGING=y
+CONFIG_ANDROID=y
+CONFIG_SYNC=y
+CONFIG_SW_SYNC=y
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/testing/selftests/user/test_user_copy.sh linux-libre-4.9.124-gnu/tools/testing/selftests/user/test_user_copy.sh
--- linux-libre-4.9.123-gnu/tools/testing/selftests/user/test_user_copy.sh	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/testing/selftests/user/test_user_copy.sh	2018-08-24 07:12:43.000000000 -0400
@@ -1,6 +1,13 @@
 #!/bin/sh
 # Runs copy_to/from_user infrastructure using test_user_copy kernel module
 
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
+if ! /sbin/modprobe -q -n test_user_copy; then
+	echo "user: module test_user_copy is not found [SKIP]"
+	exit $ksft_skip
+fi
 if /sbin/modprobe -q test_user_copy; then
 	/sbin/modprobe -q -r test_user_copy
 	echo "user_copy: ok"
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/testing/selftests/x86/sigreturn.c linux-libre-4.9.124-gnu/tools/testing/selftests/x86/sigreturn.c
--- linux-libre-4.9.123-gnu/tools/testing/selftests/x86/sigreturn.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/testing/selftests/x86/sigreturn.c	2018-08-24 07:12:43.000000000 -0400
@@ -610,21 +610,41 @@ static int test_valid_sigreturn(int cs_b
 	 */
 	for (int i = 0; i < NGREG; i++) {
 		greg_t req = requested_regs[i], res = resulting_regs[i];
+
 		if (i == REG_TRAPNO || i == REG_IP)
 			continue;	/* don't care */
-		if (i == REG_SP) {
-			printf("\tSP: %llx -> %llx\n", (unsigned long long)req,
-			       (unsigned long long)res);
 
+		if (i == REG_SP) {
 			/*
-			 * In many circumstances, the high 32 bits of rsp
-			 * are zeroed.  For example, we could be a real
-			 * 32-bit program, or we could hit any of a number
-			 * of poorly-documented IRET or segmented ESP
-			 * oddities.  If this happens, it's okay.
+			 * If we were using a 16-bit stack segment, then
+			 * the kernel is a bit stuck: IRET only restores
+			 * the low 16 bits of ESP/RSP if SS is 16-bit.
+			 * The kernel uses a hack to restore bits 31:16,
+			 * but that hack doesn't help with bits 63:32.
+			 * On Intel CPUs, bits 63:32 end up zeroed, and, on
+			 * AMD CPUs, they leak the high bits of the kernel
+			 * espfix64 stack pointer.  There's very little that
+			 * the kernel can do about it.
+			 *
+			 * Similarly, if we are returning to a 32-bit context,
+			 * the CPU will often lose the high 32 bits of RSP.
 			 */
-			if (res == (req & 0xFFFFFFFF))
-				continue;  /* OK; not expected to work */
+
+			if (res == req)
+				continue;
+
+			if (cs_bits != 64 && ((res ^ req) & 0xFFFFFFFF) == 0) {
+				printf("[NOTE]\tSP: %llx -> %llx\n",
+				       (unsigned long long)req,
+				       (unsigned long long)res);
+				continue;
+			}
+
+			printf("[FAIL]\tSP mismatch: requested 0x%llx; got 0x%llx\n",
+			       (unsigned long long)requested_regs[i],
+			       (unsigned long long)resulting_regs[i]);
+			nerrs++;
+			continue;
 		}
 
 		bool ignore_reg = false;
@@ -654,25 +674,18 @@ static int test_valid_sigreturn(int cs_b
 #endif
 
 		/* Sanity check on the kernel */
-		if (i == REG_CX && requested_regs[i] != resulting_regs[i]) {
+		if (i == REG_CX && req != res) {
 			printf("[FAIL]\tCX (saved SP) mismatch: requested 0x%llx; got 0x%llx\n",
-			       (unsigned long long)requested_regs[i],
-			       (unsigned long long)resulting_regs[i]);
+			       (unsigned long long)req,
+			       (unsigned long long)res);
 			nerrs++;
 			continue;
 		}
 
-		if (requested_regs[i] != resulting_regs[i] && !ignore_reg) {
-			/*
-			 * SP is particularly interesting here.  The
-			 * usual cause of failures is that we hit the
-			 * nasty IRET case of returning to a 16-bit SS,
-			 * in which case bits 16:31 of the *kernel*
-			 * stack pointer persist in ESP.
-			 */
+		if (req != res && !ignore_reg) {
 			printf("[FAIL]\tReg %d mismatch: requested 0x%llx; got 0x%llx\n",
-			       i, (unsigned long long)requested_regs[i],
-			       (unsigned long long)resulting_regs[i]);
+			       i, (unsigned long long)req,
+			       (unsigned long long)res);
 			nerrs++;
 		}
 	}
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/testing/selftests/zram/zram_lib.sh linux-libre-4.9.124-gnu/tools/testing/selftests/zram/zram_lib.sh
--- linux-libre-4.9.123-gnu/tools/testing/selftests/zram/zram_lib.sh	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/testing/selftests/zram/zram_lib.sh	2018-08-24 07:12:43.000000000 -0400
@@ -18,6 +18,9 @@ MODULE=0
 dev_makeswap=-1
 dev_mounted=-1
 
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
 trap INT
 
 check_prereqs()
@@ -27,7 +30,7 @@ check_prereqs()
 
 	if [ $uid -ne 0 ]; then
 		echo $msg must be run as root >&2
-		exit 0
+		exit $ksft_skip
 	fi
 }
 
diff -druNp --no-dereference linux-libre-4.9.123-gnu/tools/testing/selftests/zram/zram.sh linux-libre-4.9.124-gnu/tools/testing/selftests/zram/zram.sh
--- linux-libre-4.9.123-gnu/tools/testing/selftests/zram/zram.sh	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/tools/testing/selftests/zram/zram.sh	2018-08-24 07:12:43.000000000 -0400
@@ -1,6 +1,9 @@
 #!/bin/bash
 TCID="zram.sh"
 
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
 . ./zram_lib.sh
 
 run_zram () {
@@ -23,5 +26,5 @@ elif [ -b /dev/zram0 ]; then
 else
 	echo "$TCID : No zram.ko module or /dev/zram0 device file not found"
 	echo "$TCID : CONFIG_ZRAM is not set"
-	exit 1
+	exit $ksft_skip
 fi
diff -druNp --no-dereference linux-libre-4.9.123-gnu/virt/kvm/arm/vgic/vgic-v3.c linux-libre-4.9.124-gnu/virt/kvm/arm/vgic/vgic-v3.c
--- linux-libre-4.9.123-gnu/virt/kvm/arm/vgic/vgic-v3.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/virt/kvm/arm/vgic/vgic-v3.c	2018-08-24 07:12:43.000000000 -0400
@@ -337,11 +337,6 @@ int vgic_v3_probe(const struct gic_kvm_i
 		pr_warn("GICV physical address 0x%llx not page aligned\n",
 			(unsigned long long)info->vcpu.start);
 		kvm_vgic_global_state.vcpu_base = 0;
-	} else if (!PAGE_ALIGNED(resource_size(&info->vcpu))) {
-		pr_warn("GICV size 0x%llx not a multiple of page size 0x%lx\n",
-			(unsigned long long)resource_size(&info->vcpu),
-			PAGE_SIZE);
-		kvm_vgic_global_state.vcpu_base = 0;
 	} else {
 		kvm_vgic_global_state.vcpu_base = info->vcpu.start;
 		kvm_vgic_global_state.can_emulate_gicv2 = true;
diff -druNp --no-dereference linux-libre-4.9.123-gnu/virt/kvm/eventfd.c linux-libre-4.9.124-gnu/virt/kvm/eventfd.c
--- linux-libre-4.9.123-gnu/virt/kvm/eventfd.c	2018-08-22 01:47:16.000000000 -0400
+++ linux-libre-4.9.124-gnu/virt/kvm/eventfd.c	2018-08-24 07:12:43.000000000 -0400
@@ -405,11 +405,6 @@ kvm_irqfd_assign(struct kvm *kvm, struct
 	if (events & POLLIN)
 		schedule_work(&irqfd->inject);
 
-	/*
-	 * do not drop the file until the irqfd is fully initialized, otherwise
-	 * we might race against the POLLHUP
-	 */
-	fdput(f);
 #ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
 	if (kvm_arch_has_irq_bypass()) {
 		irqfd->consumer.token = (void *)irqfd->eventfd;
@@ -425,6 +420,12 @@ kvm_irqfd_assign(struct kvm *kvm, struct
 #endif
 
 	srcu_read_unlock(&kvm->irq_srcu, idx);
+
+	/*
+	 * do not drop the file until the irqfd is fully initialized, otherwise
+	 * we might race against the POLLHUP
+	 */
+	fdput(f);
 	return 0;
 
 fail:
