diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axc001.dtsi linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axc001.dtsi
--- linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axc001.dtsi	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axc001.dtsi	2017-08-27 20:20:40.000000000 -0400
@@ -15,15 +15,15 @@
 
 / {
 	compatible = "snps,arc";
-	#address-cells = <1>;
-	#size-cells = <1>;
+	#address-cells = <2>;
+	#size-cells = <2>;
 
 	cpu_card {
 		compatible = "simple-bus";
 		#address-cells = <1>;
 		#size-cells = <1>;
 
-		ranges = <0x00000000 0xf0000000 0x10000000>;
+		ranges = <0x00000000 0x0 0xf0000000 0x10000000>;
 
 		core_clk: core_clk {
 			#clock-cells = <0>;
@@ -91,23 +91,21 @@
 	mb_intc: dw-apb-ictl@0xe0012000 {
 		#interrupt-cells = <1>;
 		compatible = "snps,dw-apb-ictl";
-		reg = < 0xe0012000 0x200 >;
+		reg = < 0x0 0xe0012000 0x0 0x200 >;
 		interrupt-controller;
 		interrupt-parent = <&core_intc>;
 		interrupts = < 7 >;
 	};
 
 	memory {
-		#address-cells = <1>;
-		#size-cells = <1>;
-		ranges = <0x00000000 0x80000000 0x20000000>;
 		device_type = "memory";
-		reg = <0x80000000 0x1b000000>;	/* (512 - 32) MiB */
+		/* CONFIG_KERNEL_RAM_BASE_ADDRESS needs to match low mem start */
+		reg = <0x0 0x80000000 0x0 0x1b000000>;	/* (512 - 32) MiB */
 	};
 
 	reserved-memory {
-		#address-cells = <1>;
-		#size-cells = <1>;
+		#address-cells = <2>;
+		#size-cells = <2>;
 		ranges;
 		/*
 		 * We just move frame buffer area to the very end of
@@ -118,7 +116,7 @@
 		 */
 		frame_buffer: frame_buffer@9e000000 {
 			compatible = "shared-dma-pool";
-			reg = <0x9e000000 0x2000000>;
+			reg = <0x0 0x9e000000 0x0 0x2000000>;
 			no-map;
 		};
 	};
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axc003.dtsi linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axc003.dtsi
--- linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axc003.dtsi	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axc003.dtsi	2017-08-27 20:20:40.000000000 -0400
@@ -14,15 +14,15 @@
 
 / {
 	compatible = "snps,arc";
-	#address-cells = <1>;
-	#size-cells = <1>;
+	#address-cells = <2>;
+	#size-cells = <2>;
 
 	cpu_card {
 		compatible = "simple-bus";
 		#address-cells = <1>;
 		#size-cells = <1>;
 
-		ranges = <0x00000000 0xf0000000 0x10000000>;
+		ranges = <0x00000000 0x0 0xf0000000 0x10000000>;
 
 		core_clk: core_clk {
 			#clock-cells = <0>;
@@ -94,30 +94,29 @@
 	mb_intc: dw-apb-ictl@0xe0012000 {
 		#interrupt-cells = <1>;
 		compatible = "snps,dw-apb-ictl";
-		reg = < 0xe0012000 0x200 >;
+		reg = < 0x0 0xe0012000 0x0 0x200 >;
 		interrupt-controller;
 		interrupt-parent = <&core_intc>;
 		interrupts = < 24 >;
 	};
 
 	memory {
-		#address-cells = <1>;
-		#size-cells = <1>;
-		ranges = <0x00000000 0x80000000 0x40000000>;
 		device_type = "memory";
-		reg = <0x80000000 0x20000000>;	/* 512MiB */
+		/* CONFIG_KERNEL_RAM_BASE_ADDRESS needs to match low mem start */
+		reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MiB low mem */
+		       0x1 0xc0000000 0x0 0x40000000>;	/* 1 GiB highmem */
 	};
 
 	reserved-memory {
-		#address-cells = <1>;
-		#size-cells = <1>;
+		#address-cells = <2>;
+		#size-cells = <2>;
 		ranges;
 		/*
 		 * Move frame buffer out of IOC aperture (0x8z-0xAz).
 		 */
 		frame_buffer: frame_buffer@be000000 {
 			compatible = "shared-dma-pool";
-			reg = <0xbe000000 0x2000000>;
+			reg = <0x0 0xbe000000 0x0 0x2000000>;
 			no-map;
 		};
 	};
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axc003_idu.dtsi linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axc003_idu.dtsi
--- linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axc003_idu.dtsi	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axc003_idu.dtsi	2017-08-27 20:20:40.000000000 -0400
@@ -14,15 +14,15 @@
 
 / {
 	compatible = "snps,arc";
-	#address-cells = <1>;
-	#size-cells = <1>;
+	#address-cells = <2>;
+	#size-cells = <2>;
 
 	cpu_card {
 		compatible = "simple-bus";
 		#address-cells = <1>;
 		#size-cells = <1>;
 
-		ranges = <0x00000000 0xf0000000 0x10000000>;
+		ranges = <0x00000000 0x0 0xf0000000 0x10000000>;
 
 		core_clk: core_clk {
 			#clock-cells = <0>;
@@ -100,30 +100,29 @@
 	mb_intc: dw-apb-ictl@0xe0012000 {
 		#interrupt-cells = <1>;
 		compatible = "snps,dw-apb-ictl";
-		reg = < 0xe0012000 0x200 >;
+		reg = < 0x0 0xe0012000 0x0 0x200 >;
 		interrupt-controller;
 		interrupt-parent = <&idu_intc>;
 		interrupts = <0>;
 	};
 
 	memory {
-		#address-cells = <1>;
-		#size-cells = <1>;
-		ranges = <0x00000000 0x80000000 0x40000000>;
 		device_type = "memory";
-		reg = <0x80000000 0x20000000>;	/* 512MiB */
+		/* CONFIG_KERNEL_RAM_BASE_ADDRESS needs to match low mem start */
+		reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MiB low mem */
+		       0x1 0xc0000000 0x0 0x40000000>;	/* 1 GiB highmem */
 	};
 
 	reserved-memory {
-		#address-cells = <1>;
-		#size-cells = <1>;
+		#address-cells = <2>;
+		#size-cells = <2>;
 		ranges;
 		/*
 		 * Move frame buffer out of IOC aperture (0x8z-0xAz).
 		 */
 		frame_buffer: frame_buffer@be000000 {
 			compatible = "shared-dma-pool";
-			reg = <0xbe000000 0x2000000>;
+			reg = <0x0 0xbe000000 0x0 0x2000000>;
 			no-map;
 		};
 	};
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axs10x_mb.dtsi linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axs10x_mb.dtsi
--- linux-libre-4.13-rc6-gnu/arch/arc/boot/dts/axs10x_mb.dtsi	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/boot/dts/axs10x_mb.dtsi	2017-08-27 20:20:40.000000000 -0400
@@ -13,7 +13,7 @@
 		compatible = "simple-bus";
 		#address-cells = <1>;
 		#size-cells = <1>;
-		ranges = <0x00000000 0xe0000000 0x10000000>;
+		ranges = <0x00000000 0x0 0xe0000000 0x10000000>;
 		interrupt-parent = <&mb_intc>;
 
 		i2sclk: i2sclk@100a0 {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/haps_hs_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/haps_hs_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/haps_hs_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/haps_hs_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -21,7 +21,6 @@ CONFIG_MODULES=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ISA_ARCV2=y
 CONFIG_ARC_BUILTIN_DTB_NAME="haps_hs"
 CONFIG_PREEMPT=y
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/haps_hs_smp_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/haps_hs_smp_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/haps_hs_smp_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/haps_hs_smp_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -23,7 +23,6 @@ CONFIG_MODULES=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ISA_ARCV2=y
 CONFIG_SMP=y
 CONFIG_ARC_BUILTIN_DTB_NAME="haps_hs_idu"
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/nps_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/nps_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/nps_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/nps_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -39,7 +39,6 @@ CONFIG_IP_PNP=y
 # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
 # CONFIG_INET_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_WIRELESS is not set
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/nsim_700_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/nsim_700_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/nsim_700_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/nsim_700_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -23,7 +23,6 @@ CONFIG_MODULES=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ARC_BUILTIN_DTB_NAME="nsim_700"
 CONFIG_PREEMPT=y
 # CONFIG_COMPACTION is not set
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/nsim_hs_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/nsim_hs_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/nsim_hs_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/nsim_hs_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -26,7 +26,6 @@ CONFIG_MODULE_FORCE_UNLOAD=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ISA_ARCV2=y
 CONFIG_ARC_BUILTIN_DTB_NAME="nsim_hs"
 CONFIG_PREEMPT=y
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/nsim_hs_smp_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/nsim_hs_smp_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/nsim_hs_smp_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/nsim_hs_smp_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -24,7 +24,6 @@ CONFIG_MODULE_FORCE_UNLOAD=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ISA_ARCV2=y
 CONFIG_SMP=y
 CONFIG_ARC_BUILTIN_DTB_NAME="nsim_hs_idu"
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/nsimosci_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/nsimosci_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/nsimosci_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/nsimosci_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -23,7 +23,6 @@ CONFIG_MODULES=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci"
 # CONFIG_COMPACTION is not set
 CONFIG_NET=y
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/nsimosci_hs_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/nsimosci_hs_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/nsimosci_hs_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/nsimosci_hs_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -23,7 +23,6 @@ CONFIG_MODULES=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ISA_ARCV2=y
 CONFIG_ARC_BUILTIN_DTB_NAME="nsimosci_hs"
 # CONFIG_COMPACTION is not set
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/nsimosci_hs_smp_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/nsimosci_hs_smp_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/nsimosci_hs_smp_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/nsimosci_hs_smp_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -18,7 +18,6 @@ CONFIG_MODULES=y
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
 # CONFIG_IOSCHED_CFQ is not set
-CONFIG_ARC_PLAT_SIM=y
 CONFIG_ISA_ARCV2=y
 CONFIG_SMP=y
 # CONFIG_ARC_TIMERS_64BIT is not set
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/configs/tb10x_defconfig linux-libre-4.13-rc7-gnu/arch/arc/configs/tb10x_defconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/configs/tb10x_defconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/configs/tb10x_defconfig	2017-08-27 20:20:40.000000000 -0400
@@ -38,7 +38,6 @@ CONFIG_IP_MULTICAST=y
 # CONFIG_INET_XFRM_MODE_TRANSPORT is not set
 # CONFIG_INET_XFRM_MODE_TUNNEL is not set
 # CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_LRO is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_WIRELESS is not set
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/include/asm/cache.h linux-libre-4.13-rc7-gnu/arch/arc/include/asm/cache.h
--- linux-libre-4.13-rc6-gnu/arch/arc/include/asm/cache.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/include/asm/cache.h	2017-08-27 20:20:40.000000000 -0400
@@ -96,7 +96,9 @@ extern unsigned long perip_base, perip_e
 #define ARC_REG_SLC_FLUSH	0x904
 #define ARC_REG_SLC_INVALIDATE	0x905
 #define ARC_REG_SLC_RGN_START	0x914
+#define ARC_REG_SLC_RGN_START1	0x915
 #define ARC_REG_SLC_RGN_END	0x916
+#define ARC_REG_SLC_RGN_END1	0x917
 
 /* Bit val in SLC_CONTROL */
 #define SLC_CTRL_DIS		0x001
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/include/asm/mmu.h linux-libre-4.13-rc7-gnu/arch/arc/include/asm/mmu.h
--- linux-libre-4.13-rc6-gnu/arch/arc/include/asm/mmu.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/include/asm/mmu.h	2017-08-27 20:20:40.000000000 -0400
@@ -94,6 +94,8 @@ static inline int is_pae40_enabled(void)
 	return IS_ENABLED(CONFIG_ARC_HAS_PAE40);
 }
 
+extern int pae40_exist_but_not_enab(void);
+
 #endif	/* !__ASSEMBLY__ */
 
 #endif
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/Kconfig linux-libre-4.13-rc7-gnu/arch/arc/Kconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/Kconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/Kconfig	2017-08-27 20:20:40.000000000 -0400
@@ -96,7 +96,6 @@ menu "ARC Architecture Configuration"
 
 menu "ARC Platform/SoC/Board"
 
-source "arch/arc/plat-sim/Kconfig"
 source "arch/arc/plat-tb10x/Kconfig"
 source "arch/arc/plat-axs10x/Kconfig"
 #New platform adds here
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/kernel/intc-arcv2.c linux-libre-4.13-rc7-gnu/arch/arc/kernel/intc-arcv2.c
--- linux-libre-4.13-rc6-gnu/arch/arc/kernel/intc-arcv2.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/kernel/intc-arcv2.c	2017-08-27 20:20:40.000000000 -0400
@@ -75,10 +75,13 @@ void arc_init_IRQ(void)
 	 * Set a default priority for all available interrupts to prevent
 	 * switching of register banks if Fast IRQ and multiple register banks
 	 * are supported by CPU.
+	 * Also disable all IRQ lines so faulty external hardware won't
+	 * trigger interrupt that kernel is not ready to handle.
 	 */
 	for (i = NR_EXCEPTIONS; i < irq_bcr.irqs + NR_EXCEPTIONS; i++) {
 		write_aux_reg(AUX_IRQ_SELECT, i);
 		write_aux_reg(AUX_IRQ_PRIORITY, ARCV2_IRQ_DEF_PRIO);
+		write_aux_reg(AUX_IRQ_ENABLE, 0);
 	}
 
 	/* setup status32, don't enable intr yet as kernel doesn't want */
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/kernel/intc-compact.c linux-libre-4.13-rc7-gnu/arch/arc/kernel/intc-compact.c
--- linux-libre-4.13-rc6-gnu/arch/arc/kernel/intc-compact.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/kernel/intc-compact.c	2017-08-27 20:20:40.000000000 -0400
@@ -27,7 +27,7 @@
  */
 void arc_init_IRQ(void)
 {
-	int level_mask = 0;
+	int level_mask = 0, i;
 
        /* Is timer high priority Interrupt (Level2 in ARCompact jargon) */
 	level_mask |= IS_ENABLED(CONFIG_ARC_COMPACT_IRQ_LEVELS) << TIMER0_IRQ;
@@ -40,6 +40,18 @@ void arc_init_IRQ(void)
 
 	if (level_mask)
 		pr_info("Level-2 interrupts bitset %x\n", level_mask);
+
+	/*
+	 * Disable all IRQ lines so faulty external hardware won't
+	 * trigger interrupt that kernel is not ready to handle.
+	 */
+	for (i = TIMER0_IRQ; i < NR_CPU_IRQS; i++) {
+		unsigned int ienb;
+
+		ienb = read_aux_reg(AUX_IENABLE);
+		ienb &= ~(1 << i);
+		write_aux_reg(AUX_IENABLE, ienb);
+	}
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/Makefile linux-libre-4.13-rc7-gnu/arch/arc/Makefile
--- linux-libre-4.13-rc6-gnu/arch/arc/Makefile	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/Makefile	2017-08-27 20:20:40.000000000 -0400
@@ -107,7 +107,7 @@ core-y		+= arch/arc/
 # w/o this dtb won't embed into kernel binary
 core-y		+= arch/arc/boot/dts/
 
-core-$(CONFIG_ARC_PLAT_SIM)	+= arch/arc/plat-sim/
+core-y				+= arch/arc/plat-sim/
 core-$(CONFIG_ARC_PLAT_TB10X)	+= arch/arc/plat-tb10x/
 core-$(CONFIG_ARC_PLAT_AXS10X)	+= arch/arc/plat-axs10x/
 core-$(CONFIG_ARC_PLAT_EZNPS)	+= arch/arc/plat-eznps/
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/mm/cache.c linux-libre-4.13-rc7-gnu/arch/arc/mm/cache.c
--- linux-libre-4.13-rc6-gnu/arch/arc/mm/cache.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/mm/cache.c	2017-08-27 20:20:40.000000000 -0400
@@ -665,6 +665,7 @@ noinline void slc_op(phys_addr_t paddr,
 	static DEFINE_SPINLOCK(lock);
 	unsigned long flags;
 	unsigned int ctrl;
+	phys_addr_t end;
 
 	spin_lock_irqsave(&lock, flags);
 
@@ -694,8 +695,19 @@ noinline void slc_op(phys_addr_t paddr,
 	 * END needs to be setup before START (latter triggers the operation)
 	 * END can't be same as START, so add (l2_line_sz - 1) to sz
 	 */
-	write_aux_reg(ARC_REG_SLC_RGN_END, (paddr + sz + l2_line_sz - 1));
-	write_aux_reg(ARC_REG_SLC_RGN_START, paddr);
+	end = paddr + sz + l2_line_sz - 1;
+	if (is_pae40_enabled())
+		write_aux_reg(ARC_REG_SLC_RGN_END1, upper_32_bits(end));
+
+	write_aux_reg(ARC_REG_SLC_RGN_END, lower_32_bits(end));
+
+	if (is_pae40_enabled())
+		write_aux_reg(ARC_REG_SLC_RGN_START1, upper_32_bits(paddr));
+
+	write_aux_reg(ARC_REG_SLC_RGN_START, lower_32_bits(paddr));
+
+	/* Make sure "busy" bit reports correct stataus, see STAR 9001165532 */
+	read_aux_reg(ARC_REG_SLC_CTRL);
 
 	while (read_aux_reg(ARC_REG_SLC_CTRL) & SLC_CTRL_BUSY);
 
@@ -1111,6 +1123,13 @@ noinline void __init arc_ioc_setup(void)
 	__dc_enable();
 }
 
+/*
+ * Cache related boot time checks/setups only needed on master CPU:
+ *  - Geometry checks (kernel build and hardware agree: e.g. L1_CACHE_BYTES)
+ *    Assume SMP only, so all cores will have same cache config. A check on
+ *    one core suffices for all
+ *  - IOC setup / dma callbacks only need to be done once
+ */
 void __init arc_cache_init_master(void)
 {
 	unsigned int __maybe_unused cpu = smp_processor_id();
@@ -1190,12 +1209,27 @@ void __ref arc_cache_init(void)
 
 	printk(arc_cache_mumbojumbo(0, str, sizeof(str)));
 
-	/*
-	 * Only master CPU needs to execute rest of function:
-	 *  - Assume SMP so all cores will have same cache config so
-	 *    any geomtry checks will be same for all
-	 *  - IOC setup / dma callbacks only need to be setup once
-	 */
 	if (!cpu)
 		arc_cache_init_master();
+
+	/*
+	 * In PAE regime, TLB and cache maintenance ops take wider addresses
+	 * And even if PAE is not enabled in kernel, the upper 32-bits still need
+	 * to be zeroed to keep the ops sane.
+	 * As an optimization for more common !PAE enabled case, zero them out
+	 * once at init, rather than checking/setting to 0 for every runtime op
+	 */
+	if (is_isa_arcv2() && pae40_exist_but_not_enab()) {
+
+		if (IS_ENABLED(CONFIG_ARC_HAS_ICACHE))
+			write_aux_reg(ARC_REG_IC_PTAG_HI, 0);
+
+		if (IS_ENABLED(CONFIG_ARC_HAS_DCACHE))
+			write_aux_reg(ARC_REG_DC_PTAG_HI, 0);
+
+		if (l2_line_sz) {
+			write_aux_reg(ARC_REG_SLC_RGN_END1, 0);
+			write_aux_reg(ARC_REG_SLC_RGN_START1, 0);
+		}
+	}
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/mm/dma.c linux-libre-4.13-rc7-gnu/arch/arc/mm/dma.c
--- linux-libre-4.13-rc6-gnu/arch/arc/mm/dma.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/mm/dma.c	2017-08-27 20:20:40.000000000 -0400
@@ -153,6 +153,19 @@ static void _dma_cache_sync(phys_addr_t
 	}
 }
 
+/*
+ * arc_dma_map_page - map a portion of a page for streaming DMA
+ *
+ * Ensure that any data held in the cache is appropriately discarded
+ * or written back.
+ *
+ * The device owns this memory once this call has completed.  The CPU
+ * can regain ownership by calling dma_unmap_page().
+ *
+ * Note: while it takes struct page as arg, caller can "abuse" it to pass
+ * a region larger than PAGE_SIZE, provided it is physically contiguous
+ * and this still works correctly
+ */
 static dma_addr_t arc_dma_map_page(struct device *dev, struct page *page,
 		unsigned long offset, size_t size, enum dma_data_direction dir,
 		unsigned long attrs)
@@ -165,6 +178,24 @@ static dma_addr_t arc_dma_map_page(struc
 	return plat_phys_to_dma(dev, paddr);
 }
 
+/*
+ * arc_dma_unmap_page - unmap a buffer previously mapped through dma_map_page()
+ *
+ * After this call, reads by the CPU to the buffer are guaranteed to see
+ * whatever the device wrote there.
+ *
+ * Note: historically this routine was not implemented for ARC
+ */
+static void arc_dma_unmap_page(struct device *dev, dma_addr_t handle,
+			       size_t size, enum dma_data_direction dir,
+			       unsigned long attrs)
+{
+	phys_addr_t paddr = plat_dma_to_phys(dev, handle);
+
+	if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC))
+		_dma_cache_sync(paddr, size, dir);
+}
+
 static int arc_dma_map_sg(struct device *dev, struct scatterlist *sg,
 	   int nents, enum dma_data_direction dir, unsigned long attrs)
 {
@@ -178,6 +209,18 @@ static int arc_dma_map_sg(struct device
 	return nents;
 }
 
+static void arc_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
+			     int nents, enum dma_data_direction dir,
+			     unsigned long attrs)
+{
+	struct scatterlist *s;
+	int i;
+
+	for_each_sg(sg, s, nents, i)
+		arc_dma_unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir,
+				   attrs);
+}
+
 static void arc_dma_sync_single_for_cpu(struct device *dev,
 		dma_addr_t dma_handle, size_t size, enum dma_data_direction dir)
 {
@@ -223,7 +266,9 @@ const struct dma_map_ops arc_dma_ops = {
 	.free			= arc_dma_free,
 	.mmap			= arc_dma_mmap,
 	.map_page		= arc_dma_map_page,
+	.unmap_page		= arc_dma_unmap_page,
 	.map_sg			= arc_dma_map_sg,
+	.unmap_sg		= arc_dma_unmap_sg,
 	.sync_single_for_device	= arc_dma_sync_single_for_device,
 	.sync_single_for_cpu	= arc_dma_sync_single_for_cpu,
 	.sync_sg_for_cpu	= arc_dma_sync_sg_for_cpu,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/mm/tlb.c linux-libre-4.13-rc7-gnu/arch/arc/mm/tlb.c
--- linux-libre-4.13-rc6-gnu/arch/arc/mm/tlb.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/mm/tlb.c	2017-08-27 20:20:40.000000000 -0400
@@ -104,6 +104,8 @@
 /* A copy of the ASID from the PID reg is kept in asid_cache */
 DEFINE_PER_CPU(unsigned int, asid_cache) = MM_CTXT_FIRST_CYCLE;
 
+static int __read_mostly pae_exists;
+
 /*
  * Utility Routine to erase a J-TLB entry
  * Caller needs to setup Index Reg (manually or via getIndex)
@@ -784,7 +786,7 @@ void read_decode_mmu_bcr(void)
 		mmu->u_dtlb = mmu4->u_dtlb * 4;
 		mmu->u_itlb = mmu4->u_itlb * 4;
 		mmu->sasid = mmu4->sasid;
-		mmu->pae = mmu4->pae;
+		pae_exists = mmu->pae = mmu4->pae;
 	}
 }
 
@@ -809,6 +811,11 @@ char *arc_mmu_mumbojumbo(int cpu_id, cha
 	return buf;
 }
 
+int pae40_exist_but_not_enab(void)
+{
+	return pae_exists && !is_pae40_enabled();
+}
+
 void arc_mmu_init(void)
 {
 	char str[256];
@@ -859,6 +866,9 @@ void arc_mmu_init(void)
 	/* swapper_pg_dir is the pgd for the kernel, used by vmalloc */
 	write_aux_reg(ARC_REG_SCRATCH_DATA0, swapper_pg_dir);
 #endif
+
+	if (pae40_exist_but_not_enab())
+		write_aux_reg(ARC_REG_TLBPD1HI, 0);
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/plat-sim/Kconfig linux-libre-4.13-rc7-gnu/arch/arc/plat-sim/Kconfig
--- linux-libre-4.13-rc6-gnu/arch/arc/plat-sim/Kconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/plat-sim/Kconfig	1969-12-31 19:00:00.000000000 -0500
@@ -1,13 +0,0 @@
-#
-# Copyright (C) 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 2 as
-# published by the Free Software Foundation.
-#
-
-menuconfig ARC_PLAT_SIM
-	bool "ARC nSIM based simulation virtual platforms"
-	help
-	  Support for nSIM based ARC simulation platforms
-	  This includes the standalone nSIM (uart only) vs. System C OSCI VP
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arc/plat-sim/platform.c linux-libre-4.13-rc7-gnu/arch/arc/plat-sim/platform.c
--- linux-libre-4.13-rc6-gnu/arch/arc/plat-sim/platform.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arc/plat-sim/platform.c	2017-08-27 20:20:40.000000000 -0400
@@ -20,11 +20,14 @@
  */
 
 static const char *simulation_compat[] __initconst = {
+#ifdef CONFIG_ISA_ARCOMPACT
 	"snps,nsim",
-	"snps,nsim_hs",
 	"snps,nsimosci",
+#else
+	"snps,nsim_hs",
 	"snps,nsimosci_hs",
 	"snps,zebu_hs",
+#endif
 	NULL,
 };
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi linux-libre-4.13-rc7-gnu/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi
--- linux-libre-4.13-rc6-gnu/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi	2017-08-27 20:20:40.000000000 -0400
@@ -266,6 +266,7 @@
 
 &hdmicec {
 	status = "okay";
+	needs-hpd;
 };
 
 &hsi2c_4 {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arm/mach-at91/Kconfig linux-libre-4.13-rc7-gnu/arch/arm/mach-at91/Kconfig
--- linux-libre-4.13-rc6-gnu/arch/arm/mach-at91/Kconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arm/mach-at91/Kconfig	2017-08-27 20:20:40.000000000 -0400
@@ -1,7 +1,7 @@
 menuconfig ARCH_AT91
 	bool "Atmel SoCs"
 	depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V7 || ARM_SINGLE_ARMV7M
-	select ARM_CPU_SUSPEND if PM
+	select ARM_CPU_SUSPEND if PM && ARCH_MULTI_V7
 	select COMMON_CLK_AT91
 	select GPIOLIB
 	select PINCTRL
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arm/mach-at91/pm.c linux-libre-4.13-rc7-gnu/arch/arm/mach-at91/pm.c
--- linux-libre-4.13-rc6-gnu/arch/arm/mach-at91/pm.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arm/mach-at91/pm.c	2017-08-27 20:20:40.000000000 -0400
@@ -608,6 +608,9 @@ static void __init at91_pm_init(void (*p
 
 void __init at91rm9200_pm_init(void)
 {
+	if (!IS_ENABLED(CONFIG_SOC_AT91RM9200))
+		return;
+
 	at91_dt_ramc();
 
 	/*
@@ -620,18 +623,27 @@ void __init at91rm9200_pm_init(void)
 
 void __init at91sam9_pm_init(void)
 {
+	if (!IS_ENABLED(CONFIG_SOC_AT91SAM9))
+		return;
+
 	at91_dt_ramc();
 	at91_pm_init(at91sam9_idle);
 }
 
 void __init sama5_pm_init(void)
 {
+	if (!IS_ENABLED(CONFIG_SOC_SAMA5))
+		return;
+
 	at91_dt_ramc();
 	at91_pm_init(NULL);
 }
 
 void __init sama5d2_pm_init(void)
 {
+	if (!IS_ENABLED(CONFIG_SOC_SAMA5D2))
+		return;
+
 	at91_pm_backup_init();
 	sama5_pm_init();
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arm64/kernel/fpsimd.c linux-libre-4.13-rc7-gnu/arch/arm64/kernel/fpsimd.c
--- linux-libre-4.13-rc6-gnu/arch/arm64/kernel/fpsimd.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arm64/kernel/fpsimd.c	2017-08-27 20:20:40.000000000 -0400
@@ -161,9 +161,11 @@ void fpsimd_flush_thread(void)
 {
 	if (!system_supports_fpsimd())
 		return;
+	preempt_disable();
 	memset(&current->thread.fpsimd_state, 0, sizeof(struct fpsimd_state));
 	fpsimd_flush_task_state(current);
 	set_thread_flag(TIF_FOREIGN_FPSTATE);
+	preempt_enable();
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arm64/kernel/head.S linux-libre-4.13-rc7-gnu/arch/arm64/kernel/head.S
--- linux-libre-4.13-rc6-gnu/arch/arm64/kernel/head.S	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arm64/kernel/head.S	2017-08-27 20:20:40.000000000 -0400
@@ -354,7 +354,6 @@ __primary_switched:
 	tst	x23, ~(MIN_KIMG_ALIGN - 1)	// already running randomized?
 	b.ne	0f
 	mov	x0, x21				// pass FDT address in x0
-	mov	x1, x23				// pass modulo offset in x1
 	bl	kaslr_early_init		// parse FDT for KASLR options
 	cbz	x0, 0f				// KASLR disabled? just proceed
 	orr	x23, x23, x0			// record KASLR offset
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arm64/kernel/kaslr.c linux-libre-4.13-rc7-gnu/arch/arm64/kernel/kaslr.c
--- linux-libre-4.13-rc6-gnu/arch/arm64/kernel/kaslr.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arm64/kernel/kaslr.c	2017-08-27 20:20:40.000000000 -0400
@@ -75,7 +75,7 @@ extern void *__init __fixmap_remap_fdt(p
  * containing function pointers) to be reinitialized, and zero-initialized
  * .bss variables will be reset to 0.
  */
-u64 __init kaslr_early_init(u64 dt_phys, u64 modulo_offset)
+u64 __init kaslr_early_init(u64 dt_phys)
 {
 	void *fdt;
 	u64 seed, offset, mask, module_range;
@@ -131,15 +131,17 @@ u64 __init kaslr_early_init(u64 dt_phys,
 	/*
 	 * The kernel Image should not extend across a 1GB/32MB/512MB alignment
 	 * boundary (for 4KB/16KB/64KB granule kernels, respectively). If this
-	 * happens, increase the KASLR offset by the size of the kernel image
-	 * rounded up by SWAPPER_BLOCK_SIZE.
+	 * happens, round down the KASLR offset by (1 << SWAPPER_TABLE_SHIFT).
+	 *
+	 * NOTE: The references to _text and _end below will already take the
+	 *       modulo offset (the physical displacement modulo 2 MB) into
+	 *       account, given that the physical placement is controlled by
+	 *       the loader, and will not change as a result of the virtual
+	 *       mapping we choose.
 	 */
-	if ((((u64)_text + offset + modulo_offset) >> SWAPPER_TABLE_SHIFT) !=
-	    (((u64)_end + offset + modulo_offset) >> SWAPPER_TABLE_SHIFT)) {
-		u64 kimg_sz = _end - _text;
-		offset = (offset + round_up(kimg_sz, SWAPPER_BLOCK_SIZE))
-				& mask;
-	}
+	if ((((u64)_text + offset) >> SWAPPER_TABLE_SHIFT) !=
+	    (((u64)_end + offset) >> SWAPPER_TABLE_SHIFT))
+		offset = round_down(offset, 1 << SWAPPER_TABLE_SHIFT);
 
 	if (IS_ENABLED(CONFIG_KASAN))
 		/*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/arm64/mm/fault.c linux-libre-4.13-rc7-gnu/arch/arm64/mm/fault.c
--- linux-libre-4.13-rc6-gnu/arch/arm64/mm/fault.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/arm64/mm/fault.c	2017-08-27 20:20:40.000000000 -0400
@@ -435,8 +435,11 @@ retry:
 		 * the mmap_sem because it would already be released
 		 * in __lock_page_or_retry in mm/filemap.c.
 		 */
-		if (fatal_signal_pending(current))
+		if (fatal_signal_pending(current)) {
+			if (!user_mode(regs))
+				goto no_context;
 			return 0;
+		}
 
 		/*
 		 * Clear FAULT_FLAG_ALLOW_RETRY to avoid any risk of
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/powerpc/include/asm/mmu_context.h linux-libre-4.13-rc7-gnu/arch/powerpc/include/asm/mmu_context.h
--- linux-libre-4.13-rc6-gnu/arch/powerpc/include/asm/mmu_context.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/powerpc/include/asm/mmu_context.h	2017-08-27 20:20:40.000000000 -0400
@@ -90,6 +90,24 @@ static inline void switch_mm_irqs_off(st
 	/* Mark this context has been used on the new CPU */
 	if (!cpumask_test_cpu(smp_processor_id(), mm_cpumask(next))) {
 		cpumask_set_cpu(smp_processor_id(), mm_cpumask(next));
+
+		/*
+		 * This full barrier orders the store to the cpumask above vs
+		 * a subsequent operation which allows this CPU to begin loading
+		 * translations for next.
+		 *
+		 * When using the radix MMU that operation is the load of the
+		 * MMU context id, which is then moved to SPRN_PID.
+		 *
+		 * For the hash MMU it is either the first load from slb_cache
+		 * in switch_slb(), and/or the store of paca->mm_ctx_id in
+		 * copy_mm_to_paca().
+		 *
+		 * On the read side the barrier is in pte_xchg(), which orders
+		 * the store to the PTE vs the load of mm_cpumask.
+		 */
+		smp_mb();
+
 		new_on_cpu = true;
 	}
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/powerpc/include/asm/pgtable-be-types.h linux-libre-4.13-rc7-gnu/arch/powerpc/include/asm/pgtable-be-types.h
--- linux-libre-4.13-rc6-gnu/arch/powerpc/include/asm/pgtable-be-types.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/powerpc/include/asm/pgtable-be-types.h	2017-08-27 20:20:40.000000000 -0400
@@ -87,6 +87,7 @@ static inline bool pte_xchg(pte_t *ptep,
 	unsigned long *p = (unsigned long *)ptep;
 	__be64 prev;
 
+	/* See comment in switch_mm_irqs_off() */
 	prev = (__force __be64)__cmpxchg_u64(p, (__force unsigned long)pte_raw(old),
 					     (__force unsigned long)pte_raw(new));
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/powerpc/include/asm/pgtable-types.h linux-libre-4.13-rc7-gnu/arch/powerpc/include/asm/pgtable-types.h
--- linux-libre-4.13-rc6-gnu/arch/powerpc/include/asm/pgtable-types.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/powerpc/include/asm/pgtable-types.h	2017-08-27 20:20:40.000000000 -0400
@@ -62,6 +62,7 @@ static inline bool pte_xchg(pte_t *ptep,
 {
 	unsigned long *p = (unsigned long *)ptep;
 
+	/* See comment in switch_mm_irqs_off() */
 	return pte_val(old) == __cmpxchg_u64(p, pte_val(old), pte_val(new));
 }
 #endif
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/powerpc/kvm/book3s_64_vio.c linux-libre-4.13-rc7-gnu/arch/powerpc/kvm/book3s_64_vio.c
--- linux-libre-4.13-rc6-gnu/arch/powerpc/kvm/book3s_64_vio.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/powerpc/kvm/book3s_64_vio.c	2017-08-27 20:20:40.000000000 -0400
@@ -294,32 +294,26 @@ long kvm_vm_ioctl_create_spapr_tce(struc
 				   struct kvm_create_spapr_tce_64 *args)
 {
 	struct kvmppc_spapr_tce_table *stt = NULL;
+	struct kvmppc_spapr_tce_table *siter;
 	unsigned long npages, size;
 	int ret = -ENOMEM;
 	int i;
+	int fd = -1;
 
 	if (!args->size)
 		return -EINVAL;
 
-	/* Check this LIOBN hasn't been previously allocated */
-	list_for_each_entry(stt, &kvm->arch.spapr_tce_tables, list) {
-		if (stt->liobn == args->liobn)
-			return -EBUSY;
-	}
-
 	size = _ALIGN_UP(args->size, PAGE_SIZE >> 3);
 	npages = kvmppc_tce_pages(size);
 	ret = kvmppc_account_memlimit(kvmppc_stt_pages(npages), true);
-	if (ret) {
-		stt = NULL;
-		goto fail;
-	}
+	if (ret)
+		return ret;
 
 	ret = -ENOMEM;
 	stt = kzalloc(sizeof(*stt) + npages * sizeof(struct page *),
 		      GFP_KERNEL);
 	if (!stt)
-		goto fail;
+		goto fail_acct;
 
 	stt->liobn = args->liobn;
 	stt->page_shift = args->page_shift;
@@ -334,24 +328,42 @@ long kvm_vm_ioctl_create_spapr_tce(struc
 			goto fail;
 	}
 
-	kvm_get_kvm(kvm);
+	ret = fd = anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops,
+				    stt, O_RDWR | O_CLOEXEC);
+	if (ret < 0)
+		goto fail;
 
 	mutex_lock(&kvm->lock);
-	list_add_rcu(&stt->list, &kvm->arch.spapr_tce_tables);
+
+	/* Check this LIOBN hasn't been previously allocated */
+	ret = 0;
+	list_for_each_entry(siter, &kvm->arch.spapr_tce_tables, list) {
+		if (siter->liobn == args->liobn) {
+			ret = -EBUSY;
+			break;
+		}
+	}
+
+	if (!ret) {
+		list_add_rcu(&stt->list, &kvm->arch.spapr_tce_tables);
+		kvm_get_kvm(kvm);
+	}
 
 	mutex_unlock(&kvm->lock);
 
-	return anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops,
-				stt, O_RDWR | O_CLOEXEC);
+	if (!ret)
+		return fd;
 
-fail:
-	if (stt) {
-		for (i = 0; i < npages; i++)
-			if (stt->pages[i])
-				__free_page(stt->pages[i]);
+	put_unused_fd(fd);
 
-		kfree(stt);
-	}
+ fail:
+	for (i = 0; i < npages; i++)
+		if (stt->pages[i])
+			__free_page(stt->pages[i]);
+
+	kfree(stt);
+ fail_acct:
+	kvmppc_account_memlimit(kvmppc_stt_pages(npages), false);
 	return ret;
 }
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S linux-libre-4.13-rc7-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S
--- linux-libre-4.13-rc6-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/powerpc/kvm/book3s_hv_rmhandlers.S	2017-08-27 20:20:40.000000000 -0400
@@ -1291,6 +1291,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
 	/* Hypervisor doorbell - exit only if host IPI flag set */
 	cmpwi	r12, BOOK3S_INTERRUPT_H_DOORBELL
 	bne	3f
+BEGIN_FTR_SECTION
+	PPC_MSGSYNC
+END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
 	lbz	r0, HSTATE_HOST_IPI(r13)
 	cmpwi	r0, 0
 	beq	4f
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/powerpc/kvm/book3s_xive_template.c linux-libre-4.13-rc7-gnu/arch/powerpc/kvm/book3s_xive_template.c
--- linux-libre-4.13-rc6-gnu/arch/powerpc/kvm/book3s_xive_template.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/powerpc/kvm/book3s_xive_template.c	2017-08-27 20:20:40.000000000 -0400
@@ -16,7 +16,22 @@ static void GLUE(X_PFX,ack_pending)(stru
 	u8 cppr;
 	u16 ack;
 
-	/* XXX DD1 bug workaround: Check PIPR vs. CPPR first ! */
+	/*
+	 * Ensure any previous store to CPPR is ordered vs.
+	 * the subsequent loads from PIPR or ACK.
+	 */
+	eieio();
+
+	/*
+	 * DD1 bug workaround: If PIPR is less favored than CPPR
+	 * ignore the interrupt or we might incorrectly lose an IPB
+	 * bit.
+	 */
+	if (cpu_has_feature(CPU_FTR_POWER9_DD1)) {
+		u8 pipr = __x_readb(__x_tima + TM_QW1_OS + TM_PIPR);
+		if (pipr >= xc->hw_cppr)
+			return;
+	}
 
 	/* Perform the acknowledge OS to register cycle. */
 	ack = be16_to_cpu(__x_readw(__x_tima + TM_SPC_ACK_OS_REG));
@@ -235,6 +250,11 @@ skip_ipi:
 	/*
 	 * If we found an interrupt, adjust what the guest CPPR should
 	 * be as if we had just fetched that interrupt from HW.
+	 *
+	 * Note: This can only make xc->cppr smaller as the previous
+	 * loop will only exit with hirq != 0 if prio is lower than
+	 * the current xc->cppr. Thus we don't need to re-check xc->mfrr
+	 * for pending IPIs.
 	 */
 	if (hirq)
 		xc->cppr = prio;
@@ -381,6 +401,12 @@ X_STATIC int GLUE(X_PFX,h_cppr)(struct k
 	xc->cppr = cppr;
 
 	/*
+	 * Order the above update of xc->cppr with the subsequent
+	 * read of xc->mfrr inside push_pending_to_hw()
+	 */
+	smp_mb();
+
+	/*
 	 * We are masking less, we need to look for pending things
 	 * to deliver and set VP pending bits accordingly to trigger
 	 * a new interrupt otherwise we might miss MFRR changes for
@@ -420,21 +446,37 @@ X_STATIC int GLUE(X_PFX,h_eoi)(struct kv
 	 * used to signal MFRR changes is EOId when fetched from
 	 * the queue.
 	 */
-	if (irq == XICS_IPI || irq == 0)
+	if (irq == XICS_IPI || irq == 0) {
+		/*
+		 * This barrier orders the setting of xc->cppr vs.
+		 * subsquent test of xc->mfrr done inside
+		 * scan_interrupts and push_pending_to_hw
+		 */
+		smp_mb();
 		goto bail;
+	}
 
 	/* Find interrupt source */
 	sb = kvmppc_xive_find_source(xive, irq, &src);
 	if (!sb) {
 		pr_devel(" source not found !\n");
 		rc = H_PARAMETER;
+		/* Same as above */
+		smp_mb();
 		goto bail;
 	}
 	state = &sb->irq_state[src];
 	kvmppc_xive_select_irq(state, &hw_num, &xd);
 
 	state->in_eoi = true;
-	mb();
+
+	/*
+	 * This barrier orders both setting of in_eoi above vs,
+	 * subsequent test of guest_priority, and the setting
+	 * of xc->cppr vs. subsquent test of xc->mfrr done inside
+	 * scan_interrupts and push_pending_to_hw
+	 */
+	smp_mb();
 
 again:
 	if (state->guest_priority == MASKED) {
@@ -461,6 +503,14 @@ again:
 
 	}
 
+	/*
+	 * This barrier orders the above guest_priority check
+	 * and spin_lock/unlock with clearing in_eoi below.
+	 *
+	 * It also has to be a full mb() as it must ensure
+	 * the MMIOs done in source_eoi() are completed before
+	 * state->in_eoi is visible.
+	 */
 	mb();
 	state->in_eoi = false;
 bail:
@@ -495,6 +545,18 @@ X_STATIC int GLUE(X_PFX,h_ipi)(struct kv
 	/* Locklessly write over MFRR */
 	xc->mfrr = mfrr;
 
+	/*
+	 * The load of xc->cppr below and the subsequent MMIO store
+	 * to the IPI must happen after the above mfrr update is
+	 * globally visible so that:
+	 *
+	 * - Synchronize with another CPU doing an H_EOI or a H_CPPR
+	 *   updating xc->cppr then reading xc->mfrr.
+	 *
+	 * - The target of the IPI sees the xc->mfrr update
+	 */
+	mb();
+
 	/* Shoot the IPI if most favored than target cppr */
 	if (mfrr < xc->cppr)
 		__x_writeq(0, __x_trig_page(&xc->vp_ipi_data));
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/s390/kvm/sthyi.c linux-libre-4.13-rc7-gnu/arch/s390/kvm/sthyi.c
--- linux-libre-4.13-rc6-gnu/arch/s390/kvm/sthyi.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/s390/kvm/sthyi.c	2017-08-27 20:20:40.000000000 -0400
@@ -394,7 +394,7 @@ static int sthyi(u64 vaddr)
 		"srl     %[cc],28\n"
 		: [cc] "=d" (cc)
 		: [code] "d" (code), [addr] "a" (addr)
-		: "memory", "cc");
+		: "3", "memory", "cc");
 	return cc;
 }
 
@@ -425,7 +425,7 @@ int handle_sthyi(struct kvm_vcpu *vcpu)
 	VCPU_EVENT(vcpu, 3, "STHYI: fc: %llu addr: 0x%016llx", code, addr);
 	trace_kvm_s390_handle_sthyi(vcpu, code, addr);
 
-	if (reg1 == reg2 || reg1 & 1 || reg2 & 1 || addr & ~PAGE_MASK)
+	if (reg1 == reg2 || reg1 & 1 || reg2 & 1)
 		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
 
 	if (code & 0xffff) {
@@ -433,6 +433,9 @@ int handle_sthyi(struct kvm_vcpu *vcpu)
 		goto out;
 	}
 
+	if (addr & ~PAGE_MASK)
+		return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
+
 	/*
 	 * If the page has not yet been faulted in, we want to do that
 	 * now and not after all the expensive calculations.
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/sparc/include/asm/page_32.h linux-libre-4.13-rc7-gnu/arch/sparc/include/asm/page_32.h
--- linux-libre-4.13-rc6-gnu/arch/sparc/include/asm/page_32.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/sparc/include/asm/page_32.h	2017-08-27 20:20:40.000000000 -0400
@@ -68,6 +68,7 @@ typedef struct { unsigned long iopgprot;
 #define iopgprot_val(x)	((x).iopgprot)
 
 #define __pte(x)	((pte_t) { (x) } )
+#define __pmd(x)	((pmd_t) { { (x) }, })
 #define __iopte(x)	((iopte_t) { (x) } )
 #define __pgd(x)	((pgd_t) { (x) } )
 #define __ctxd(x)	((ctxd_t) { (x) } )
@@ -95,6 +96,7 @@ typedef unsigned long iopgprot_t;
 #define iopgprot_val(x)	(x)
 
 #define __pte(x)	(x)
+#define __pmd(x)	((pmd_t) { { (x) }, })
 #define __iopte(x)	(x)
 #define __pgd(x)	(x)
 #define __ctxd(x)	(x)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/sparc/kernel/pcic.c linux-libre-4.13-rc7-gnu/arch/sparc/kernel/pcic.c
--- linux-libre-4.13-rc6-gnu/arch/sparc/kernel/pcic.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/sparc/kernel/pcic.c	2017-08-27 20:20:40.000000000 -0400
@@ -602,7 +602,7 @@ void pcibios_fixup_bus(struct pci_bus *b
 {
 	struct pci_dev *dev;
 	int i, has_io, has_mem;
-	unsigned int cmd;
+	unsigned int cmd = 0;
 	struct linux_pcic *pcic;
 	/* struct linux_pbm_info* pbm = &pcic->pbm; */
 	int node;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/sparc/kernel/pci_sun4v.c linux-libre-4.13-rc7-gnu/arch/sparc/kernel/pci_sun4v.c
--- linux-libre-4.13-rc6-gnu/arch/sparc/kernel/pci_sun4v.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/sparc/kernel/pci_sun4v.c	2017-08-27 20:20:40.000000000 -0400
@@ -1266,8 +1266,6 @@ static int pci_sun4v_probe(struct platfo
 			 * ATU group, but ATU hcalls won't be available.
 			 */
 			hv_atu = false;
-			pr_err(PFX "Could not register hvapi ATU err=%d\n",
-			       err);
 		} else {
 			pr_info(PFX "Registered hvapi ATU major[%lu] minor[%lu]\n",
 				vatu_major, vatu_minor);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/sparc/lib/multi3.S linux-libre-4.13-rc7-gnu/arch/sparc/lib/multi3.S
--- linux-libre-4.13-rc6-gnu/arch/sparc/lib/multi3.S	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/sparc/lib/multi3.S	2017-08-27 20:20:40.000000000 -0400
@@ -5,26 +5,26 @@
 	.align	4
 ENTRY(__multi3) /* %o0 = u, %o1 = v */
 	mov	%o1, %g1
-	srl	%o3, 0, %g4
-	mulx	%g4, %g1, %o1
+	srl	%o3, 0, %o4
+	mulx	%o4, %g1, %o1
 	srlx	%g1, 0x20, %g3
-	mulx	%g3, %g4, %g5
-	sllx	%g5, 0x20, %o5
-	srl	%g1, 0, %g4
+	mulx	%g3, %o4, %g7
+	sllx	%g7, 0x20, %o5
+	srl	%g1, 0, %o4
 	sub	%o1, %o5, %o5
 	srlx	%o5, 0x20, %o5
-	addcc	%g5, %o5, %g5
+	addcc	%g7, %o5, %g7
 	srlx	%o3, 0x20, %o5
-	mulx	%g4, %o5, %g4
+	mulx	%o4, %o5, %o4
 	mulx	%g3, %o5, %o5
 	sethi	%hi(0x80000000), %g3
-	addcc	%g5, %g4, %g5
-	srlx	%g5, 0x20, %g5
+	addcc	%g7, %o4, %g7
+	srlx	%g7, 0x20, %g7
 	add	%g3, %g3, %g3
 	movcc	%xcc, %g0, %g3
-	addcc	%o5, %g5, %o5
-	sllx	%g4, 0x20, %g4
-	add	%o1, %g4, %o1
+	addcc	%o5, %g7, %o5
+	sllx	%o4, 0x20, %o4
+	add	%o1, %o4, %o1
 	add	%o5, %g3, %g2
 	mulx	%g1, %o2, %g1
 	add	%g1, %g2, %g1
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/include/asm/fpu/internal.h linux-libre-4.13-rc7-gnu/arch/x86/include/asm/fpu/internal.h
--- linux-libre-4.13-rc6-gnu/arch/x86/include/asm/fpu/internal.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/include/asm/fpu/internal.h	2017-08-27 20:20:40.000000000 -0400
@@ -450,10 +450,10 @@ static inline int copy_fpregs_to_fpstate
 	return 0;
 }
 
-static inline void __copy_kernel_to_fpregs(union fpregs_state *fpstate)
+static inline void __copy_kernel_to_fpregs(union fpregs_state *fpstate, u64 mask)
 {
 	if (use_xsave()) {
-		copy_kernel_to_xregs(&fpstate->xsave, -1);
+		copy_kernel_to_xregs(&fpstate->xsave, mask);
 	} else {
 		if (use_fxsr())
 			copy_kernel_to_fxregs(&fpstate->fxsave);
@@ -477,7 +477,7 @@ static inline void copy_kernel_to_fpregs
 			: : [addr] "m" (fpstate));
 	}
 
-	__copy_kernel_to_fpregs(fpstate);
+	__copy_kernel_to_fpregs(fpstate, -1);
 }
 
 extern int copy_fpstate_to_sigframe(void __user *buf, void __user *fp, int size);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/include/asm/kvm_host.h linux-libre-4.13-rc7-gnu/arch/x86/include/asm/kvm_host.h
--- linux-libre-4.13-rc6-gnu/arch/x86/include/asm/kvm_host.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/include/asm/kvm_host.h	2017-08-27 20:20:40.000000000 -0400
@@ -492,6 +492,7 @@ struct kvm_vcpu_arch {
 	unsigned long cr4;
 	unsigned long cr4_guest_owned_bits;
 	unsigned long cr8;
+	u32 pkru;
 	u32 hflags;
 	u64 efer;
 	u64 apic_base;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/include/asm/mmu_context.h linux-libre-4.13-rc7-gnu/arch/x86/include/asm/mmu_context.h
--- linux-libre-4.13-rc6-gnu/arch/x86/include/asm/mmu_context.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/include/asm/mmu_context.h	2017-08-27 20:20:40.000000000 -0400
@@ -140,9 +140,7 @@ static inline int init_new_context(struc
 		mm->context.execute_only_pkey = -1;
 	}
 	#endif
-	init_new_context_ldt(tsk, mm);
-
-	return 0;
+	return init_new_context_ldt(tsk, mm);
 }
 static inline void destroy_context(struct mm_struct *mm)
 {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/kvm/cpuid.c linux-libre-4.13-rc7-gnu/arch/x86/kvm/cpuid.c
--- linux-libre-4.13-rc6-gnu/arch/x86/kvm/cpuid.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/kvm/cpuid.c	2017-08-27 20:20:40.000000000 -0400
@@ -469,7 +469,7 @@ static inline int __do_cpuid_ent(struct
 			entry->ecx &= kvm_cpuid_7_0_ecx_x86_features;
 			cpuid_mask(&entry->ecx, CPUID_7_ECX);
 			/* PKU is not yet implemented for shadow paging. */
-			if (!tdp_enabled)
+			if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE))
 				entry->ecx &= ~F(PKU);
 			entry->edx &= kvm_cpuid_7_0_edx_x86_features;
 			entry->edx &= get_scattered_cpuid_leaf(7, 0, CPUID_EDX);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/kvm/kvm_cache_regs.h linux-libre-4.13-rc7-gnu/arch/x86/kvm/kvm_cache_regs.h
--- linux-libre-4.13-rc6-gnu/arch/x86/kvm/kvm_cache_regs.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/kvm/kvm_cache_regs.h	2017-08-27 20:20:40.000000000 -0400
@@ -84,11 +84,6 @@ static inline u64 kvm_read_edx_eax(struc
 		| ((u64)(kvm_register_read(vcpu, VCPU_REGS_RDX) & -1u) << 32);
 }
 
-static inline u32 kvm_read_pkru(struct kvm_vcpu *vcpu)
-{
-	return kvm_x86_ops->get_pkru(vcpu);
-}
-
 static inline void enter_guest_mode(struct kvm_vcpu *vcpu)
 {
 	vcpu->arch.hflags |= HF_GUEST_MASK;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/kvm/mmu.h linux-libre-4.13-rc7-gnu/arch/x86/kvm/mmu.h
--- linux-libre-4.13-rc6-gnu/arch/x86/kvm/mmu.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/kvm/mmu.h	2017-08-27 20:20:40.000000000 -0400
@@ -185,7 +185,7 @@ static inline u8 permission_fault(struct
 		* index of the protection domain, so pte_pkey * 2 is
 		* is the index of the first bit for the domain.
 		*/
-		pkru_bits = (kvm_read_pkru(vcpu) >> (pte_pkey * 2)) & 3;
+		pkru_bits = (vcpu->arch.pkru >> (pte_pkey * 2)) & 3;
 
 		/* clear present bit, replace PFEC.RSVD with ACC_USER_MASK. */
 		offset = (pfec & ~1) +
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/kvm/svm.c linux-libre-4.13-rc7-gnu/arch/x86/kvm/svm.c
--- linux-libre-4.13-rc6-gnu/arch/x86/kvm/svm.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/kvm/svm.c	2017-08-27 20:20:40.000000000 -0400
@@ -1777,11 +1777,6 @@ static void svm_set_rflags(struct kvm_vc
 	to_svm(vcpu)->vmcb->save.rflags = rflags;
 }
 
-static u32 svm_get_pkru(struct kvm_vcpu *vcpu)
-{
-	return 0;
-}
-
 static void svm_cache_reg(struct kvm_vcpu *vcpu, enum kvm_reg reg)
 {
 	switch (reg) {
@@ -5413,8 +5408,6 @@ static struct kvm_x86_ops svm_x86_ops __
 	.get_rflags = svm_get_rflags,
 	.set_rflags = svm_set_rflags,
 
-	.get_pkru = svm_get_pkru,
-
 	.tlb_flush = svm_flush_tlb,
 
 	.run = svm_vcpu_run,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/kvm/vmx.c linux-libre-4.13-rc7-gnu/arch/x86/kvm/vmx.c
--- linux-libre-4.13-rc6-gnu/arch/x86/kvm/vmx.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/kvm/vmx.c	2017-08-27 20:20:40.000000000 -0400
@@ -636,8 +636,6 @@ struct vcpu_vmx {
 
 	u64 current_tsc_ratio;
 
-	bool guest_pkru_valid;
-	u32 guest_pkru;
 	u32 host_pkru;
 
 	/*
@@ -2383,11 +2381,6 @@ static void vmx_set_rflags(struct kvm_vc
 		to_vmx(vcpu)->emulation_required = emulation_required(vcpu);
 }
 
-static u32 vmx_get_pkru(struct kvm_vcpu *vcpu)
-{
-	return to_vmx(vcpu)->guest_pkru;
-}
-
 static u32 vmx_get_interrupt_shadow(struct kvm_vcpu *vcpu)
 {
 	u32 interruptibility = vmcs_read32(GUEST_INTERRUPTIBILITY_INFO);
@@ -9020,8 +9013,10 @@ static void __noclone vmx_vcpu_run(struc
 	if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
 		vmx_set_interrupt_shadow(vcpu, 0);
 
-	if (vmx->guest_pkru_valid)
-		__write_pkru(vmx->guest_pkru);
+	if (static_cpu_has(X86_FEATURE_PKU) &&
+	    kvm_read_cr4_bits(vcpu, X86_CR4_PKE) &&
+	    vcpu->arch.pkru != vmx->host_pkru)
+		__write_pkru(vcpu->arch.pkru);
 
 	atomic_switch_perf_msrs(vmx);
 	debugctlmsr = get_debugctlmsr();
@@ -9169,13 +9164,11 @@ static void __noclone vmx_vcpu_run(struc
 	 * back on host, so it is safe to read guest PKRU from current
 	 * XSAVE.
 	 */
-	if (boot_cpu_has(X86_FEATURE_OSPKE)) {
-		vmx->guest_pkru = __read_pkru();
-		if (vmx->guest_pkru != vmx->host_pkru) {
-			vmx->guest_pkru_valid = true;
+	if (static_cpu_has(X86_FEATURE_PKU) &&
+	    kvm_read_cr4_bits(vcpu, X86_CR4_PKE)) {
+		vcpu->arch.pkru = __read_pkru();
+		if (vcpu->arch.pkru != vmx->host_pkru)
 			__write_pkru(vmx->host_pkru);
-		} else
-			vmx->guest_pkru_valid = false;
 	}
 
 	/*
@@ -11682,8 +11675,6 @@ static struct kvm_x86_ops vmx_x86_ops __
 	.get_rflags = vmx_get_rflags,
 	.set_rflags = vmx_set_rflags,
 
-	.get_pkru = vmx_get_pkru,
-
 	.tlb_flush = vmx_flush_tlb,
 
 	.run = vmx_vcpu_run,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/arch/x86/kvm/x86.c linux-libre-4.13-rc7-gnu/arch/x86/kvm/x86.c
--- linux-libre-4.13-rc6-gnu/arch/x86/kvm/x86.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/arch/x86/kvm/x86.c	2017-08-27 20:20:40.000000000 -0400
@@ -3245,7 +3245,12 @@ static void fill_xsave(u8 *dest, struct
 			u32 size, offset, ecx, edx;
 			cpuid_count(XSTATE_CPUID, index,
 				    &size, &offset, &ecx, &edx);
-			memcpy(dest + offset, src, size);
+			if (feature == XFEATURE_MASK_PKRU)
+				memcpy(dest + offset, &vcpu->arch.pkru,
+				       sizeof(vcpu->arch.pkru));
+			else
+				memcpy(dest + offset, src, size);
+
 		}
 
 		valid -= feature;
@@ -3283,7 +3288,11 @@ static void load_xsave(struct kvm_vcpu *
 			u32 size, offset, ecx, edx;
 			cpuid_count(XSTATE_CPUID, index,
 				    &size, &offset, &ecx, &edx);
-			memcpy(dest, src + offset, size);
+			if (feature == XFEATURE_MASK_PKRU)
+				memcpy(&vcpu->arch.pkru, src + offset,
+				       sizeof(vcpu->arch.pkru));
+			else
+				memcpy(dest, src + offset, size);
 		}
 
 		valid -= feature;
@@ -7633,7 +7642,9 @@ void kvm_load_guest_fpu(struct kvm_vcpu
 	 */
 	vcpu->guest_fpu_loaded = 1;
 	__kernel_fpu_begin();
-	__copy_kernel_to_fpregs(&vcpu->arch.guest_fpu.state);
+	/* PKRU is separately restored in kvm_x86_ops->run.  */
+	__copy_kernel_to_fpregs(&vcpu->arch.guest_fpu.state,
+				~XFEATURE_MASK_PKRU);
 	trace_kvm_fpu(1);
 }
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/block/blk-mq-debugfs.c linux-libre-4.13-rc7-gnu/block/blk-mq-debugfs.c
--- linux-libre-4.13-rc6-gnu/block/blk-mq-debugfs.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/block/blk-mq-debugfs.c	2017-08-27 20:20:40.000000000 -0400
@@ -75,6 +75,8 @@ static const char *const blk_queue_flag_
 	QUEUE_FLAG_NAME(STATS),
 	QUEUE_FLAG_NAME(POLL_STATS),
 	QUEUE_FLAG_NAME(REGISTERED),
+	QUEUE_FLAG_NAME(SCSI_PASSTHROUGH),
+	QUEUE_FLAG_NAME(QUIESCED),
 };
 #undef QUEUE_FLAG_NAME
 
@@ -265,6 +267,7 @@ static const char *const cmd_flag_name[]
 	CMD_FLAG_NAME(RAHEAD),
 	CMD_FLAG_NAME(BACKGROUND),
 	CMD_FLAG_NAME(NOUNMAP),
+	CMD_FLAG_NAME(NOWAIT),
 };
 #undef CMD_FLAG_NAME
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/block/blk-throttle.c linux-libre-4.13-rc7-gnu/block/blk-throttle.c
--- linux-libre-4.13-rc6-gnu/block/blk-throttle.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/block/blk-throttle.c	2017-08-27 20:20:40.000000000 -0400
@@ -382,6 +382,14 @@ static unsigned int tg_iops_limit(struct
 	}								\
 } while (0)
 
+static inline unsigned int throtl_bio_data_size(struct bio *bio)
+{
+	/* assume it's one sector */
+	if (unlikely(bio_op(bio) == REQ_OP_DISCARD))
+		return 512;
+	return bio->bi_iter.bi_size;
+}
+
 static void throtl_qnode_init(struct throtl_qnode *qn, struct throtl_grp *tg)
 {
 	INIT_LIST_HEAD(&qn->node);
@@ -934,6 +942,7 @@ static bool tg_with_in_bps_limit(struct
 	bool rw = bio_data_dir(bio);
 	u64 bytes_allowed, extra_bytes, tmp;
 	unsigned long jiffy_elapsed, jiffy_wait, jiffy_elapsed_rnd;
+	unsigned int bio_size = throtl_bio_data_size(bio);
 
 	jiffy_elapsed = jiffy_elapsed_rnd = jiffies - tg->slice_start[rw];
 
@@ -947,14 +956,14 @@ static bool tg_with_in_bps_limit(struct
 	do_div(tmp, HZ);
 	bytes_allowed = tmp;
 
-	if (tg->bytes_disp[rw] + bio->bi_iter.bi_size <= bytes_allowed) {
+	if (tg->bytes_disp[rw] + bio_size <= bytes_allowed) {
 		if (wait)
 			*wait = 0;
 		return true;
 	}
 
 	/* Calc approx time to dispatch */
-	extra_bytes = tg->bytes_disp[rw] + bio->bi_iter.bi_size - bytes_allowed;
+	extra_bytes = tg->bytes_disp[rw] + bio_size - bytes_allowed;
 	jiffy_wait = div64_u64(extra_bytes * HZ, tg_bps_limit(tg, rw));
 
 	if (!jiffy_wait)
@@ -1034,11 +1043,12 @@ static bool tg_may_dispatch(struct throt
 static void throtl_charge_bio(struct throtl_grp *tg, struct bio *bio)
 {
 	bool rw = bio_data_dir(bio);
+	unsigned int bio_size = throtl_bio_data_size(bio);
 
 	/* Charge the bio to the group */
-	tg->bytes_disp[rw] += bio->bi_iter.bi_size;
+	tg->bytes_disp[rw] += bio_size;
 	tg->io_disp[rw]++;
-	tg->last_bytes_disp[rw] += bio->bi_iter.bi_size;
+	tg->last_bytes_disp[rw] += bio_size;
 	tg->last_io_disp[rw]++;
 
 	/*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/block/bsg-lib.c linux-libre-4.13-rc7-gnu/block/bsg-lib.c
--- linux-libre-4.13-rc6-gnu/block/bsg-lib.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/block/bsg-lib.c	2017-08-27 20:20:40.000000000 -0400
@@ -29,26 +29,25 @@
 #include <scsi/scsi_cmnd.h>
 
 /**
- * bsg_destroy_job - routine to teardown/delete a bsg job
+ * bsg_teardown_job - routine to teardown a bsg job
  * @job: bsg_job that is to be torn down
  */
-static void bsg_destroy_job(struct kref *kref)
+static void bsg_teardown_job(struct kref *kref)
 {
 	struct bsg_job *job = container_of(kref, struct bsg_job, kref);
 	struct request *rq = job->req;
 
-	blk_end_request_all(rq, BLK_STS_OK);
-
 	put_device(job->dev);	/* release reference for the request */
 
 	kfree(job->request_payload.sg_list);
 	kfree(job->reply_payload.sg_list);
-	kfree(job);
+
+	blk_end_request_all(rq, BLK_STS_OK);
 }
 
 void bsg_job_put(struct bsg_job *job)
 {
-	kref_put(&job->kref, bsg_destroy_job);
+	kref_put(&job->kref, bsg_teardown_job);
 }
 EXPORT_SYMBOL_GPL(bsg_job_put);
 
@@ -100,7 +99,7 @@ EXPORT_SYMBOL_GPL(bsg_job_done);
  */
 static void bsg_softirq_done(struct request *rq)
 {
-	struct bsg_job *job = rq->special;
+	struct bsg_job *job = blk_mq_rq_to_pdu(rq);
 
 	bsg_job_put(job);
 }
@@ -122,33 +121,20 @@ static int bsg_map_buffer(struct bsg_buf
 }
 
 /**
- * bsg_create_job - create the bsg_job structure for the bsg request
+ * bsg_prepare_job - create the bsg_job structure for the bsg request
  * @dev: device that is being sent the bsg request
  * @req: BSG request that needs a job structure
  */
-static int bsg_create_job(struct device *dev, struct request *req)
+static int bsg_prepare_job(struct device *dev, struct request *req)
 {
 	struct request *rsp = req->next_rq;
-	struct request_queue *q = req->q;
 	struct scsi_request *rq = scsi_req(req);
-	struct bsg_job *job;
+	struct bsg_job *job = blk_mq_rq_to_pdu(req);
 	int ret;
 
-	BUG_ON(req->special);
-
-	job = kzalloc(sizeof(struct bsg_job) + q->bsg_job_size, GFP_KERNEL);
-	if (!job)
-		return -ENOMEM;
-
-	req->special = job;
-	job->req = req;
-	if (q->bsg_job_size)
-		job->dd_data = (void *)&job[1];
 	job->request = rq->cmd;
 	job->request_len = rq->cmd_len;
-	job->reply = rq->sense;
-	job->reply_len = SCSI_SENSE_BUFFERSIZE;	/* Size of sense buffer
-						 * allocated */
+
 	if (req->bio) {
 		ret = bsg_map_buffer(&job->request_payload, req);
 		if (ret)
@@ -187,7 +173,6 @@ static void bsg_request_fn(struct reques
 {
 	struct device *dev = q->queuedata;
 	struct request *req;
-	struct bsg_job *job;
 	int ret;
 
 	if (!get_device(dev))
@@ -199,7 +184,7 @@ static void bsg_request_fn(struct reques
 			break;
 		spin_unlock_irq(q->queue_lock);
 
-		ret = bsg_create_job(dev, req);
+		ret = bsg_prepare_job(dev, req);
 		if (ret) {
 			scsi_req(req)->result = ret;
 			blk_end_request_all(req, BLK_STS_OK);
@@ -207,8 +192,7 @@ static void bsg_request_fn(struct reques
 			continue;
 		}
 
-		job = req->special;
-		ret = q->bsg_job_fn(job);
+		ret = q->bsg_job_fn(blk_mq_rq_to_pdu(req));
 		spin_lock_irq(q->queue_lock);
 		if (ret)
 			break;
@@ -219,6 +203,35 @@ static void bsg_request_fn(struct reques
 	spin_lock_irq(q->queue_lock);
 }
 
+static int bsg_init_rq(struct request_queue *q, struct request *req, gfp_t gfp)
+{
+	struct bsg_job *job = blk_mq_rq_to_pdu(req);
+	struct scsi_request *sreq = &job->sreq;
+
+	memset(job, 0, sizeof(*job));
+
+	scsi_req_init(sreq);
+	sreq->sense_len = SCSI_SENSE_BUFFERSIZE;
+	sreq->sense = kzalloc(sreq->sense_len, gfp);
+	if (!sreq->sense)
+		return -ENOMEM;
+
+	job->req = req;
+	job->reply = sreq->sense;
+	job->reply_len = sreq->sense_len;
+	job->dd_data = job + 1;
+
+	return 0;
+}
+
+static void bsg_exit_rq(struct request_queue *q, struct request *req)
+{
+	struct bsg_job *job = blk_mq_rq_to_pdu(req);
+	struct scsi_request *sreq = &job->sreq;
+
+	kfree(sreq->sense);
+}
+
 /**
  * bsg_setup_queue - Create and add the bsg hooks so we can receive requests
  * @dev: device to attach bsg device to
@@ -235,7 +248,9 @@ struct request_queue *bsg_setup_queue(st
 	q = blk_alloc_queue(GFP_KERNEL);
 	if (!q)
 		return ERR_PTR(-ENOMEM);
-	q->cmd_size = sizeof(struct scsi_request);
+	q->cmd_size = sizeof(struct bsg_job) + dd_job_size;
+	q->init_rq_fn = bsg_init_rq;
+	q->exit_rq_fn = bsg_exit_rq;
 	q->request_fn = bsg_request_fn;
 
 	ret = blk_init_allocated_queue(q);
@@ -243,7 +258,6 @@ struct request_queue *bsg_setup_queue(st
 		goto out_cleanup_queue;
 
 	q->queuedata = dev;
-	q->bsg_job_size = dd_job_size;
 	q->bsg_job_fn = job_fn;
 	queue_flag_set_unlocked(QUEUE_FLAG_BIDI, q);
 	queue_flag_set_unlocked(QUEUE_FLAG_SCSI_PASSTHROUGH, q);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/Documentation/networking/switchdev.txt linux-libre-4.13-rc7-gnu/Documentation/networking/switchdev.txt
--- linux-libre-4.13-rc6-gnu/Documentation/networking/switchdev.txt	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/Documentation/networking/switchdev.txt	2017-08-27 20:20:40.000000000 -0400
@@ -228,7 +228,7 @@ Learning on the device port should be en
 	bridge link set dev DEV learning on self
 	bridge link set dev DEV learning_sync on self
 
-Learning_sync attribute enables syncing of the learned/forgotton FDB entry to
+Learning_sync attribute enables syncing of the learned/forgotten FDB entry to
 the bridge's FDB.  It's possible, but not optimal, to enable learning on the
 device port and on the bridge port, and disable learning_sync.
 
@@ -245,7 +245,7 @@ the responsibility of the port driver/de
 port device supports ageing, when the FDB entry expires, it will notify the
 driver which in turn will notify the bridge with SWITCHDEV_FDB_DEL.  If the
 device does not support ageing, the driver can simulate ageing using a
-garbage collection timer to monitor FBD entries.  Expired entries will be
+garbage collection timer to monitor FDB entries.  Expired entries will be
 notified to the bridge using SWITCHDEV_FDB_DEL.  See rocker driver for
 example of driver running ageing timer.
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/Documentation/sysctl/net.txt linux-libre-4.13-rc7-gnu/Documentation/sysctl/net.txt
--- linux-libre-4.13-rc6-gnu/Documentation/sysctl/net.txt	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/Documentation/sysctl/net.txt	2017-08-27 20:20:40.000000000 -0400
@@ -35,9 +35,34 @@ Table : Subdirectories in /proc/sys/net
 bpf_jit_enable
 --------------
 
-This enables Berkeley Packet Filter Just in Time compiler.
-Currently supported on x86_64 architecture, bpf_jit provides a framework
-to speed packet filtering, the one used by tcpdump/libpcap for example.
+This enables the BPF Just in Time (JIT) compiler. BPF is a flexible
+and efficient infrastructure allowing to execute bytecode at various
+hook points. It is used in a number of Linux kernel subsystems such
+as networking (e.g. XDP, tc), tracing (e.g. kprobes, uprobes, tracepoints)
+and security (e.g. seccomp). LLVM has a BPF back end that can compile
+restricted C into a sequence of BPF instructions. After program load
+through bpf(2) and passing a verifier in the kernel, a JIT will then
+translate these BPF proglets into native CPU instructions. There are
+two flavors of JITs, the newer eBPF JIT currently supported on:
+  - x86_64
+  - arm64
+  - ppc64
+  - sparc64
+  - mips64
+  - s390x
+
+And the older cBPF JIT supported on the following archs:
+  - arm
+  - mips
+  - ppc
+  - sparc
+
+eBPF JITs are a superset of cBPF JITs, meaning the kernel will
+migrate cBPF instructions into eBPF instructions and then JIT
+compile them transparently. Older cBPF JITs can only translate
+tcpdump filters, seccomp rules, etc, but not mentioned eBPF
+programs loaded through bpf(2).
+
 Values :
 	0 - disable the JIT (default value)
 	1 - enable the JIT
@@ -46,9 +71,9 @@ Values :
 bpf_jit_harden
 --------------
 
-This enables hardening for the Berkeley Packet Filter Just in Time compiler.
-Supported are eBPF JIT backends. Enabling hardening trades off performance,
-but can mitigate JIT spraying.
+This enables hardening for the BPF JIT compiler. Supported are eBPF
+JIT backends. Enabling hardening trades off performance, but can
+mitigate JIT spraying.
 Values :
 	0 - disable JIT hardening (default value)
 	1 - enable JIT hardening for unprivileged users only
@@ -57,11 +82,11 @@ Values :
 bpf_jit_kallsyms
 ----------------
 
-When Berkeley Packet Filter Just in Time compiler is enabled, then compiled
-images are unknown addresses to the kernel, meaning they neither show up in
-traces nor in /proc/kallsyms. This enables export of these addresses, which
-can be used for debugging/tracing. If bpf_jit_harden is enabled, this feature
-is disabled.
+When BPF JIT compiler is enabled, then compiled images are unknown
+addresses to the kernel, meaning they neither show up in traces nor
+in /proc/kallsyms. This enables export of these addresses, which can
+be used for debugging/tracing. If bpf_jit_harden is enabled, this
+feature is disabled.
 Values :
 	0 - disable JIT kallsyms export (default value)
 	1 - enable JIT kallsyms export for privileged users only
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/acpi/acpica/nsxfeval.c linux-libre-4.13-rc7-gnu/drivers/acpi/acpica/nsxfeval.c
--- linux-libre-4.13-rc6-gnu/drivers/acpi/acpica/nsxfeval.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/acpi/acpica/nsxfeval.c	2017-08-27 20:20:40.000000000 -0400
@@ -100,9 +100,13 @@ acpi_evaluate_object_typed(acpi_handle h
 		free_buffer_on_error = TRUE;
 	}
 
-	status = acpi_get_handle(handle, pathname, &target_handle);
-	if (ACPI_FAILURE(status)) {
-		return_ACPI_STATUS(status);
+	if (pathname) {
+		status = acpi_get_handle(handle, pathname, &target_handle);
+		if (ACPI_FAILURE(status)) {
+			return_ACPI_STATUS(status);
+		}
+	} else {
+		target_handle = handle;
 	}
 
 	full_pathname = acpi_ns_get_external_pathname(target_handle);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/acpi/ec.c linux-libre-4.13-rc7-gnu/drivers/acpi/ec.c
--- linux-libre-4.13-rc6-gnu/drivers/acpi/ec.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/acpi/ec.c	2017-08-27 20:20:40.000000000 -0400
@@ -1741,7 +1741,7 @@ error:
  * functioning ECDT EC first in order to handle the events.
  * https://bugzilla.kernel.org/show_bug.cgi?id=115021
  */
-int __init acpi_ec_ecdt_start(void)
+static int __init acpi_ec_ecdt_start(void)
 {
 	acpi_handle handle;
 
@@ -2003,20 +2003,17 @@ static inline void acpi_ec_query_exit(vo
 int __init acpi_ec_init(void)
 {
 	int result;
+	int ecdt_fail, dsdt_fail;
 
 	/* register workqueue for _Qxx evaluations */
 	result = acpi_ec_query_init();
 	if (result)
-		goto err_exit;
-	/* Now register the driver for the EC */
-	result = acpi_bus_register_driver(&acpi_ec_driver);
-	if (result)
-		goto err_exit;
+		return result;
 
-err_exit:
-	if (result)
-		acpi_ec_query_exit();
-	return result;
+	/* Drivers must be started after acpi_ec_query_init() */
+	ecdt_fail = acpi_ec_ecdt_start();
+	dsdt_fail = acpi_bus_register_driver(&acpi_ec_driver);
+	return ecdt_fail && dsdt_fail ? -ENODEV : 0;
 }
 
 /* EC driver currently not unloadable */
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/acpi/internal.h linux-libre-4.13-rc7-gnu/drivers/acpi/internal.h
--- linux-libre-4.13-rc6-gnu/drivers/acpi/internal.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/acpi/internal.h	2017-08-27 20:20:40.000000000 -0400
@@ -185,7 +185,6 @@ typedef int (*acpi_ec_query_func) (void
 int acpi_ec_init(void);
 int acpi_ec_ecdt_probe(void);
 int acpi_ec_dsdt_probe(void);
-int acpi_ec_ecdt_start(void);
 void acpi_ec_block_transactions(void);
 void acpi_ec_unblock_transactions(void);
 int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/acpi/property.c linux-libre-4.13-rc7-gnu/drivers/acpi/property.c
--- linux-libre-4.13-rc6-gnu/drivers/acpi/property.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/acpi/property.c	2017-08-27 20:20:40.000000000 -0400
@@ -1047,7 +1047,7 @@ static struct fwnode_handle *acpi_graph_
 	fwnode_for_each_child_node(fwnode, child) {
 		u32 nr;
 
-		if (!fwnode_property_read_u32(fwnode, prop_name, &nr))
+		if (fwnode_property_read_u32(child, prop_name, &nr))
 			continue;
 
 		if (val == nr)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/acpi/scan.c linux-libre-4.13-rc7-gnu/drivers/acpi/scan.c
--- linux-libre-4.13-rc6-gnu/drivers/acpi/scan.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/acpi/scan.c	2017-08-27 20:20:40.000000000 -0400
@@ -2084,7 +2084,6 @@ int __init acpi_scan_init(void)
 
 	acpi_gpe_apply_masked_gpes();
 	acpi_update_all_gpes();
-	acpi_ec_ecdt_start();
 
 	acpi_scan_initialized = true;
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/android/binder.c linux-libre-4.13-rc7-gnu/drivers/android/binder.c
--- linux-libre-4.13-rc6-gnu/drivers/android/binder.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/android/binder.c	2017-08-27 20:20:40.000000000 -0400
@@ -3362,7 +3362,7 @@ static int binder_mmap(struct file *filp
 	const char *failure_string;
 	struct binder_buffer *buffer;
 
-	if (proc->tsk != current)
+	if (proc->tsk != current->group_leader)
 		return -EINVAL;
 
 	if ((vma->vm_end - vma->vm_start) > SZ_4M)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/block/loop.c linux-libre-4.13-rc7-gnu/drivers/block/loop.c
--- linux-libre-4.13-rc6-gnu/drivers/block/loop.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/block/loop.c	2017-08-27 20:20:40.000000000 -0400
@@ -221,8 +221,7 @@ static void __loop_update_dio(struct loo
 }
 
 static int
-figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit,
-		 loff_t logical_blocksize)
+figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit)
 {
 	loff_t size = get_size(offset, sizelimit, lo->lo_backing_file);
 	sector_t x = (sector_t)size;
@@ -234,12 +233,6 @@ figure_loop_size(struct loop_device *lo,
 		lo->lo_offset = offset;
 	if (lo->lo_sizelimit != sizelimit)
 		lo->lo_sizelimit = sizelimit;
-	if (lo->lo_flags & LO_FLAGS_BLOCKSIZE) {
-		lo->lo_logical_blocksize = logical_blocksize;
-		blk_queue_physical_block_size(lo->lo_queue, lo->lo_blocksize);
-		blk_queue_logical_block_size(lo->lo_queue,
-					     lo->lo_logical_blocksize);
-	}
 	set_capacity(lo->lo_disk, x);
 	bd_set_size(bdev, (loff_t)get_capacity(bdev->bd_disk) << 9);
 	/* let user-space know about the new size */
@@ -820,7 +813,6 @@ static void loop_config_discard(struct l
 	struct file *file = lo->lo_backing_file;
 	struct inode *inode = file->f_mapping->host;
 	struct request_queue *q = lo->lo_queue;
-	int lo_bits = 9;
 
 	/*
 	 * We use punch hole to reclaim the free space used by the
@@ -840,11 +832,9 @@ static void loop_config_discard(struct l
 
 	q->limits.discard_granularity = inode->i_sb->s_blocksize;
 	q->limits.discard_alignment = 0;
-	if (lo->lo_flags & LO_FLAGS_BLOCKSIZE)
-		lo_bits = blksize_bits(lo->lo_logical_blocksize);
 
-	blk_queue_max_discard_sectors(q, UINT_MAX >> lo_bits);
-	blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> lo_bits);
+	blk_queue_max_discard_sectors(q, UINT_MAX >> 9);
+	blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> 9);
 	queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q);
 }
 
@@ -938,7 +928,6 @@ static int loop_set_fd(struct loop_devic
 
 	lo->use_dio = false;
 	lo->lo_blocksize = lo_blocksize;
-	lo->lo_logical_blocksize = 512;
 	lo->lo_device = bdev;
 	lo->lo_flags = lo_flags;
 	lo->lo_backing_file = file;
@@ -1104,7 +1093,6 @@ loop_set_status(struct loop_device *lo,
 	int err;
 	struct loop_func_table *xfer;
 	kuid_t uid = current_uid();
-	int lo_flags = lo->lo_flags;
 
 	if (lo->lo_encrypt_key_size &&
 	    !uid_eq(lo->lo_key_owner, uid) &&
@@ -1137,26 +1125,9 @@ loop_set_status(struct loop_device *lo,
 	if (err)
 		goto exit;
 
-	if (info->lo_flags & LO_FLAGS_BLOCKSIZE) {
-		if (!(lo->lo_flags & LO_FLAGS_BLOCKSIZE))
-			lo->lo_logical_blocksize = 512;
-		lo->lo_flags |= LO_FLAGS_BLOCKSIZE;
-		if (LO_INFO_BLOCKSIZE(info) != 512 &&
-		    LO_INFO_BLOCKSIZE(info) != 1024 &&
-		    LO_INFO_BLOCKSIZE(info) != 2048 &&
-		    LO_INFO_BLOCKSIZE(info) != 4096)
-			return -EINVAL;
-		if (LO_INFO_BLOCKSIZE(info) > lo->lo_blocksize)
-			return -EINVAL;
-	}
-
 	if (lo->lo_offset != info->lo_offset ||
-	    lo->lo_sizelimit != info->lo_sizelimit ||
-	    lo->lo_flags != lo_flags ||
-	    ((lo->lo_flags & LO_FLAGS_BLOCKSIZE) &&
-	     lo->lo_logical_blocksize != LO_INFO_BLOCKSIZE(info))) {
-		if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit,
-				     LO_INFO_BLOCKSIZE(info))) {
+	    lo->lo_sizelimit != info->lo_sizelimit) {
+		if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) {
 			err = -EFBIG;
 			goto exit;
 		}
@@ -1348,8 +1319,7 @@ static int loop_set_capacity(struct loop
 	if (unlikely(lo->lo_state != Lo_bound))
 		return -ENXIO;
 
-	return figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit,
-				lo->lo_logical_blocksize);
+	return figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit);
 }
 
 static int loop_set_dio(struct loop_device *lo, unsigned long arg)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/block/loop.h linux-libre-4.13-rc7-gnu/drivers/block/loop.h
--- linux-libre-4.13-rc6-gnu/drivers/block/loop.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/block/loop.h	2017-08-27 20:20:40.000000000 -0400
@@ -49,7 +49,6 @@ struct loop_device {
 	struct file *	lo_backing_file;
 	struct block_device *lo_device;
 	unsigned	lo_blocksize;
-	unsigned	lo_logical_blocksize;
 	void		*key_data; 
 
 	gfp_t		old_gfp_mask;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/block/virtio_blk.c linux-libre-4.13-rc7-gnu/drivers/block/virtio_blk.c
--- linux-libre-4.13-rc6-gnu/drivers/block/virtio_blk.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/block/virtio_blk.c	2017-08-27 20:20:40.000000000 -0400
@@ -381,6 +381,7 @@ static void virtblk_config_changed_work(
 	struct request_queue *q = vblk->disk->queue;
 	char cap_str_2[10], cap_str_10[10];
 	char *envp[] = { "RESIZE=1", NULL };
+	unsigned long long nblocks;
 	u64 capacity;
 
 	/* Host must always specify the capacity. */
@@ -393,16 +394,19 @@ static void virtblk_config_changed_work(
 		capacity = (sector_t)-1;
 	}
 
-	string_get_size(capacity, queue_logical_block_size(q),
+	nblocks = DIV_ROUND_UP_ULL(capacity, queue_logical_block_size(q) >> 9);
+
+	string_get_size(nblocks, queue_logical_block_size(q),
 			STRING_UNITS_2, cap_str_2, sizeof(cap_str_2));
-	string_get_size(capacity, queue_logical_block_size(q),
+	string_get_size(nblocks, queue_logical_block_size(q),
 			STRING_UNITS_10, cap_str_10, sizeof(cap_str_10));
 
 	dev_notice(&vdev->dev,
-		  "new size: %llu %d-byte logical blocks (%s/%s)\n",
-		  (unsigned long long)capacity,
-		  queue_logical_block_size(q),
-		  cap_str_10, cap_str_2);
+		   "new size: %llu %d-byte logical blocks (%s/%s)\n",
+		   nblocks,
+		   queue_logical_block_size(q),
+		   cap_str_10,
+		   cap_str_2);
 
 	set_capacity(vblk->disk, capacity);
 	revalidate_disk(vblk->disk);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/dma/tegra210-adma.c linux-libre-4.13-rc7-gnu/drivers/dma/tegra210-adma.c
--- linux-libre-4.13-rc6-gnu/drivers/dma/tegra210-adma.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/dma/tegra210-adma.c	2017-08-27 20:20:40.000000000 -0400
@@ -717,8 +717,8 @@ static int tegra_adma_probe(struct platf
 		tdc->chan_addr = tdma->base_addr + ADMA_CH_REG_OFFSET(i);
 
 		tdc->irq = of_irq_get(pdev->dev.of_node, i);
-		if (tdc->irq < 0) {
-			ret = tdc->irq;
+		if (tdc->irq <= 0) {
+			ret = tdc->irq ?: -ENXIO;
 			goto irq_dispose;
 		}
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpio/gpiolib-sysfs.c linux-libre-4.13-rc7-gnu/drivers/gpio/gpiolib-sysfs.c
--- linux-libre-4.13-rc6-gnu/drivers/gpio/gpiolib-sysfs.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpio/gpiolib-sysfs.c	2017-08-27 20:20:40.000000000 -0400
@@ -2,6 +2,7 @@
 #include <linux/mutex.h>
 #include <linux/device.h>
 #include <linux/sysfs.h>
+#include <linux/gpio.h>
 #include <linux/gpio/consumer.h>
 #include <linux/gpio/driver.h>
 #include <linux/interrupt.h>
@@ -432,6 +433,11 @@ static struct attribute *gpiochip_attrs[
 };
 ATTRIBUTE_GROUPS(gpiochip);
 
+static struct gpio_desc *gpio_to_valid_desc(int gpio)
+{
+	return gpio_is_valid(gpio) ? gpio_to_desc(gpio) : NULL;
+}
+
 /*
  * /sys/class/gpio/export ... write-only
  *	integer N ... number of GPIO to export (full access)
@@ -450,7 +456,7 @@ static ssize_t export_store(struct class
 	if (status < 0)
 		goto done;
 
-	desc = gpio_to_desc(gpio);
+	desc = gpio_to_valid_desc(gpio);
 	/* reject invalid GPIOs */
 	if (!desc) {
 		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
@@ -493,7 +499,7 @@ static ssize_t unexport_store(struct cla
 	if (status < 0)
 		goto done;
 
-	desc = gpio_to_desc(gpio);
+	desc = gpio_to_valid_desc(gpio);
 	/* reject bogus commands (gpio_unexport ignores them) */
 	if (!desc) {
 		pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpio/gpio-mvebu.c linux-libre-4.13-rc7-gnu/drivers/gpio/gpio-mvebu.c
--- linux-libre-4.13-rc6-gnu/drivers/gpio/gpio-mvebu.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpio/gpio-mvebu.c	2017-08-27 20:20:40.000000000 -0400
@@ -557,7 +557,7 @@ static void mvebu_gpio_irq_handler(struc
 	edge_cause = mvebu_gpio_read_edge_cause(mvchip);
 	edge_mask  = mvebu_gpio_read_edge_mask(mvchip);
 
-	cause = (data_in ^ level_mask) | (edge_cause & edge_mask);
+	cause = (data_in & level_mask) | (edge_cause & edge_mask);
 
 	for (i = 0; i < mvchip->chip.ngpio; i++) {
 		int irq;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/drm_atomic.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/drm_atomic.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/drm_atomic.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/drm_atomic.c	2017-08-27 20:20:40.000000000 -0400
@@ -1655,6 +1655,9 @@ int drm_atomic_check_only(struct drm_ato
 	if (config->funcs->atomic_check)
 		ret = config->funcs->atomic_check(state->dev, state);
 
+	if (ret)
+		return ret;
+
 	if (!state->allow_modeset) {
 		for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
 			if (drm_atomic_crtc_needs_modeset(crtc_state)) {
@@ -1665,7 +1668,7 @@ int drm_atomic_check_only(struct drm_ato
 		}
 	}
 
-	return ret;
+	return 0;
 }
 EXPORT_SYMBOL(drm_atomic_check_only);
 
@@ -2167,10 +2170,10 @@ int drm_mode_atomic_ioctl(struct drm_dev
 	struct drm_atomic_state *state;
 	struct drm_modeset_acquire_ctx ctx;
 	struct drm_plane *plane;
-	struct drm_out_fence_state *fence_state = NULL;
+	struct drm_out_fence_state *fence_state;
 	unsigned plane_mask;
 	int ret = 0;
-	unsigned int i, j, num_fences = 0;
+	unsigned int i, j, num_fences;
 
 	/* disallow for drivers not supporting atomic: */
 	if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
@@ -2211,6 +2214,8 @@ retry:
 	plane_mask = 0;
 	copied_objs = 0;
 	copied_props = 0;
+	fence_state = NULL;
+	num_fences = 0;
 
 	for (i = 0; i < arg->count_objs; i++) {
 		uint32_t obj_id, count_props;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/drm_gem.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/drm_gem.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/drm_gem.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/drm_gem.c	2017-08-27 20:20:40.000000000 -0400
@@ -255,13 +255,13 @@ drm_gem_object_release_handle(int id, vo
 	struct drm_gem_object *obj = ptr;
 	struct drm_device *dev = obj->dev;
 
+	if (dev->driver->gem_close_object)
+		dev->driver->gem_close_object(obj, file_priv);
+
 	if (drm_core_check_feature(dev, DRIVER_PRIME))
 		drm_gem_remove_prime_handles(obj, file_priv);
 	drm_vma_node_revoke(&obj->vma_node, file_priv);
 
-	if (dev->driver->gem_close_object)
-		dev->driver->gem_close_object(obj, file_priv);
-
 	drm_gem_object_handle_put_unlocked(obj);
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/drm_plane.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/drm_plane.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/drm_plane.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/drm_plane.c	2017-08-27 20:20:40.000000000 -0400
@@ -601,6 +601,7 @@ int drm_mode_setplane(struct drm_device
 
 		crtc = drm_crtc_find(dev, plane_req->crtc_id);
 		if (!crtc) {
+			drm_framebuffer_put(fb);
 			DRM_DEBUG_KMS("Unknown crtc ID %d\n",
 				      plane_req->crtc_id);
 			return -ENOENT;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/gvt/cmd_parser.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/gvt/cmd_parser.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/gvt/cmd_parser.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/gvt/cmd_parser.c	2017-08-27 20:20:40.000000000 -0400
@@ -2714,7 +2714,7 @@ static int shadow_indirect_ctx(struct in
 unmap_src:
 	i915_gem_object_unpin_map(obj);
 put_obj:
-	i915_gem_object_put(wa_ctx->indirect_ctx.obj);
+	i915_gem_object_put(obj);
 	return ret;
 }
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_bios.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_bios.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_bios.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_bios.c	2017-08-27 20:20:40.000000000 -0400
@@ -1120,8 +1120,8 @@ static void parse_ddi_port(struct drm_i9
 	bool is_dvi, is_hdmi, is_dp, is_edp, is_crt;
 	uint8_t aux_channel, ddc_pin;
 	/* Each DDI port can have more than one value on the "DVO Port" field,
-	 * so look for all the possible values for each port and abort if more
-	 * than one is found. */
+	 * so look for all the possible values for each port.
+	 */
 	int dvo_ports[][3] = {
 		{DVO_PORT_HDMIA, DVO_PORT_DPA, -1},
 		{DVO_PORT_HDMIB, DVO_PORT_DPB, -1},
@@ -1130,7 +1130,10 @@ static void parse_ddi_port(struct drm_i9
 		{DVO_PORT_CRT, DVO_PORT_HDMIE, DVO_PORT_DPE},
 	};
 
-	/* Find the child device to use, abort if more than one found. */
+	/*
+	 * Find the first child device to reference the port, report if more
+	 * than one found.
+	 */
 	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
 		it = dev_priv->vbt.child_dev + i;
 
@@ -1140,11 +1143,11 @@ static void parse_ddi_port(struct drm_i9
 
 			if (it->common.dvo_port == dvo_ports[port][j]) {
 				if (child) {
-					DRM_DEBUG_KMS("More than one child device for port %c in VBT.\n",
+					DRM_DEBUG_KMS("More than one child device for port %c in VBT, using the first.\n",
 						      port_name(port));
-					return;
+				} else {
+					child = it;
 				}
-				child = it;
 			}
 		}
 	}
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_dsi_dcs_backlight.c	2017-08-27 20:20:40.000000000 -0400
@@ -46,7 +46,7 @@ static u32 dcs_get_backlight(struct inte
 	struct intel_encoder *encoder = connector->encoder;
 	struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
 	struct mipi_dsi_device *dsi_device;
-	u8 data;
+	u8 data = 0;
 	enum port port;
 
 	/* FIXME: Need to take care of 16 bit brightness level */
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_dsi_vbt.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_dsi_vbt.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_dsi_vbt.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_dsi_vbt.c	2017-08-27 20:20:40.000000000 -0400
@@ -306,7 +306,7 @@ static void bxt_exec_gpio(struct drm_i91
 
 	if (!gpio_desc) {
 		gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev,
-						 "panel", gpio_index,
+						 NULL, gpio_index,
 						 value ? GPIOD_OUT_LOW :
 						 GPIOD_OUT_HIGH);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_lrc.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_lrc.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_lrc.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_lrc.c	2017-08-27 20:20:40.000000000 -0400
@@ -1221,6 +1221,14 @@ static int intel_init_workaround_bb(stru
 	return ret;
 }
 
+static u8 gtiir[] = {
+	[RCS] = 0,
+	[BCS] = 0,
+	[VCS] = 1,
+	[VCS2] = 1,
+	[VECS] = 3,
+};
+
 static int gen8_init_common_ring(struct intel_engine_cs *engine)
 {
 	struct drm_i915_private *dev_priv = engine->i915;
@@ -1245,9 +1253,22 @@ static int gen8_init_common_ring(struct
 
 	DRM_DEBUG_DRIVER("Execlists enabled for %s\n", engine->name);
 
-	/* After a GPU reset, we may have requests to replay */
+	GEM_BUG_ON(engine->id >= ARRAY_SIZE(gtiir));
+
+	/*
+	 * Clear any pending interrupt state.
+	 *
+	 * We do it twice out of paranoia that some of the IIR are double
+	 * buffered, and if we only reset it once there may still be
+	 * an interrupt pending.
+	 */
+	I915_WRITE(GEN8_GT_IIR(gtiir[engine->id]),
+		   GT_CONTEXT_SWITCH_INTERRUPT << engine->irq_shift);
+	I915_WRITE(GEN8_GT_IIR(gtiir[engine->id]),
+		   GT_CONTEXT_SWITCH_INTERRUPT << engine->irq_shift);
 	clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
 
+	/* After a GPU reset, we may have requests to replay */
 	submit = false;
 	for (n = 0; n < ARRAY_SIZE(engine->execlist_port); n++) {
 		if (!port_isset(&port[n]))
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_lspcon.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_lspcon.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/i915/intel_lspcon.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/i915/intel_lspcon.c	2017-08-27 20:20:40.000000000 -0400
@@ -210,8 +210,8 @@ bool lspcon_init(struct intel_digital_po
 	struct drm_device *dev = intel_dig_port->base.base.dev;
 	struct drm_i915_private *dev_priv = to_i915(dev);
 
-	if (!IS_GEN9(dev_priv)) {
-		DRM_ERROR("LSPCON is supported on GEN9 only\n");
+	if (!HAS_LSPCON(dev_priv)) {
+		DRM_ERROR("LSPCON is not supported on this platform\n");
 		return false;
 	}
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/imx/ipuv3-plane.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/imx/ipuv3-plane.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/imx/ipuv3-plane.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/imx/ipuv3-plane.c	2017-08-27 20:20:40.000000000 -0400
@@ -545,15 +545,13 @@ static void ipu_plane_atomic_update(stru
 		return;
 	}
 
+	ics = ipu_drm_fourcc_to_colorspace(fb->format->format);
 	switch (ipu_plane->dp_flow) {
 	case IPU_DP_FLOW_SYNC_BG:
-		ipu_dp_setup_channel(ipu_plane->dp,
-					IPUV3_COLORSPACE_RGB,
-					IPUV3_COLORSPACE_RGB);
+		ipu_dp_setup_channel(ipu_plane->dp, ics, IPUV3_COLORSPACE_RGB);
 		ipu_dp_set_global_alpha(ipu_plane->dp, true, 0, true);
 		break;
 	case IPU_DP_FLOW_SYNC_FG:
-		ics = ipu_drm_fourcc_to_colorspace(state->fb->format->format);
 		ipu_dp_setup_channel(ipu_plane->dp, ics,
 					IPUV3_COLORSPACE_UNKNOWN);
 		/* Enable local alpha on partial plane */
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/rockchip/rockchip_drm_drv.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/rockchip/rockchip_drm_drv.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/rockchip/rockchip_drm_drv.c	2017-08-27 20:20:40.000000000 -0400
@@ -275,11 +275,15 @@ static void rockchip_drm_fb_resume(struc
 static int rockchip_drm_sys_suspend(struct device *dev)
 {
 	struct drm_device *drm = dev_get_drvdata(dev);
-	struct rockchip_drm_private *priv = drm->dev_private;
+	struct rockchip_drm_private *priv;
+
+	if (!drm)
+		return 0;
 
 	drm_kms_helper_poll_disable(drm);
 	rockchip_drm_fb_suspend(drm);
 
+	priv = drm->dev_private;
 	priv->state = drm_atomic_helper_suspend(drm);
 	if (IS_ERR(priv->state)) {
 		rockchip_drm_fb_resume(drm);
@@ -293,8 +297,12 @@ static int rockchip_drm_sys_suspend(stru
 static int rockchip_drm_sys_resume(struct device *dev)
 {
 	struct drm_device *drm = dev_get_drvdata(dev);
-	struct rockchip_drm_private *priv = drm->dev_private;
+	struct rockchip_drm_private *priv;
+
+	if (!drm)
+		return 0;
 
+	priv = drm->dev_private;
 	drm_atomic_helper_resume(drm, priv->state);
 	rockchip_drm_fb_resume(drm);
 	drm_kms_helper_poll_enable(drm);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/drm/sun4i/sun4i_drv.c linux-libre-4.13-rc7-gnu/drivers/gpu/drm/sun4i/sun4i_drv.c
--- linux-libre-4.13-rc6-gnu/drivers/gpu/drm/sun4i/sun4i_drv.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/drm/sun4i/sun4i_drv.c	2017-08-27 20:20:40.000000000 -0400
@@ -25,12 +25,20 @@
 #include "sun4i_framebuffer.h"
 #include "sun4i_tcon.h"
 
+static void sun4i_drv_lastclose(struct drm_device *dev)
+{
+	struct sun4i_drv *drv = dev->dev_private;
+
+	drm_fbdev_cma_restore_mode(drv->fbdev);
+}
+
 DEFINE_DRM_GEM_CMA_FOPS(sun4i_drv_fops);
 
 static struct drm_driver sun4i_drv_driver = {
 	.driver_features	= DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
 
 	/* Generic Operations */
+	.lastclose		= sun4i_drv_lastclose,
 	.fops			= &sun4i_drv_fops,
 	.name			= "sun4i-drm",
 	.desc			= "Allwinner sun4i Display Engine",
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/gpu/ipu-v3/Kconfig linux-libre-4.13-rc7-gnu/drivers/gpu/ipu-v3/Kconfig
--- linux-libre-4.13-rc6-gnu/drivers/gpu/ipu-v3/Kconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/gpu/ipu-v3/Kconfig	2017-08-27 20:20:40.000000000 -0400
@@ -1,6 +1,7 @@
 config IMX_IPUV3_CORE
 	tristate "IPUv3 core support"
 	depends on SOC_IMX5 || SOC_IMX6Q || ARCH_MULTIPLATFORM
+	depends on DRM || !DRM # if DRM=m, this can't be 'y'
 	select GENERIC_IRQ_CHIP
 	help
 	  Choose this if you have a i.MX5/6 system and want to use the Image
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-aspeed.c linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-aspeed.c
--- linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-aspeed.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-aspeed.c	2017-08-27 20:20:40.000000000 -0400
@@ -410,10 +410,11 @@ static bool aspeed_i2c_master_irq(struct
 	}
 
 	/* We are in an invalid state; reset bus to a known state. */
-	if (!bus->msgs && bus->master_state != ASPEED_I2C_MASTER_STOP) {
+	if (!bus->msgs) {
 		dev_err(bus->dev, "bus in unknown state");
 		bus->cmd_err = -EIO;
-		aspeed_i2c_do_stop(bus);
+		if (bus->master_state != ASPEED_I2C_MASTER_STOP)
+			aspeed_i2c_do_stop(bus);
 		goto out_no_complete;
 	}
 	msg = &bus->msgs[bus->msgs_index];
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-designware-platdrv.c linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-designware-platdrv.c
--- linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-designware-platdrv.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-designware-platdrv.c	2017-08-27 20:20:40.000000000 -0400
@@ -198,8 +198,7 @@ static void i2c_dw_configure_slave(struc
 	dev->functionality = I2C_FUNC_SLAVE | DW_IC_DEFAULT_FUNCTIONALITY;
 
 	dev->slave_cfg = DW_IC_CON_RX_FIFO_FULL_HLD_CTRL |
-			 DW_IC_CON_RESTART_EN | DW_IC_CON_STOP_DET_IFADDRESSED |
-			 DW_IC_CON_SPEED_FAST;
+			 DW_IC_CON_RESTART_EN | DW_IC_CON_STOP_DET_IFADDRESSED;
 
 	dev->mode = DW_IC_SLAVE;
 
@@ -430,7 +429,7 @@ static void dw_i2c_plat_complete(struct
 #endif
 
 #ifdef CONFIG_PM
-static int dw_i2c_plat_suspend(struct device *dev)
+static int dw_i2c_plat_runtime_suspend(struct device *dev)
 {
 	struct platform_device *pdev = to_platform_device(dev);
 	struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
@@ -452,11 +451,21 @@ static int dw_i2c_plat_resume(struct dev
 	return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int dw_i2c_plat_suspend(struct device *dev)
+{
+	pm_runtime_resume(dev);
+	return dw_i2c_plat_runtime_suspend(dev);
+}
+#endif
+
 static const struct dev_pm_ops dw_i2c_dev_pm_ops = {
 	.prepare = dw_i2c_plat_prepare,
 	.complete = dw_i2c_plat_complete,
 	SET_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume)
-	SET_RUNTIME_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume, NULL)
+	SET_RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend,
+			   dw_i2c_plat_resume,
+			   NULL)
 };
 
 #define DW_I2C_DEV_PMOPS (&dw_i2c_dev_pm_ops)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-designware-slave.c linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-designware-slave.c
--- linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-designware-slave.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-designware-slave.c	2017-08-27 20:20:40.000000000 -0400
@@ -177,6 +177,8 @@ static int i2c_dw_reg_slave(struct i2c_c
 		return -EBUSY;
 	if (slave->flags & I2C_CLIENT_TEN)
 		return -EAFNOSUPPORT;
+	pm_runtime_get_sync(dev->dev);
+
 	/*
 	 * Set slave address in the IC_SAR register,
 	 * the address to which the DW_apb_i2c responds.
@@ -205,6 +207,7 @@ static int i2c_dw_unreg_slave(struct i2c
 	dev->disable_int(dev);
 	dev->disable(dev);
 	dev->slave = NULL;
+	pm_runtime_put(dev->dev);
 
 	return 0;
 }
@@ -272,7 +275,7 @@ static int i2c_dw_irq_handler_slave(stru
 	slave_activity = ((dw_readl(dev, DW_IC_STATUS) &
 		DW_IC_STATUS_SLAVE_ACTIVITY) >> 6);
 
-	if (!enabled || !(raw_stat & ~DW_IC_INTR_ACTIVITY))
+	if (!enabled || !(raw_stat & ~DW_IC_INTR_ACTIVITY) || !dev->slave)
 		return 0;
 
 	dev_dbg(dev->dev,
@@ -382,7 +385,6 @@ int i2c_dw_probe_slave(struct dw_i2c_dev
 	ret = i2c_add_numbered_adapter(adap);
 	if (ret)
 		dev_err(dev->dev, "failure adding adapter: %d\n", ret);
-	pm_runtime_put_noidle(dev->dev);
 
 	return ret;
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-simtec.c linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-simtec.c
--- linux-libre-4.13-rc6-gnu/drivers/i2c/busses/i2c-simtec.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/i2c/busses/i2c-simtec.c	2017-08-27 20:20:40.000000000 -0400
@@ -127,8 +127,7 @@ static int simtec_i2c_probe(struct platf
 	iounmap(pd->reg);
 
  err_res:
-	release_resource(pd->ioarea);
-	kfree(pd->ioarea);
+	release_mem_region(pd->ioarea->start, size);
 
  err:
 	kfree(pd);
@@ -142,8 +141,7 @@ static int simtec_i2c_remove(struct plat
 	i2c_del_adapter(&pd->adap);
 
 	iounmap(pd->reg);
-	release_resource(pd->ioarea);
-	kfree(pd->ioarea);
+	release_mem_region(pd->ioarea->start, resource_size(pd->ioarea));
 	kfree(pd);
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/i2c/i2c-core-base.c linux-libre-4.13-rc7-gnu/drivers/i2c/i2c-core-base.c
--- linux-libre-4.13-rc6-gnu/drivers/i2c/i2c-core-base.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/i2c/i2c-core-base.c	2017-08-27 20:20:40.000000000 -0400
@@ -353,8 +353,8 @@ static int i2c_device_probe(struct devic
 	}
 
 	/*
-	 * An I2C ID table is not mandatory, if and only if, a suitable Device
-	 * Tree match table entry is supplied for the probing device.
+	 * An I2C ID table is not mandatory, if and only if, a suitable OF
+	 * or ACPI ID table is supplied for the probing device.
 	 */
 	if (!driver->id_table &&
 	    !i2c_acpi_match_device(dev->driver->acpi_match_table, client) &&
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/adc/ina2xx-adc.c linux-libre-4.13-rc7-gnu/drivers/iio/adc/ina2xx-adc.c
--- linux-libre-4.13-rc6-gnu/drivers/iio/adc/ina2xx-adc.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/adc/ina2xx-adc.c	2017-08-27 20:20:40.000000000 -0400
@@ -644,7 +644,7 @@ static int ina2xx_capture_thread(void *d
 {
 	struct iio_dev *indio_dev = data;
 	struct ina2xx_chip_info *chip = iio_priv(indio_dev);
-	unsigned int sampling_us = SAMPLING_PERIOD(chip);
+	int sampling_us = SAMPLING_PERIOD(chip);
 	int buffer_us;
 
 	/*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/adc/stm32-adc-core.c linux-libre-4.13-rc7-gnu/drivers/iio/adc/stm32-adc-core.c
--- linux-libre-4.13-rc6-gnu/drivers/iio/adc/stm32-adc-core.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/adc/stm32-adc-core.c	2017-08-27 20:20:40.000000000 -0400
@@ -64,7 +64,7 @@
 #define STM32H7_CKMODE_MASK		GENMASK(17, 16)
 
 /* STM32 H7 maximum analog clock rate (from datasheet) */
-#define STM32H7_ADC_MAX_CLK_RATE	72000000
+#define STM32H7_ADC_MAX_CLK_RATE	36000000
 
 /**
  * stm32_adc_common_regs - stm32 common registers, compatible dependent data
@@ -148,14 +148,14 @@ static int stm32f4_adc_clk_sel(struct pl
 		return -EINVAL;
 	}
 
-	priv->common.rate = rate;
+	priv->common.rate = rate / stm32f4_pclk_div[i];
 	val = readl_relaxed(priv->common.base + STM32F4_ADC_CCR);
 	val &= ~STM32F4_ADC_ADCPRE_MASK;
 	val |= i << STM32F4_ADC_ADCPRE_SHIFT;
 	writel_relaxed(val, priv->common.base + STM32F4_ADC_CCR);
 
 	dev_dbg(&pdev->dev, "Using analog clock source at %ld kHz\n",
-		rate / (stm32f4_pclk_div[i] * 1000));
+		priv->common.rate / 1000);
 
 	return 0;
 }
@@ -250,7 +250,7 @@ static int stm32h7_adc_clk_sel(struct pl
 
 out:
 	/* rate used later by each ADC instance to control BOOST mode */
-	priv->common.rate = rate;
+	priv->common.rate = rate / div;
 
 	/* Set common clock mode and prescaler */
 	val = readl_relaxed(priv->common.base + STM32H7_ADC_CCR);
@@ -260,7 +260,7 @@ out:
 	writel_relaxed(val, priv->common.base + STM32H7_ADC_CCR);
 
 	dev_dbg(&pdev->dev, "Using %s clock/%d source at %ld kHz\n",
-		ckmode ? "bus" : "adc", div, rate / (div * 1000));
+		ckmode ? "bus" : "adc", div, priv->common.rate / 1000);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/common/hid-sensors/hid-sensor-trigger.c linux-libre-4.13-rc7-gnu/drivers/iio/common/hid-sensors/hid-sensor-trigger.c
--- linux-libre-4.13-rc6-gnu/drivers/iio/common/hid-sensors/hid-sensor-trigger.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/common/hid-sensors/hid-sensor-trigger.c	2017-08-27 20:20:40.000000000 -0400
@@ -111,8 +111,6 @@ static int _hid_sensor_power_state(struc
 	s32 poll_value = 0;
 
 	if (state) {
-		if (!atomic_read(&st->user_requested_state))
-			return 0;
 		if (sensor_hub_device_open(st->hsdev))
 			return -EIO;
 
@@ -161,6 +159,9 @@ static int _hid_sensor_power_state(struc
 				       &report_val);
 	}
 
+	pr_debug("HID_SENSOR %s set power_state %d report_state %d\n",
+		 st->pdev->name, state_val, report_val);
+
 	sensor_hub_get_feature(st->hsdev, st->power_state.report_id,
 			       st->power_state.index,
 			       sizeof(state_val), &state_val);
@@ -182,6 +183,7 @@ int hid_sensor_power_state(struct hid_se
 		ret = pm_runtime_get_sync(&st->pdev->dev);
 	else {
 		pm_runtime_mark_last_busy(&st->pdev->dev);
+		pm_runtime_use_autosuspend(&st->pdev->dev);
 		ret = pm_runtime_put_autosuspend(&st->pdev->dev);
 	}
 	if (ret < 0) {
@@ -285,8 +287,6 @@ int hid_sensor_setup_trigger(struct iio_
 	/* Default to 3 seconds, but can be changed from sysfs */
 	pm_runtime_set_autosuspend_delay(&attrb->pdev->dev,
 					 3000);
-	pm_runtime_use_autosuspend(&attrb->pdev->dev);
-
 	return ret;
 error_unreg_trigger:
 	iio_trigger_unregister(trig);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/imu/adis16480.c linux-libre-4.13-rc7-gnu/drivers/iio/imu/adis16480.c
--- linux-libre-4.13-rc6-gnu/drivers/iio/imu/adis16480.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/imu/adis16480.c	2017-08-27 20:20:40.000000000 -0400
@@ -696,7 +696,7 @@ static const struct adis16480_chip_info
 		.gyro_max_val = IIO_RAD_TO_DEGREE(22500),
 		.gyro_max_scale = 450,
 		.accel_max_val = IIO_M_S_2_TO_G(12500),
-		.accel_max_scale = 5,
+		.accel_max_scale = 10,
 	},
 	[ADIS16485] = {
 		.channels = adis16485_channels,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/magnetometer/st_magn_core.c linux-libre-4.13-rc7-gnu/drivers/iio/magnetometer/st_magn_core.c
--- linux-libre-4.13-rc6-gnu/drivers/iio/magnetometer/st_magn_core.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/magnetometer/st_magn_core.c	2017-08-27 20:20:40.000000000 -0400
@@ -356,9 +356,7 @@ static const struct st_sensor_settings s
 		.drdy_irq = {
 			.addr = 0x62,
 			.mask_int1 = 0x01,
-			.addr_ihl = 0x63,
-			.mask_ihl = 0x04,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.addr_stat_drdy = 0x67,
 		},
 		.multi_read_bit = false,
 		.bootime = 2,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/pressure/bmp280-core.c linux-libre-4.13-rc7-gnu/drivers/iio/pressure/bmp280-core.c
--- linux-libre-4.13-rc6-gnu/drivers/iio/pressure/bmp280-core.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/pressure/bmp280-core.c	2017-08-27 20:20:40.000000000 -0400
@@ -282,6 +282,11 @@ static int bmp280_read_temp(struct bmp28
 	}
 
 	adc_temp = be32_to_cpu(tmp) >> 12;
+	if (adc_temp == BMP280_TEMP_SKIPPED) {
+		/* reading was skipped */
+		dev_err(data->dev, "reading temperature skipped\n");
+		return -EIO;
+	}
 	comp_temp = bmp280_compensate_temp(data, adc_temp);
 
 	/*
@@ -317,6 +322,11 @@ static int bmp280_read_press(struct bmp2
 	}
 
 	adc_press = be32_to_cpu(tmp) >> 12;
+	if (adc_press == BMP280_PRESS_SKIPPED) {
+		/* reading was skipped */
+		dev_err(data->dev, "reading pressure skipped\n");
+		return -EIO;
+	}
 	comp_press = bmp280_compensate_press(data, adc_press);
 
 	*val = comp_press;
@@ -345,6 +355,11 @@ static int bmp280_read_humid(struct bmp2
 	}
 
 	adc_humidity = be16_to_cpu(tmp);
+	if (adc_humidity == BMP280_HUMIDITY_SKIPPED) {
+		/* reading was skipped */
+		dev_err(data->dev, "reading humidity skipped\n");
+		return -EIO;
+	}
 	comp_humidity = bmp280_compensate_humidity(data, adc_humidity);
 
 	*val = comp_humidity;
@@ -597,14 +612,20 @@ static const struct bmp280_chip_info bmp
 
 static int bme280_chip_config(struct bmp280_data *data)
 {
-	int ret = bmp280_chip_config(data);
+	int ret;
 	u8 osrs = BMP280_OSRS_HUMIDITIY_X(data->oversampling_humid + 1);
 
+	/*
+	 * Oversampling of humidity must be set before oversampling of
+	 * temperature/pressure is set to become effective.
+	 */
+	ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_HUMIDITY,
+				  BMP280_OSRS_HUMIDITY_MASK, osrs);
+
 	if (ret < 0)
 		return ret;
 
-	return regmap_update_bits(data->regmap, BMP280_REG_CTRL_HUMIDITY,
-				  BMP280_OSRS_HUMIDITY_MASK, osrs);
+	return bmp280_chip_config(data);
 }
 
 static const struct bmp280_chip_info bme280_chip_info = {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/pressure/bmp280.h linux-libre-4.13-rc7-gnu/drivers/iio/pressure/bmp280.h
--- linux-libre-4.13-rc6-gnu/drivers/iio/pressure/bmp280.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/pressure/bmp280.h	2017-08-27 20:20:40.000000000 -0400
@@ -96,6 +96,11 @@
 #define BME280_CHIP_ID			0x60
 #define BMP280_SOFT_RESET_VAL		0xB6
 
+/* BMP280 register skipped special values */
+#define BMP280_TEMP_SKIPPED		0x80000
+#define BMP280_PRESS_SKIPPED		0x80000
+#define BMP280_HUMIDITY_SKIPPED		0x8000
+
 /* Regmap configurations */
 extern const struct regmap_config bmp180_regmap_config;
 extern const struct regmap_config bmp280_regmap_config;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iio/trigger/stm32-timer-trigger.c linux-libre-4.13-rc7-gnu/drivers/iio/trigger/stm32-timer-trigger.c
--- linux-libre-4.13-rc6-gnu/drivers/iio/trigger/stm32-timer-trigger.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iio/trigger/stm32-timer-trigger.c	2017-08-27 20:20:40.000000000 -0400
@@ -366,34 +366,32 @@ static int stm32_counter_read_raw(struct
 				  int *val, int *val2, long mask)
 {
 	struct stm32_timer_trigger *priv = iio_priv(indio_dev);
+	u32 dat;
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
-	{
-		u32 cnt;
-
-		regmap_read(priv->regmap, TIM_CNT, &cnt);
-		*val = cnt;
+		regmap_read(priv->regmap, TIM_CNT, &dat);
+		*val = dat;
+		return IIO_VAL_INT;
 
+	case IIO_CHAN_INFO_ENABLE:
+		regmap_read(priv->regmap, TIM_CR1, &dat);
+		*val = (dat & TIM_CR1_CEN) ? 1 : 0;
 		return IIO_VAL_INT;
-	}
-	case IIO_CHAN_INFO_SCALE:
-	{
-		u32 smcr;
 
-		regmap_read(priv->regmap, TIM_SMCR, &smcr);
-		smcr &= TIM_SMCR_SMS;
+	case IIO_CHAN_INFO_SCALE:
+		regmap_read(priv->regmap, TIM_SMCR, &dat);
+		dat &= TIM_SMCR_SMS;
 
 		*val = 1;
 		*val2 = 0;
 
 		/* in quadrature case scale = 0.25 */
-		if (smcr == 3)
+		if (dat == 3)
 			*val2 = 2;
 
 		return IIO_VAL_FRACTIONAL_LOG2;
 	}
-	}
 
 	return -EINVAL;
 }
@@ -403,15 +401,31 @@ static int stm32_counter_write_raw(struc
 				   int val, int val2, long mask)
 {
 	struct stm32_timer_trigger *priv = iio_priv(indio_dev);
+	u32 dat;
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
-		regmap_write(priv->regmap, TIM_CNT, val);
+		return regmap_write(priv->regmap, TIM_CNT, val);
 
-		return IIO_VAL_INT;
 	case IIO_CHAN_INFO_SCALE:
 		/* fixed scale */
 		return -EINVAL;
+
+	case IIO_CHAN_INFO_ENABLE:
+		if (val) {
+			regmap_read(priv->regmap, TIM_CR1, &dat);
+			if (!(dat & TIM_CR1_CEN))
+				clk_enable(priv->clk);
+			regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN,
+					   TIM_CR1_CEN);
+		} else {
+			regmap_read(priv->regmap, TIM_CR1, &dat);
+			regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN,
+					   0);
+			if (dat & TIM_CR1_CEN)
+				clk_disable(priv->clk);
+		}
+		return 0;
 	}
 
 	return -EINVAL;
@@ -471,7 +485,7 @@ static int stm32_get_trigger_mode(struct
 
 	regmap_read(priv->regmap, TIM_SMCR, &smcr);
 
-	return smcr == TIM_SMCR_SMS ? 0 : -EINVAL;
+	return (smcr & TIM_SMCR_SMS) == TIM_SMCR_SMS ? 0 : -EINVAL;
 }
 
 static const struct iio_enum stm32_trigger_mode_enum = {
@@ -507,9 +521,19 @@ static int stm32_set_enable_mode(struct
 {
 	struct stm32_timer_trigger *priv = iio_priv(indio_dev);
 	int sms = stm32_enable_mode2sms(mode);
+	u32 val;
 
 	if (sms < 0)
 		return sms;
+	/*
+	 * Triggered mode sets CEN bit automatically by hardware. So, first
+	 * enable counter clock, so it can use it. Keeps it in sync with CEN.
+	 */
+	if (sms == 6) {
+		regmap_read(priv->regmap, TIM_CR1, &val);
+		if (!(val & TIM_CR1_CEN))
+			clk_enable(priv->clk);
+	}
 
 	regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, sms);
 
@@ -571,11 +595,14 @@ static int stm32_get_quadrature_mode(str
 {
 	struct stm32_timer_trigger *priv = iio_priv(indio_dev);
 	u32 smcr;
+	int mode;
 
 	regmap_read(priv->regmap, TIM_SMCR, &smcr);
-	smcr &= TIM_SMCR_SMS;
+	mode = (smcr & TIM_SMCR_SMS) - 1;
+	if ((mode < 0) || (mode > ARRAY_SIZE(stm32_quadrature_modes)))
+		return -EINVAL;
 
-	return smcr - 1;
+	return mode;
 }
 
 static const struct iio_enum stm32_quadrature_mode_enum = {
@@ -592,13 +619,20 @@ static const char *const stm32_count_dir
 
 static int stm32_set_count_direction(struct iio_dev *indio_dev,
 				     const struct iio_chan_spec *chan,
-				     unsigned int mode)
+				     unsigned int dir)
 {
 	struct stm32_timer_trigger *priv = iio_priv(indio_dev);
+	u32 val;
+	int mode;
 
-	regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_DIR, mode);
+	/* In encoder mode, direction is RO (given by TI1/TI2 signals) */
+	regmap_read(priv->regmap, TIM_SMCR, &val);
+	mode = (val & TIM_SMCR_SMS) - 1;
+	if ((mode >= 0) || (mode < ARRAY_SIZE(stm32_quadrature_modes)))
+		return -EBUSY;
 
-	return 0;
+	return regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_DIR,
+				  dir ? TIM_CR1_DIR : 0);
 }
 
 static int stm32_get_count_direction(struct iio_dev *indio_dev,
@@ -609,7 +643,7 @@ static int stm32_get_count_direction(str
 
 	regmap_read(priv->regmap, TIM_CR1, &cr1);
 
-	return (cr1 & TIM_CR1_DIR);
+	return ((cr1 & TIM_CR1_DIR) ? 1 : 0);
 }
 
 static const struct iio_enum stm32_count_direction_enum = {
@@ -672,7 +706,9 @@ static const struct iio_chan_spec_ext_in
 static const struct iio_chan_spec stm32_trigger_channel = {
 	.type = IIO_COUNT,
 	.channel = 0,
-	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
+	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
+			      BIT(IIO_CHAN_INFO_ENABLE) |
+			      BIT(IIO_CHAN_INFO_SCALE),
 	.ext_info = stm32_trigger_count_info,
 	.indexed = 1
 };
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/infiniband/core/uverbs_cmd.c linux-libre-4.13-rc7-gnu/drivers/infiniband/core/uverbs_cmd.c
--- linux-libre-4.13-rc6-gnu/drivers/infiniband/core/uverbs_cmd.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/infiniband/core/uverbs_cmd.c	2017-08-27 20:20:40.000000000 -0400
@@ -1015,7 +1015,7 @@ static struct ib_ucq_object *create_cq(s
 	cq->uobject       = &obj->uobject;
 	cq->comp_handler  = ib_uverbs_comp_handler;
 	cq->event_handler = ib_uverbs_cq_event_handler;
-	cq->cq_context    = &ev_file->ev_queue;
+	cq->cq_context    = ev_file ? &ev_file->ev_queue : NULL;
 	atomic_set(&cq->usecnt, 0);
 
 	obj->uobject.object = cq;
@@ -1522,6 +1522,7 @@ static int create_qp(struct ib_uverbs_fi
 		qp->qp_type	  = attr.qp_type;
 		atomic_set(&qp->usecnt, 0);
 		atomic_inc(&pd->usecnt);
+		qp->port = 0;
 		if (attr.send_cq)
 			atomic_inc(&attr.send_cq->usecnt);
 		if (attr.recv_cq)
@@ -1962,8 +1963,9 @@ static int modify_qp(struct ib_uverbs_fi
 	attr->alt_timeout	  = cmd->base.alt_timeout;
 	attr->rate_limit	  = cmd->rate_limit;
 
-	attr->ah_attr.type = rdma_ah_find_type(qp->device,
-					       cmd->base.dest.port_num);
+	if (cmd->base.attr_mask & IB_QP_AV)
+		attr->ah_attr.type = rdma_ah_find_type(qp->device,
+						       cmd->base.dest.port_num);
 	if (cmd->base.dest.is_global) {
 		rdma_ah_set_grh(&attr->ah_attr, NULL,
 				cmd->base.dest.flow_label,
@@ -1981,8 +1983,9 @@ static int modify_qp(struct ib_uverbs_fi
 	rdma_ah_set_port_num(&attr->ah_attr,
 			     cmd->base.dest.port_num);
 
-	attr->alt_ah_attr.type = rdma_ah_find_type(qp->device,
-						   cmd->base.dest.port_num);
+	if (cmd->base.attr_mask & IB_QP_ALT_PATH)
+		attr->alt_ah_attr.type =
+			rdma_ah_find_type(qp->device, cmd->base.dest.port_num);
 	if (cmd->base.alt_dest.is_global) {
 		rdma_ah_set_grh(&attr->alt_ah_attr, NULL,
 				cmd->base.alt_dest.flow_label,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/infiniband/core/verbs.c linux-libre-4.13-rc7-gnu/drivers/infiniband/core/verbs.c
--- linux-libre-4.13-rc6-gnu/drivers/infiniband/core/verbs.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/infiniband/core/verbs.c	2017-08-27 20:20:40.000000000 -0400
@@ -838,6 +838,7 @@ struct ib_qp *ib_create_qp(struct ib_pd
 	spin_lock_init(&qp->mr_lock);
 	INIT_LIST_HEAD(&qp->rdma_mrs);
 	INIT_LIST_HEAD(&qp->sig_mrs);
+	qp->port = 0;
 
 	if (qp_init_attr->qp_type == IB_QPT_XRC_TGT)
 		return ib_create_xrc_qp(qp, qp_init_attr);
@@ -1297,7 +1298,11 @@ int ib_modify_qp_with_udata(struct ib_qp
 		if (ret)
 			return ret;
 	}
-	return ib_security_modify_qp(qp, attr, attr_mask, udata);
+	ret = ib_security_modify_qp(qp, attr, attr_mask, udata);
+	if (!ret && (attr_mask & IB_QP_PORT))
+		qp->port = attr->port_num;
+
+	return ret;
 }
 EXPORT_SYMBOL(ib_modify_qp_with_udata);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/infiniband/hw/mlx5/main.c linux-libre-4.13-rc7-gnu/drivers/infiniband/hw/mlx5/main.c
--- linux-libre-4.13-rc6-gnu/drivers/infiniband/hw/mlx5/main.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/infiniband/hw/mlx5/main.c	2017-08-27 20:20:40.000000000 -0400
@@ -1085,6 +1085,12 @@ static int mlx5_ib_modify_port(struct ib
 	bool is_ib = (mlx5_ib_port_link_layer(ibdev, port) ==
 		      IB_LINK_LAYER_INFINIBAND);
 
+	/* CM layer calls ib_modify_port() regardless of the link layer. For
+	 * Ethernet ports, qkey violation and Port capabilities are meaningless.
+	 */
+	if (!is_ib)
+		return 0;
+
 	if (MLX5_CAP_GEN(dev->mdev, ib_virt) && is_ib) {
 		change_mask = props->clr_port_cap_mask | props->set_port_cap_mask;
 		value = ~props->clr_port_cap_mask | props->set_port_cap_mask;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/infiniband/hw/mlx5/qp.c linux-libre-4.13-rc7-gnu/drivers/infiniband/hw/mlx5/qp.c
--- linux-libre-4.13-rc6-gnu/drivers/infiniband/hw/mlx5/qp.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/infiniband/hw/mlx5/qp.c	2017-08-27 20:20:40.000000000 -0400
@@ -1238,6 +1238,7 @@ static int create_raw_packet_qp(struct m
 			goto err_destroy_tis;
 
 		sq->base.container_mibqp = qp;
+		sq->base.mqp.event = mlx5_ib_qp_event;
 	}
 
 	if (qp->rq.wqe_cnt) {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/input/misc/soc_button_array.c linux-libre-4.13-rc7-gnu/drivers/input/misc/soc_button_array.c
--- linux-libre-4.13-rc6-gnu/drivers/input/misc/soc_button_array.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/input/misc/soc_button_array.c	2017-08-27 20:20:40.000000000 -0400
@@ -331,7 +331,7 @@ static int soc_button_probe(struct platf
 	error = gpiod_count(dev, NULL);
 	if (error < 0) {
 		dev_dbg(dev, "no GPIO attached, ignoring...\n");
-		return error;
+		return -ENODEV;
 	}
 
 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/input/mouse/alps.c linux-libre-4.13-rc7-gnu/drivers/input/mouse/alps.c
--- linux-libre-4.13-rc6-gnu/drivers/input/mouse/alps.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/input/mouse/alps.c	2017-08-27 20:20:40.000000000 -0400
@@ -1215,14 +1215,24 @@ static int alps_decode_ss4_v2(struct alp
 
 	case SS4_PACKET_ID_TWO:
 		if (priv->flags & ALPS_BUTTONPAD) {
-			f->mt[0].x = SS4_BTL_MF_X_V2(p, 0);
+			if (IS_SS4PLUS_DEV(priv->dev_id)) {
+				f->mt[0].x = SS4_PLUS_BTL_MF_X_V2(p, 0);
+				f->mt[1].x = SS4_PLUS_BTL_MF_X_V2(p, 1);
+			} else {
+				f->mt[0].x = SS4_BTL_MF_X_V2(p, 0);
+				f->mt[1].x = SS4_BTL_MF_X_V2(p, 1);
+			}
 			f->mt[0].y = SS4_BTL_MF_Y_V2(p, 0);
-			f->mt[1].x = SS4_BTL_MF_X_V2(p, 1);
 			f->mt[1].y = SS4_BTL_MF_Y_V2(p, 1);
 		} else {
-			f->mt[0].x = SS4_STD_MF_X_V2(p, 0);
+			if (IS_SS4PLUS_DEV(priv->dev_id)) {
+				f->mt[0].x = SS4_PLUS_STD_MF_X_V2(p, 0);
+				f->mt[1].x = SS4_PLUS_STD_MF_X_V2(p, 1);
+			} else {
+				f->mt[0].x = SS4_STD_MF_X_V2(p, 0);
+				f->mt[1].x = SS4_STD_MF_X_V2(p, 1);
+			}
 			f->mt[0].y = SS4_STD_MF_Y_V2(p, 0);
-			f->mt[1].x = SS4_STD_MF_X_V2(p, 1);
 			f->mt[1].y = SS4_STD_MF_Y_V2(p, 1);
 		}
 		f->pressure = SS4_MF_Z_V2(p, 0) ? 0x30 : 0;
@@ -1239,16 +1249,27 @@ static int alps_decode_ss4_v2(struct alp
 
 	case SS4_PACKET_ID_MULTI:
 		if (priv->flags & ALPS_BUTTONPAD) {
-			f->mt[2].x = SS4_BTL_MF_X_V2(p, 0);
+			if (IS_SS4PLUS_DEV(priv->dev_id)) {
+				f->mt[0].x = SS4_PLUS_BTL_MF_X_V2(p, 0);
+				f->mt[1].x = SS4_PLUS_BTL_MF_X_V2(p, 1);
+			} else {
+				f->mt[2].x = SS4_BTL_MF_X_V2(p, 0);
+				f->mt[3].x = SS4_BTL_MF_X_V2(p, 1);
+			}
+
 			f->mt[2].y = SS4_BTL_MF_Y_V2(p, 0);
-			f->mt[3].x = SS4_BTL_MF_X_V2(p, 1);
 			f->mt[3].y = SS4_BTL_MF_Y_V2(p, 1);
 			no_data_x = SS4_MFPACKET_NO_AX_BL;
 			no_data_y = SS4_MFPACKET_NO_AY_BL;
 		} else {
-			f->mt[2].x = SS4_STD_MF_X_V2(p, 0);
+			if (IS_SS4PLUS_DEV(priv->dev_id)) {
+				f->mt[0].x = SS4_PLUS_STD_MF_X_V2(p, 0);
+				f->mt[1].x = SS4_PLUS_STD_MF_X_V2(p, 1);
+			} else {
+				f->mt[0].x = SS4_STD_MF_X_V2(p, 0);
+				f->mt[1].x = SS4_STD_MF_X_V2(p, 1);
+			}
 			f->mt[2].y = SS4_STD_MF_Y_V2(p, 0);
-			f->mt[3].x = SS4_STD_MF_X_V2(p, 1);
 			f->mt[3].y = SS4_STD_MF_Y_V2(p, 1);
 			no_data_x = SS4_MFPACKET_NO_AX;
 			no_data_y = SS4_MFPACKET_NO_AY;
@@ -2541,8 +2562,8 @@ static int alps_set_defaults_ss4_v2(stru
 
 	memset(otp, 0, sizeof(otp));
 
-	if (alps_get_otp_values_ss4_v2(psmouse, 0, &otp[0][0]) ||
-	    alps_get_otp_values_ss4_v2(psmouse, 1, &otp[1][0]))
+	if (alps_get_otp_values_ss4_v2(psmouse, 1, &otp[1][0]) ||
+	    alps_get_otp_values_ss4_v2(psmouse, 0, &otp[0][0]))
 		return -1;
 
 	alps_update_device_area_ss4_v2(otp, priv);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/input/mouse/alps.h linux-libre-4.13-rc7-gnu/drivers/input/mouse/alps.h
--- linux-libre-4.13-rc6-gnu/drivers/input/mouse/alps.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/input/mouse/alps.h	2017-08-27 20:20:40.000000000 -0400
@@ -100,6 +100,10 @@ enum SS4_PACKET_ID {
 				 ((_b[1 + _i * 3]  << 5) & 0x1F00)	\
 				)
 
+#define SS4_PLUS_STD_MF_X_V2(_b, _i) (((_b[0 + (_i) * 3] << 4) & 0x0070) | \
+				 ((_b[1 + (_i) * 3]  << 4) & 0x0F80)	\
+				)
+
 #define SS4_STD_MF_Y_V2(_b, _i)	(((_b[1 + (_i) * 3] << 3) & 0x0010) |	\
 				 ((_b[2 + (_i) * 3] << 5) & 0x01E0) |	\
 				 ((_b[2 + (_i) * 3] << 4) & 0x0E00)	\
@@ -109,6 +113,10 @@ enum SS4_PACKET_ID {
 				 ((_b[0 + (_i) * 3] >> 3) & 0x0010)	\
 				)
 
+#define SS4_PLUS_BTL_MF_X_V2(_b, _i) (SS4_PLUS_STD_MF_X_V2(_b, _i) |	\
+				 ((_b[0 + (_i) * 3] >> 4) & 0x0008)	\
+				)
+
 #define SS4_BTL_MF_Y_V2(_b, _i)	(SS4_STD_MF_Y_V2(_b, _i) | \
 				 ((_b[0 + (_i) * 3] >> 3) & 0x0008)	\
 				)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/input/mouse/elan_i2c_core.c linux-libre-4.13-rc7-gnu/drivers/input/mouse/elan_i2c_core.c
--- linux-libre-4.13-rc6-gnu/drivers/input/mouse/elan_i2c_core.c	2017-08-27 02:59:44.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/input/mouse/elan_i2c_core.c	2017-08-27 22:02:37.000000000 -0400
@@ -1247,6 +1247,7 @@ static const struct acpi_device_id elan_
 	{ "ELAN0000", 0 },
 	{ "ELAN0100", 0 },
 	{ "ELAN0600", 0 },
+	{ "ELAN0602", 0 },
 	{ "ELAN0605", 0 },
 	{ "ELAN0608", 0 },
 	{ "ELAN0605", 0 },
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/input/mouse/trackpoint.c linux-libre-4.13-rc7-gnu/drivers/input/mouse/trackpoint.c
--- linux-libre-4.13-rc6-gnu/drivers/input/mouse/trackpoint.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/input/mouse/trackpoint.c	2017-08-27 20:20:40.000000000 -0400
@@ -265,7 +265,8 @@ static int trackpoint_start_protocol(str
 	if (ps2_command(&psmouse->ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID)))
 		return -1;
 
-	if (param[0] != TP_MAGIC_IDENT)
+	/* add new TP ID. */
+	if (!(param[0] & TP_MAGIC_IDENT))
 		return -1;
 
 	if (firmware_id)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/input/mouse/trackpoint.h linux-libre-4.13-rc7-gnu/drivers/input/mouse/trackpoint.h
--- linux-libre-4.13-rc6-gnu/drivers/input/mouse/trackpoint.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/input/mouse/trackpoint.h	2017-08-27 20:20:40.000000000 -0400
@@ -21,8 +21,9 @@
 #define TP_COMMAND		0xE2	/* Commands start with this */
 
 #define TP_READ_ID		0xE1	/* Sent for device identification */
-#define TP_MAGIC_IDENT		0x01	/* Sent after a TP_READ_ID followed */
+#define TP_MAGIC_IDENT		0x03	/* Sent after a TP_READ_ID followed */
 					/* by the firmware ID */
+					/* Firmware ID includes 0x1, 0x2, 0x3 */
 
 
 /*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iommu/amd_iommu_types.h linux-libre-4.13-rc7-gnu/drivers/iommu/amd_iommu_types.h
--- linux-libre-4.13-rc6-gnu/drivers/iommu/amd_iommu_types.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iommu/amd_iommu_types.h	2017-08-27 20:20:40.000000000 -0400
@@ -574,7 +574,9 @@ struct amd_iommu {
 
 static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev)
 {
-	return container_of(dev, struct amd_iommu, iommu.dev);
+	struct iommu_device *iommu = dev_to_iommu_device(dev);
+
+	return container_of(iommu, struct amd_iommu, iommu);
 }
 
 #define ACPIHID_UID_LEN 256
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iommu/intel-iommu.c linux-libre-4.13-rc7-gnu/drivers/iommu/intel-iommu.c
--- linux-libre-4.13-rc6-gnu/drivers/iommu/intel-iommu.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iommu/intel-iommu.c	2017-08-27 20:20:40.000000000 -0400
@@ -4736,7 +4736,9 @@ static void intel_disable_iommus(void)
 
 static inline struct intel_iommu *dev_to_intel_iommu(struct device *dev)
 {
-	return container_of(dev, struct intel_iommu, iommu.dev);
+	struct iommu_device *iommu_dev = dev_to_iommu_device(dev);
+
+	return container_of(iommu_dev, struct intel_iommu, iommu);
 }
 
 static ssize_t intel_iommu_show_version(struct device *dev,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/iommu/iommu-sysfs.c linux-libre-4.13-rc7-gnu/drivers/iommu/iommu-sysfs.c
--- linux-libre-4.13-rc6-gnu/drivers/iommu/iommu-sysfs.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/iommu/iommu-sysfs.c	2017-08-27 20:20:40.000000000 -0400
@@ -62,32 +62,40 @@ int iommu_device_sysfs_add(struct iommu_
 	va_list vargs;
 	int ret;
 
-	device_initialize(&iommu->dev);
+	iommu->dev = kzalloc(sizeof(*iommu->dev), GFP_KERNEL);
+	if (!iommu->dev)
+		return -ENOMEM;
 
-	iommu->dev.class = &iommu_class;
-	iommu->dev.parent = parent;
-	iommu->dev.groups = groups;
+	device_initialize(iommu->dev);
+
+	iommu->dev->class = &iommu_class;
+	iommu->dev->parent = parent;
+	iommu->dev->groups = groups;
 
 	va_start(vargs, fmt);
-	ret = kobject_set_name_vargs(&iommu->dev.kobj, fmt, vargs);
+	ret = kobject_set_name_vargs(&iommu->dev->kobj, fmt, vargs);
 	va_end(vargs);
 	if (ret)
 		goto error;
 
-	ret = device_add(&iommu->dev);
+	ret = device_add(iommu->dev);
 	if (ret)
 		goto error;
 
+	dev_set_drvdata(iommu->dev, iommu);
+
 	return 0;
 
 error:
-	put_device(&iommu->dev);
+	put_device(iommu->dev);
 	return ret;
 }
 
 void iommu_device_sysfs_remove(struct iommu_device *iommu)
 {
-	device_unregister(&iommu->dev);
+	dev_set_drvdata(iommu->dev, NULL);
+	device_unregister(iommu->dev);
+	iommu->dev = NULL;
 }
 /*
  * IOMMU drivers can indicate a device is managed by a given IOMMU using
@@ -102,14 +110,14 @@ int iommu_device_link(struct iommu_devic
 	if (!iommu || IS_ERR(iommu))
 		return -ENODEV;
 
-	ret = sysfs_add_link_to_group(&iommu->dev.kobj, "devices",
+	ret = sysfs_add_link_to_group(&iommu->dev->kobj, "devices",
 				      &link->kobj, dev_name(link));
 	if (ret)
 		return ret;
 
-	ret = sysfs_create_link_nowarn(&link->kobj, &iommu->dev.kobj, "iommu");
+	ret = sysfs_create_link_nowarn(&link->kobj, &iommu->dev->kobj, "iommu");
 	if (ret)
-		sysfs_remove_link_from_group(&iommu->dev.kobj, "devices",
+		sysfs_remove_link_from_group(&iommu->dev->kobj, "devices",
 					     dev_name(link));
 
 	return ret;
@@ -121,5 +129,5 @@ void iommu_device_unlink(struct iommu_de
 		return;
 
 	sysfs_remove_link(&link->kobj, "iommu");
-	sysfs_remove_link_from_group(&iommu->dev.kobj, "devices", dev_name(link));
+	sysfs_remove_link_from_group(&iommu->dev->kobj, "devices", dev_name(link));
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/memory/atmel-ebi.c linux-libre-4.13-rc7-gnu/drivers/memory/atmel-ebi.c
--- linux-libre-4.13-rc6-gnu/drivers/memory/atmel-ebi.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/memory/atmel-ebi.c	2017-08-27 20:20:40.000000000 -0400
@@ -72,7 +72,7 @@ struct atmel_smc_timing_xlate {
 	{ .name = nm, .converter = atmel_smc_cs_conf_set_pulse, .shift = pos}
 
 #define ATMEL_SMC_CYCLE_XLATE(nm, pos)	\
-	{ .name = nm, .converter = atmel_smc_cs_conf_set_setup, .shift = pos}
+	{ .name = nm, .converter = atmel_smc_cs_conf_set_cycle, .shift = pos}
 
 static void at91sam9_ebi_get_config(struct atmel_ebi_dev *ebid,
 				    struct atmel_ebi_dev_config *conf)
@@ -120,12 +120,14 @@ static int atmel_ebi_xslate_smc_timings(
 	if (!ret) {
 		required = true;
 		ncycles = DIV_ROUND_UP(val, clk_period_ns);
-		if (ncycles > ATMEL_SMC_MODE_TDF_MAX ||
-		    ncycles < ATMEL_SMC_MODE_TDF_MIN) {
+		if (ncycles > ATMEL_SMC_MODE_TDF_MAX) {
 			ret = -EINVAL;
 			goto out;
 		}
 
+		if (ncycles < ATMEL_SMC_MODE_TDF_MIN)
+			ncycles = ATMEL_SMC_MODE_TDF_MIN;
+
 		smcconf->mode |= ATMEL_SMC_MODE_TDF(ncycles);
 	}
 
@@ -263,7 +265,7 @@ static int atmel_ebi_xslate_smc_config(s
 	}
 
 	ret = atmel_ebi_xslate_smc_timings(ebid, np, &conf->smcconf);
-	if (ret)
+	if (ret < 0)
 		return -EINVAL;
 
 	if ((ret > 0 && !required) || (!ret && required)) {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/mfd/atmel-smc.c linux-libre-4.13-rc7-gnu/drivers/mfd/atmel-smc.c
--- linux-libre-4.13-rc6-gnu/drivers/mfd/atmel-smc.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/mfd/atmel-smc.c	2017-08-27 20:20:40.000000000 -0400
@@ -206,7 +206,7 @@ EXPORT_SYMBOL_GPL(atmel_smc_cs_conf_set_
  *	     parameter
  *
  * This function encodes the @ncycles value as described in the datasheet
- * (section "SMC Pulse Register"), and then stores the result in the
+ * (section "SMC Cycle Register"), and then stores the result in the
  * @conf->setup field at @shift position.
  *
  * Returns -EINVAL if @shift is invalid, -ERANGE if @ncycles does not fit in
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/mfd/da9062-core.c linux-libre-4.13-rc7-gnu/drivers/mfd/da9062-core.c
--- linux-libre-4.13-rc6-gnu/drivers/mfd/da9062-core.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/mfd/da9062-core.c	2017-08-27 20:20:40.000000000 -0400
@@ -645,6 +645,9 @@ static const struct regmap_range da9062_
 		.range_min = DA9062AA_VLDO1_B,
 		.range_max = DA9062AA_VLDO4_B,
 	}, {
+		.range_min = DA9062AA_BBAT_CONT,
+		.range_max = DA9062AA_BBAT_CONT,
+	}, {
 		.range_min = DA9062AA_INTERFACE,
 		.range_max = DA9062AA_CONFIG_E,
 	}, {
@@ -721,6 +724,9 @@ static const struct regmap_range da9062_
 		.range_min = DA9062AA_VLDO1_B,
 		.range_max = DA9062AA_VLDO4_B,
 	}, {
+		.range_min = DA9062AA_BBAT_CONT,
+		.range_max = DA9062AA_BBAT_CONT,
+	}, {
 		.range_min = DA9062AA_GP_ID_0,
 		.range_max = DA9062AA_GP_ID_19,
 	},
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/mmc/core/block.c linux-libre-4.13-rc7-gnu/drivers/mmc/core/block.c
--- linux-libre-4.13-rc6-gnu/drivers/mmc/core/block.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/mmc/core/block.c	2017-08-27 20:20:40.000000000 -0400
@@ -1371,12 +1371,46 @@ static inline void mmc_apply_rel_rw(stru
 	 R1_CC_ERROR |		/* Card controller error */		\
 	 R1_ERROR)		/* General/unknown error */
 
-static bool mmc_blk_has_cmd_err(struct mmc_command *cmd)
+static void mmc_blk_eval_resp_error(struct mmc_blk_request *brq)
 {
-	if (!cmd->error && cmd->resp[0] & CMD_ERRORS)
-		cmd->error = -EIO;
+	u32 val;
 
-	return cmd->error;
+	/*
+	 * Per the SD specification(physical layer version 4.10)[1],
+	 * section 4.3.3, it explicitly states that "When the last
+	 * block of user area is read using CMD18, the host should
+	 * ignore OUT_OF_RANGE error that may occur even the sequence
+	 * is correct". And JESD84-B51 for eMMC also has a similar
+	 * statement on section 6.8.3.
+	 *
+	 * Multiple block read/write could be done by either predefined
+	 * method, namely CMD23, or open-ending mode. For open-ending mode,
+	 * we should ignore the OUT_OF_RANGE error as it's normal behaviour.
+	 *
+	 * However the spec[1] doesn't tell us whether we should also
+	 * ignore that for predefined method. But per the spec[1], section
+	 * 4.15 Set Block Count Command, it says"If illegal block count
+	 * is set, out of range error will be indicated during read/write
+	 * operation (For example, data transfer is stopped at user area
+	 * boundary)." In another word, we could expect a out of range error
+	 * in the response for the following CMD18/25. And if argument of
+	 * CMD23 + the argument of CMD18/25 exceed the max number of blocks,
+	 * we could also expect to get a -ETIMEDOUT or any error number from
+	 * the host drivers due to missing data response(for write)/data(for
+	 * read), as the cards will stop the data transfer by itself per the
+	 * spec. So we only need to check R1_OUT_OF_RANGE for open-ending mode.
+	 */
+
+	if (!brq->stop.error) {
+		bool oor_with_open_end;
+		/* If there is no error yet, check R1 response */
+
+		val = brq->stop.resp[0] & CMD_ERRORS;
+		oor_with_open_end = val & R1_OUT_OF_RANGE && !brq->mrq.sbc;
+
+		if (val && !oor_with_open_end)
+			brq->stop.error = -EIO;
+	}
 }
 
 static enum mmc_blk_status mmc_blk_err_check(struct mmc_card *card,
@@ -1400,8 +1434,11 @@ static enum mmc_blk_status mmc_blk_err_c
 	 * stop.error indicates a problem with the stop command.  Data
 	 * may have been transferred, or may still be transferring.
 	 */
-	if (brq->sbc.error || brq->cmd.error || mmc_blk_has_cmd_err(&brq->stop) ||
-	    brq->data.error) {
+
+	mmc_blk_eval_resp_error(brq);
+
+	if (brq->sbc.error || brq->cmd.error ||
+	    brq->stop.error || brq->data.error) {
 		switch (mmc_blk_cmd_recovery(card, req, brq, &ecc_err, &gen_err)) {
 		case ERR_RETRY:
 			return MMC_BLK_RETRY;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/mtd/nand/atmel/nand-controller.c linux-libre-4.13-rc7-gnu/drivers/mtd/nand/atmel/nand-controller.c
--- linux-libre-4.13-rc6-gnu/drivers/mtd/nand/atmel/nand-controller.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/mtd/nand/atmel/nand-controller.c	2017-08-27 20:20:40.000000000 -0400
@@ -1364,7 +1364,18 @@ static int atmel_smc_nand_prepare_smccon
 	ret = atmel_smc_cs_conf_set_timing(smcconf,
 					   ATMEL_HSMC_TIMINGS_TADL_SHIFT,
 					   ncycles);
-	if (ret)
+	/*
+	 * Version 4 of the ONFI spec mandates that tADL be at least 400
+	 * nanoseconds, but, depending on the master clock rate, 400 ns may not
+	 * fit in the tADL field of the SMC reg. We need to relax the check and
+	 * accept the -ERANGE return code.
+	 *
+	 * Note that previous versions of the ONFI spec had a lower tADL_min
+	 * (100 or 200 ns). It's not clear why this timing constraint got
+	 * increased but it seems most NANDs are fine with values lower than
+	 * 400ns, so we should be safe.
+	 */
+	if (ret && ret != -ERANGE)
 		return ret;
 
 	ncycles = DIV_ROUND_UP(conf->timings.sdr.tAR_min, mckperiodps);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/mtd/nand/nandsim.c linux-libre-4.13-rc7-gnu/drivers/mtd/nand/nandsim.c
--- linux-libre-4.13-rc6-gnu/drivers/mtd/nand/nandsim.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/mtd/nand/nandsim.c	2017-08-27 20:20:40.000000000 -0400
@@ -2373,6 +2373,7 @@ static int __init ns_init_module(void)
         return 0;
 
 err_exit:
+	nandsim_debugfs_remove(nand);
 	free_nandsim(nand);
 	nand_release(nsmtd);
 	for (i = 0;i < ARRAY_SIZE(nand->partitions); ++i)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/net/ethernet/mellanox/mlx4/main.c linux-libre-4.13-rc7-gnu/drivers/net/ethernet/mellanox/mlx4/main.c
--- linux-libre-4.13-rc6-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2017-08-27 20:20:40.000000000 -0400
@@ -432,7 +432,7 @@ static int mlx4_dev_cap(struct mlx4_dev
 		/* Virtual PCI function needs to determine UAR page size from
 		 * firmware. Only master PCI function can set the uar page size
 		 */
-		if (enable_4k_uar)
+		if (enable_4k_uar || !dev->persist->num_vfs)
 			dev->uar_page_shift = DEFAULT_UAR_PAGE_SHIFT;
 		else
 			dev->uar_page_shift = PAGE_SHIFT;
@@ -2277,7 +2277,7 @@ static int mlx4_init_hca(struct mlx4_dev
 
 		dev->caps.max_fmr_maps = (1 << (32 - ilog2(dev->caps.num_mpts))) - 1;
 
-		if (enable_4k_uar) {
+		if (enable_4k_uar || !dev->persist->num_vfs) {
 			init_hca.log_uar_sz = ilog2(dev->caps.num_uars) +
 						    PAGE_SHIFT - DEFAULT_UAR_PAGE_SHIFT;
 			init_hca.uar_page_sz = DEFAULT_UAR_PAGE_SHIFT - 12;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/net/ethernet/netronome/nfp/nfp_net_common.c linux-libre-4.13-rc7-gnu/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
--- linux-libre-4.13-rc6-gnu/drivers/net/ethernet/netronome/nfp/nfp_net_common.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/net/ethernet/netronome/nfp/nfp_net_common.c	2017-08-27 20:20:40.000000000 -0400
@@ -908,8 +908,7 @@ static int nfp_net_tx(struct sk_buff *sk
 	return NETDEV_TX_OK;
 
 err_unmap:
-	--f;
-	while (f >= 0) {
+	while (--f >= 0) {
 		frag = &skb_shinfo(skb)->frags[f];
 		dma_unmap_page(dp->dev, tx_ring->txbufs[wr_idx].dma_addr,
 			       skb_frag_size(frag), DMA_TO_DEVICE);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c linux-libre-4.13-rc7-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c
--- linux-libre-4.13-rc6-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c	2017-08-27 20:20:40.000000000 -0400
@@ -2311,7 +2311,7 @@ netxen_md_rdqueue(struct netxen_adapter
 				 loop_cnt++) {
 		NX_WR_DUMP_REG(select_addr, adapter->ahw.pci_base0, queue_id);
 		read_addr = queueEntry->read_addr;
-		for (k = 0; k < read_cnt; k--) {
+		for (k = 0; k < read_cnt; k++) {
 			NX_RD_DUMP_REG(read_addr, adapter->ahw.pci_base0,
 							&read_value);
 			*data_buff++ = read_value;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/net/tun.c linux-libre-4.13-rc7-gnu/drivers/net/tun.c
--- linux-libre-4.13-rc6-gnu/drivers/net/tun.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/net/tun.c	2017-08-27 20:20:40.000000000 -0400
@@ -1879,6 +1879,9 @@ static int tun_set_iff(struct net *net,
 
 err_detach:
 	tun_detach_all(dev);
+	/* register_netdevice() already called tun_free_netdev() */
+	goto err_free_dev;
+
 err_free_flow:
 	tun_flow_uninit(tun);
 	security_tun_dev_free_security(tun->security);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/ntb/ntb_transport.c linux-libre-4.13-rc7-gnu/drivers/ntb/ntb_transport.c
--- linux-libre-4.13-rc6-gnu/drivers/ntb/ntb_transport.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/ntb/ntb_transport.c	2017-08-27 20:20:40.000000000 -0400
@@ -924,10 +924,8 @@ out1:
 		ntb_free_mw(nt, i);
 
 	/* if there's an actual failure, we should just bail */
-	if (rc < 0) {
-		ntb_link_disable(ndev);
+	if (rc < 0)
 		return;
-	}
 
 out:
 	if (ntb_link_is_up(ndev, NULL, NULL) == 1)
@@ -1059,7 +1057,7 @@ static int ntb_transport_probe(struct nt
 	int node;
 	int rc, i;
 
-	mw_count = ntb_mw_count(ndev, PIDX);
+	mw_count = ntb_peer_mw_count(ndev);
 
 	if (!ndev->ops->mw_set_trans) {
 		dev_err(&ndev->dev, "Inbound MW based NTB API is required\n");
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/ntb/test/ntb_tool.c linux-libre-4.13-rc7-gnu/drivers/ntb/test/ntb_tool.c
--- linux-libre-4.13-rc6-gnu/drivers/ntb/test/ntb_tool.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/ntb/test/ntb_tool.c	2017-08-27 20:20:40.000000000 -0400
@@ -959,7 +959,7 @@ static int tool_probe(struct ntb_client
 	tc->ntb = ntb;
 	init_waitqueue_head(&tc->link_wq);
 
-	tc->mw_count = min(ntb_mw_count(tc->ntb, PIDX), MAX_MWS);
+	tc->mw_count = min(ntb_peer_mw_count(tc->ntb), MAX_MWS);
 	for (i = 0; i < tc->mw_count; i++) {
 		rc = tool_init_mw(tc, i);
 		if (rc)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/pci/msi.c linux-libre-4.13-rc7-gnu/drivers/pci/msi.c
--- linux-libre-4.13-rc6-gnu/drivers/pci/msi.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/pci/msi.c	2017-08-27 20:20:40.000000000 -0400
@@ -538,12 +538,9 @@ msi_setup_entry(struct pci_dev *dev, int
 	struct msi_desc *entry;
 	u16 control;
 
-	if (affd) {
+	if (affd)
 		masks = irq_create_affinity_masks(nvec, affd);
-		if (!masks)
-			dev_err(&dev->dev, "can't allocate MSI affinity masks for %d vectors\n",
-				nvec);
-	}
+
 
 	/* MSI Entry Initialization */
 	entry = alloc_msi_entry(&dev->dev, nvec, masks);
@@ -679,12 +676,8 @@ static int msix_setup_entries(struct pci
 	struct msi_desc *entry;
 	int ret, i;
 
-	if (affd) {
+	if (affd)
 		masks = irq_create_affinity_masks(nvec, affd);
-		if (!masks)
-			dev_err(&dev->dev, "can't allocate MSI-X affinity masks for %d vectors\n",
-				nvec);
-	}
 
 	for (i = 0, curmsk = masks; i < nvec; i++) {
 		entry = alloc_msi_entry(&dev->dev, 1, curmsk);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/pci/pci.c linux-libre-4.13-rc7-gnu/drivers/pci/pci.c
--- linux-libre-4.13-rc6-gnu/drivers/pci/pci.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/pci/pci.c	2017-08-27 20:20:40.000000000 -0400
@@ -514,7 +514,7 @@ EXPORT_SYMBOL(pci_find_resource);
  */
 struct pci_dev *pci_find_pcie_root_port(struct pci_dev *dev)
 {
-	struct pci_dev *bridge, *highest_pcie_bridge = NULL;
+	struct pci_dev *bridge, *highest_pcie_bridge = dev;
 
 	bridge = pci_upstream_bridge(dev);
 	while (bridge && pci_is_pcie(bridge)) {
@@ -522,11 +522,10 @@ struct pci_dev *pci_find_pcie_root_port(
 		bridge = pci_upstream_bridge(bridge);
 	}
 
-	if (highest_pcie_bridge &&
-	    pci_pcie_type(highest_pcie_bridge) == PCI_EXP_TYPE_ROOT_PORT)
-		return highest_pcie_bridge;
+	if (pci_pcie_type(highest_pcie_bridge) != PCI_EXP_TYPE_ROOT_PORT)
+		return NULL;
 
-	return NULL;
+	return highest_pcie_bridge;
 }
 EXPORT_SYMBOL(pci_find_pcie_root_port);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/rtc/rtc-ds1307.c linux-libre-4.13-rc7-gnu/drivers/rtc/rtc-ds1307.c
--- linux-libre-4.13-rc6-gnu/drivers/rtc/rtc-ds1307.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/rtc/rtc-ds1307.c	2017-08-27 20:20:40.000000000 -0400
@@ -1301,7 +1301,6 @@ static void ds1307_clks_register(struct
 static const struct regmap_config regmap_config = {
 	.reg_bits = 8,
 	.val_bits = 8,
-	.max_register = 0x12,
 };
 
 static int ds1307_probe(struct i2c_client *client,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/aacraid/aachba.c linux-libre-4.13-rc7-gnu/drivers/scsi/aacraid/aachba.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/aacraid/aachba.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/aacraid/aachba.c	2017-08-27 20:20:40.000000000 -0400
@@ -549,7 +549,9 @@ static void get_container_name_callback(
 	if ((le32_to_cpu(get_name_reply->status) == CT_OK)
 	 && (get_name_reply->data[0] != '\0')) {
 		char *sp = get_name_reply->data;
-		sp[sizeof(((struct aac_get_name_resp *)NULL)->data)] = '\0';
+		int data_size = FIELD_SIZEOF(struct aac_get_name_resp, data);
+
+		sp[data_size - 1] = '\0';
 		while (*sp == ' ')
 			++sp;
 		if (*sp) {
@@ -579,12 +581,15 @@ static void get_container_name_callback(
 static int aac_get_container_name(struct scsi_cmnd * scsicmd)
 {
 	int status;
+	int data_size;
 	struct aac_get_name *dinfo;
 	struct fib * cmd_fibcontext;
 	struct aac_dev * dev;
 
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
+	data_size = FIELD_SIZEOF(struct aac_get_name_resp, data);
+
 	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
 
 	aac_fib_init(cmd_fibcontext);
@@ -593,7 +598,7 @@ static int aac_get_container_name(struct
 	dinfo->command = cpu_to_le32(VM_ContainerConfig);
 	dinfo->type = cpu_to_le32(CT_READ_NAME);
 	dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
-	dinfo->count = cpu_to_le32(sizeof(((struct aac_get_name_resp *)NULL)->data));
+	dinfo->count = cpu_to_le32(data_size - 1);
 
 	status = aac_fib_send(ContainerCommand,
 		  cmd_fibcontext,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/aacraid/aacraid.h linux-libre-4.13-rc7-gnu/drivers/scsi/aacraid/aacraid.h
--- linux-libre-4.13-rc6-gnu/drivers/scsi/aacraid/aacraid.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/aacraid/aacraid.h	2017-08-27 20:20:40.000000000 -0400
@@ -2274,7 +2274,7 @@ struct aac_get_name_resp {
 	__le32		parm3;
 	__le32		parm4;
 	__le32		parm5;
-	u8		data[16];
+	u8		data[17];
 };
 
 #define CT_CID_TO_32BITS_UID 165
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/csiostor/csio_hw.c linux-libre-4.13-rc7-gnu/drivers/scsi/csiostor/csio_hw.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/csiostor/csio_hw.c	2017-08-27 03:01:36.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/csiostor/csio_hw.c	2017-08-27 22:04:03.000000000 -0400
@@ -3845,8 +3845,10 @@ csio_hw_start(struct csio_hw *hw)
 
 	if (csio_is_hw_ready(hw))
 		return 0;
-	else
+	else if (csio_match_state(hw, csio_hws_uninit))
 		return -EINVAL;
+	else
+		return -ENODEV;
 }
 
 int
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/csiostor/csio_init.c linux-libre-4.13-rc7-gnu/drivers/scsi/csiostor/csio_init.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/csiostor/csio_init.c	2017-08-27 03:01:41.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/csiostor/csio_init.c	2017-08-27 22:04:08.000000000 -0400
@@ -969,10 +969,14 @@ static int csio_probe_one(struct pci_dev
 
 	pci_set_drvdata(pdev, hw);
 
-	if (csio_hw_start(hw) != 0) {
-		dev_err(&pdev->dev,
-			"Failed to start FW, continuing in debug mode.\n");
-		return 0;
+	rv = csio_hw_start(hw);
+	if (rv) {
+		if (rv == -EINVAL) {
+			dev_err(&pdev->dev,
+				"Failed to start FW, continuing in debug mode.\n");
+			return 0;
+		}
+		goto err_lnode_exit;
 	}
 
 	sprintf(hw->fwrev_str, "%u.%u.%u.%u\n",
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c linux-libre-4.13-rc7-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c	2017-08-27 20:20:40.000000000 -0400
@@ -1635,6 +1635,9 @@ static int init_act_open(struct cxgbi_so
 		goto rel_resource;
 	}
 
+	if (!(n->nud_state & NUD_VALID))
+		neigh_event_send(n, NULL);
+
 	csk->atid = cxgb4_alloc_atid(lldi->tids, csk);
 	if (csk->atid < 0) {
 		pr_err("%s, NO atid available.\n", ndev->name);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/Kconfig linux-libre-4.13-rc7-gnu/drivers/scsi/Kconfig
--- linux-libre-4.13-rc6-gnu/drivers/scsi/Kconfig	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/Kconfig	2017-08-27 20:20:40.000000000 -0400
@@ -47,6 +47,17 @@ config SCSI_NETLINK
 	default	n
 	depends on NET
 
+config SCSI_MQ_DEFAULT
+	bool "SCSI: use blk-mq I/O path by default"
+	depends on SCSI
+	---help---
+	  This option enables the new blk-mq based I/O path for SCSI
+	  devices by default.  With the option the scsi_mod.use_blk_mq
+	  module/boot option defaults to Y, without it to N, but it can
+	  still be overridden either way.
+
+	  If unsure say N.
+
 config SCSI_PROC_FS
 	bool "legacy /proc/scsi/ support"
 	depends on SCSI && PROC_FS
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/megaraid/megaraid_sas_base.c linux-libre-4.13-rc7-gnu/drivers/scsi/megaraid/megaraid_sas_base.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/megaraid/megaraid_sas_base.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/megaraid/megaraid_sas_base.c	2017-08-27 20:20:40.000000000 -0400
@@ -6228,8 +6228,8 @@ static int megasas_probe_one(struct pci_
 fail_start_aen:
 fail_io_attach:
 	megasas_mgmt_info.count--;
-	megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = NULL;
 	megasas_mgmt_info.max_index--;
+	megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = NULL;
 
 	instance->instancet->disable_intr(instance);
 	megasas_destroy_irqs(instance);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/scsi.c linux-libre-4.13-rc7-gnu/drivers/scsi/scsi.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/scsi.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/scsi.c	2017-08-27 20:20:40.000000000 -0400
@@ -800,7 +800,11 @@ MODULE_LICENSE("GPL");
 module_param(scsi_logging_level, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(scsi_logging_level, "a bit mask of logging levels");
 
+#ifdef CONFIG_SCSI_MQ_DEFAULT
 bool scsi_use_blk_mq = true;
+#else
+bool scsi_use_blk_mq = false;
+#endif
 module_param_named(use_blk_mq, scsi_use_blk_mq, bool, S_IWUSR | S_IRUGO);
 
 static int __init init_scsi(void)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/sd.c linux-libre-4.13-rc7-gnu/drivers/scsi/sd.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/sd.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/sd.c	2017-08-27 20:20:40.000000000 -0400
@@ -1277,6 +1277,9 @@ static void sd_uninit_command(struct scs
 {
 	struct request *rq = SCpnt->request;
 
+	if (SCpnt->flags & SCMD_ZONE_WRITE_LOCK)
+		sd_zbc_write_unlock_zone(SCpnt);
+
 	if (rq->rq_flags & RQF_SPECIAL_PAYLOAD)
 		__free_page(rq->special_vec.bv_page);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/scsi/sd_zbc.c linux-libre-4.13-rc7-gnu/drivers/scsi/sd_zbc.c
--- linux-libre-4.13-rc6-gnu/drivers/scsi/sd_zbc.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/scsi/sd_zbc.c	2017-08-27 20:20:40.000000000 -0400
@@ -294,6 +294,9 @@ int sd_zbc_write_lock_zone(struct scsi_c
 	    test_and_set_bit(zno, sdkp->zones_wlock))
 		return BLKPREP_DEFER;
 
+	WARN_ON_ONCE(cmd->flags & SCMD_ZONE_WRITE_LOCK);
+	cmd->flags |= SCMD_ZONE_WRITE_LOCK;
+
 	return BLKPREP_OK;
 }
 
@@ -302,9 +305,10 @@ void sd_zbc_write_unlock_zone(struct scs
 	struct request *rq = cmd->request;
 	struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
 
-	if (sdkp->zones_wlock) {
+	if (sdkp->zones_wlock && cmd->flags & SCMD_ZONE_WRITE_LOCK) {
 		unsigned int zno = sd_zbc_zone_no(sdkp, blk_rq_pos(rq));
 		WARN_ON_ONCE(!test_bit(zno, sdkp->zones_wlock));
+		cmd->flags &= ~SCMD_ZONE_WRITE_LOCK;
 		clear_bit_unlock(zno, sdkp->zones_wlock);
 		smp_mb__after_atomic();
 	}
@@ -335,9 +339,6 @@ void sd_zbc_complete(struct scsi_cmnd *c
 	case REQ_OP_WRITE_ZEROES:
 	case REQ_OP_WRITE_SAME:
 
-		/* Unlock the zone */
-		sd_zbc_write_unlock_zone(cmd);
-
 		if (result &&
 		    sshdr->sense_key == ILLEGAL_REQUEST &&
 		    sshdr->asc == 0x21)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/soc/ti/knav_qmss_queue.c linux-libre-4.13-rc7-gnu/drivers/soc/ti/knav_qmss_queue.c
--- linux-libre-4.13-rc6-gnu/drivers/soc/ti/knav_qmss_queue.c	2017-08-27 03:08:11.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/soc/ti/knav_qmss_queue.c	2017-08-27 22:09:07.000000000 -0400
@@ -745,6 +745,9 @@ void *knav_pool_create(const char *name,
 	bool slot_found;
 	int ret;
 
+	if (!kdev)
+		return ERR_PTR(-EPROBE_DEFER);
+
 	if (!kdev->dev)
 		return ERR_PTR(-ENODEV);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c linux-libre-4.13-rc7-gnu/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c
--- linux-libre-4.13-rc6-gnu/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c	2017-08-27 20:20:40.000000000 -0400
@@ -16,9 +16,9 @@
 
 static bool __must_check fsl_mc_is_allocatable(const char *obj_type)
 {
-	return strcmp(obj_type, "dpbp") ||
-	       strcmp(obj_type, "dpmcp") ||
-	       strcmp(obj_type, "dpcon");
+	return strcmp(obj_type, "dpbp") == 0 ||
+	       strcmp(obj_type, "dpmcp") == 0 ||
+	       strcmp(obj_type, "dpcon") == 0;
 }
 
 /**
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/staging/rtl8188eu/os_dep/usb_intf.c linux-libre-4.13-rc7-gnu/drivers/staging/rtl8188eu/os_dep/usb_intf.c
--- linux-libre-4.13-rc6-gnu/drivers/staging/rtl8188eu/os_dep/usb_intf.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/staging/rtl8188eu/os_dep/usb_intf.c	2017-08-27 20:20:40.000000000 -0400
@@ -45,6 +45,7 @@ static struct usb_device_id rtw_usb_id_t
 	{USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */
 	{USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */
 	{USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */
+	{USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */
 	{}	/* Terminating entry */
 };
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/tty/pty.c linux-libre-4.13-rc7-gnu/drivers/tty/pty.c
--- linux-libre-4.13-rc6-gnu/drivers/tty/pty.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/tty/pty.c	2017-08-27 20:20:40.000000000 -0400
@@ -69,13 +69,8 @@ static void pty_close(struct tty_struct
 #ifdef CONFIG_UNIX98_PTYS
 		if (tty->driver == ptm_driver) {
 			mutex_lock(&devpts_mutex);
-			if (tty->link->driver_data) {
-				struct path *path = tty->link->driver_data;
-
-				devpts_pty_kill(path->dentry);
-				path_put(path);
-				kfree(path);
-			}
+			if (tty->link->driver_data)
+				devpts_pty_kill(tty->link->driver_data);
 			mutex_unlock(&devpts_mutex);
 		}
 #endif
@@ -607,25 +602,24 @@ static inline void legacy_pty_init(void)
 static struct cdev ptmx_cdev;
 
 /**
- *	pty_open_peer - open the peer of a pty
- *	@tty: the peer of the pty being opened
+ *	ptm_open_peer - open the peer of a pty
+ *	@master: the open struct file of the ptmx device node
+ *	@tty: the master of the pty being opened
+ *	@flags: the flags for open
  *
- *	Open the cached dentry in tty->link, providing a safe way for userspace
- *	to get the slave end of a pty (where they have the master fd and cannot
- *	access or trust the mount namespace /dev/pts was mounted inside).
+ *	Provide a race free way for userspace to open the slave end of a pty
+ *	(where they have the master fd and cannot access or trust the mount
+ *	namespace /dev/pts was mounted inside).
  */
-static struct file *pty_open_peer(struct tty_struct *tty, int flags)
-{
-	if (tty->driver->subtype != PTY_TYPE_MASTER)
-		return ERR_PTR(-EIO);
-	return dentry_open(tty->link->driver_data, flags, current_cred());
-}
-
-static int pty_get_peer(struct tty_struct *tty, int flags)
+int ptm_open_peer(struct file *master, struct tty_struct *tty, int flags)
 {
 	int fd = -1;
-	struct file *filp = NULL;
+	struct file *filp;
 	int retval = -EINVAL;
+	struct path path;
+
+	if (tty->driver != ptm_driver)
+		return -EIO;
 
 	fd = get_unused_fd_flags(0);
 	if (fd < 0) {
@@ -633,7 +627,16 @@ static int pty_get_peer(struct tty_struc
 		goto err;
 	}
 
-	filp = pty_open_peer(tty, flags);
+	/* Compute the slave's path */
+	path.mnt = devpts_mntget(master, tty->driver_data);
+	if (IS_ERR(path.mnt)) {
+		retval = PTR_ERR(path.mnt);
+		goto err_put;
+	}
+	path.dentry = tty->link->driver_data;
+
+	filp = dentry_open(&path, flags, current_cred());
+	mntput(path.mnt);
 	if (IS_ERR(filp)) {
 		retval = PTR_ERR(filp);
 		goto err_put;
@@ -662,8 +665,6 @@ static int pty_unix98_ioctl(struct tty_s
 		return pty_get_pktmode(tty, (int __user *)arg);
 	case TIOCGPTN: /* Get PT Number */
 		return put_user(tty->index, (unsigned int __user *)arg);
-	case TIOCGPTPEER: /* Open the other end */
-		return pty_get_peer(tty, (int) arg);
 	case TIOCSIG:    /* Send signal to other side of pty */
 		return pty_signal(tty, (int) arg);
 	}
@@ -791,9 +792,7 @@ static int ptmx_open(struct inode *inode
 {
 	struct pts_fs_info *fsi;
 	struct tty_struct *tty;
-	struct path *pts_path;
 	struct dentry *dentry;
-	struct vfsmount *mnt;
 	int retval;
 	int index;
 
@@ -806,7 +805,7 @@ static int ptmx_open(struct inode *inode
 	if (retval)
 		return retval;
 
-	fsi = devpts_acquire(filp, &mnt);
+	fsi = devpts_acquire(filp);
 	if (IS_ERR(fsi)) {
 		retval = PTR_ERR(fsi);
 		goto out_free_file;
@@ -846,28 +845,17 @@ static int ptmx_open(struct inode *inode
 		retval = PTR_ERR(dentry);
 		goto err_release;
 	}
-	/* We need to cache a fake path for TIOCGPTPEER. */
-	pts_path = kmalloc(sizeof(struct path), GFP_KERNEL);
-	if (!pts_path)
-		goto err_release;
-	pts_path->mnt = mnt;
-	pts_path->dentry = dentry;
-	path_get(pts_path);
-	tty->link->driver_data = pts_path;
+	tty->link->driver_data = dentry;
 
 	retval = ptm_driver->ops->open(tty, filp);
 	if (retval)
-		goto err_path_put;
+		goto err_release;
 
 	tty_debug_hangup(tty, "opening (count=%d)\n", tty->count);
 
 	tty_unlock(tty);
 	return 0;
-err_path_put:
-	path_put(pts_path);
-	kfree(pts_path);
 err_release:
-	mntput(mnt);
 	tty_unlock(tty);
 	// This will also put-ref the fsi
 	tty_release(inode, filp);
@@ -876,7 +864,6 @@ out:
 	devpts_kill_index(fsi, index);
 out_put_fsi:
 	devpts_release(fsi);
-	mntput(mnt);
 out_free_file:
 	tty_free_file(filp);
 	return retval;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/tty/tty_io.c linux-libre-4.13-rc7-gnu/drivers/tty/tty_io.c
--- linux-libre-4.13-rc6-gnu/drivers/tty/tty_io.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/tty/tty_io.c	2017-08-27 20:20:40.000000000 -0400
@@ -2518,6 +2518,9 @@ long tty_ioctl(struct file *file, unsign
 	case TIOCSSERIAL:
 		tty_warn_deprecated_flags(p);
 		break;
+	case TIOCGPTPEER:
+		/* Special because the struct file is needed */
+		return ptm_open_peer(file, tty, (int)arg);
 	default:
 		retval = tty_jobctrl_ioctl(tty, real_tty, file, cmd, arg);
 		if (retval != -ENOIOCTLCMD)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/virtio/virtio_pci_common.c linux-libre-4.13-rc7-gnu/drivers/virtio/virtio_pci_common.c
--- linux-libre-4.13-rc6-gnu/drivers/virtio/virtio_pci_common.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/virtio/virtio_pci_common.c	2017-08-27 20:20:40.000000000 -0400
@@ -107,6 +107,7 @@ static int vp_request_msix_vectors(struc
 {
 	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
 	const char *name = dev_name(&vp_dev->vdev.dev);
+	unsigned flags = PCI_IRQ_MSIX;
 	unsigned i, v;
 	int err = -ENOMEM;
 
@@ -126,10 +127,13 @@ static int vp_request_msix_vectors(struc
 					GFP_KERNEL))
 			goto error;
 
+	if (desc) {
+		flags |= PCI_IRQ_AFFINITY;
+		desc->pre_vectors++; /* virtio config vector */
+	}
+
 	err = pci_alloc_irq_vectors_affinity(vp_dev->pci_dev, nvectors,
-					     nvectors, PCI_IRQ_MSIX |
-					     (desc ? PCI_IRQ_AFFINITY : 0),
-					     desc);
+					     nvectors, flags, desc);
 	if (err < 0)
 		goto error;
 	vp_dev->msix_enabled = 1;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/drivers/xen/Makefile linux-libre-4.13-rc7-gnu/drivers/xen/Makefile
--- linux-libre-4.13-rc6-gnu/drivers/xen/Makefile	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/drivers/xen/Makefile	2017-08-27 20:20:40.000000000 -0400
@@ -7,9 +7,6 @@ obj-y	+= xenbus/
 nostackp := $(call cc-option, -fno-stack-protector)
 CFLAGS_features.o			:= $(nostackp)
 
-CFLAGS_efi.o				+= -fshort-wchar
-LDFLAGS					+= $(call ld-option, --no-wchar-size-warning)
-
 dom0-$(CONFIG_ARM64) += arm-device.o
 dom0-$(CONFIG_PCI) += pci.o
 dom0-$(CONFIG_USB_SUPPORT) += dbgp.o
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/btrfs/disk-io.c linux-libre-4.13-rc7-gnu/fs/btrfs/disk-io.c
--- linux-libre-4.13-rc6-gnu/fs/btrfs/disk-io.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/btrfs/disk-io.c	2017-08-27 20:20:40.000000000 -0400
@@ -3516,7 +3516,7 @@ static blk_status_t wait_dev_flush(struc
 	struct bio *bio = device->flush_bio;
 
 	if (!device->flush_bio_sent)
-		return 0;
+		return BLK_STS_OK;
 
 	device->flush_bio_sent = 0;
 	wait_for_completion_io(&device->flush_wait);
@@ -3563,7 +3563,7 @@ static int barrier_all_devices(struct bt
 			continue;
 
 		write_dev_flush(dev);
-		dev->last_flush_error = 0;
+		dev->last_flush_error = BLK_STS_OK;
 	}
 
 	/* wait for all the barriers */
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/btrfs/inode.c linux-libre-4.13-rc7-gnu/fs/btrfs/inode.c
--- linux-libre-4.13-rc6-gnu/fs/btrfs/inode.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/btrfs/inode.c	2017-08-27 20:20:40.000000000 -0400
@@ -7924,11 +7924,12 @@ err:
 	return ret;
 }
 
-static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio,
-					int mirror_num)
+static inline blk_status_t submit_dio_repair_bio(struct inode *inode,
+						 struct bio *bio,
+						 int mirror_num)
 {
 	struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
-	int ret;
+	blk_status_t ret;
 
 	BUG_ON(bio_op(bio) == REQ_OP_WRITE);
 
@@ -7980,10 +7981,10 @@ static int btrfs_check_dio_repairable(st
 	return 1;
 }
 
-static int dio_read_error(struct inode *inode, struct bio *failed_bio,
-			struct page *page, unsigned int pgoff,
-			u64 start, u64 end, int failed_mirror,
-			bio_end_io_t *repair_endio, void *repair_arg)
+static blk_status_t dio_read_error(struct inode *inode, struct bio *failed_bio,
+				   struct page *page, unsigned int pgoff,
+				   u64 start, u64 end, int failed_mirror,
+				   bio_end_io_t *repair_endio, void *repair_arg)
 {
 	struct io_failure_record *failrec;
 	struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
@@ -7993,18 +7994,19 @@ static int dio_read_error(struct inode *
 	int read_mode = 0;
 	int segs;
 	int ret;
+	blk_status_t status;
 
 	BUG_ON(bio_op(failed_bio) == REQ_OP_WRITE);
 
 	ret = btrfs_get_io_failure_record(inode, start, end, &failrec);
 	if (ret)
-		return ret;
+		return errno_to_blk_status(ret);
 
 	ret = btrfs_check_dio_repairable(inode, failed_bio, failrec,
 					 failed_mirror);
 	if (!ret) {
 		free_io_failure(failure_tree, io_tree, failrec);
-		return -EIO;
+		return BLK_STS_IOERR;
 	}
 
 	segs = bio_segments(failed_bio);
@@ -8022,13 +8024,13 @@ static int dio_read_error(struct inode *
 		    "Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n",
 		    read_mode, failrec->this_mirror, failrec->in_validation);
 
-	ret = submit_dio_repair_bio(inode, bio, failrec->this_mirror);
-	if (ret) {
+	status = submit_dio_repair_bio(inode, bio, failrec->this_mirror);
+	if (status) {
 		free_io_failure(failure_tree, io_tree, failrec);
 		bio_put(bio);
 	}
 
-	return ret;
+	return status;
 }
 
 struct btrfs_retry_complete {
@@ -8065,8 +8067,8 @@ end:
 	bio_put(bio);
 }
 
-static int __btrfs_correct_data_nocsum(struct inode *inode,
-				       struct btrfs_io_bio *io_bio)
+static blk_status_t __btrfs_correct_data_nocsum(struct inode *inode,
+						struct btrfs_io_bio *io_bio)
 {
 	struct btrfs_fs_info *fs_info;
 	struct bio_vec bvec;
@@ -8076,8 +8078,8 @@ static int __btrfs_correct_data_nocsum(s
 	unsigned int pgoff;
 	u32 sectorsize;
 	int nr_sectors;
-	int ret;
-	int err = 0;
+	blk_status_t ret;
+	blk_status_t err = BLK_STS_OK;
 
 	fs_info = BTRFS_I(inode)->root->fs_info;
 	sectorsize = fs_info->sectorsize;
@@ -8183,11 +8185,12 @@ static blk_status_t __btrfs_subio_endio_
 	int csum_pos;
 	bool uptodate = (err == 0);
 	int ret;
+	blk_status_t status;
 
 	fs_info = BTRFS_I(inode)->root->fs_info;
 	sectorsize = fs_info->sectorsize;
 
-	err = 0;
+	err = BLK_STS_OK;
 	start = io_bio->logical;
 	done.inode = inode;
 	io_bio->bio.bi_iter = io_bio->iter;
@@ -8209,12 +8212,12 @@ try_again:
 		done.start = start;
 		init_completion(&done.done);
 
-		ret = dio_read_error(inode, &io_bio->bio, bvec.bv_page,
-				pgoff, start, start + sectorsize - 1,
-				io_bio->mirror_num,
-				btrfs_retry_endio, &done);
-		if (ret) {
-			err = errno_to_blk_status(ret);
+		status = dio_read_error(inode, &io_bio->bio, bvec.bv_page,
+					pgoff, start, start + sectorsize - 1,
+					io_bio->mirror_num, btrfs_retry_endio,
+					&done);
+		if (status) {
+			err = status;
 			goto next;
 		}
 
@@ -8250,7 +8253,7 @@ static blk_status_t btrfs_subio_endio_re
 		if (unlikely(err))
 			return __btrfs_correct_data_nocsum(inode, io_bio);
 		else
-			return 0;
+			return BLK_STS_OK;
 	} else {
 		return __btrfs_subio_endio_read(inode, io_bio, err);
 	}
@@ -8423,9 +8426,9 @@ static inline blk_status_t btrfs_lookup_
 	return 0;
 }
 
-static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode,
-					 u64 file_offset, int skip_sum,
-					 int async_submit)
+static inline blk_status_t
+__btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, u64 file_offset,
+		       int skip_sum, int async_submit)
 {
 	struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
 	struct btrfs_dio_private *dip = bio->bi_private;
@@ -8488,6 +8491,7 @@ static int btrfs_submit_direct_hook(stru
 	int clone_offset = 0;
 	int clone_len;
 	int ret;
+	blk_status_t status;
 
 	map_length = orig_bio->bi_iter.bi_size;
 	submit_len = map_length;
@@ -8537,9 +8541,9 @@ static int btrfs_submit_direct_hook(stru
 		 */
 		atomic_inc(&dip->pending_bios);
 
-		ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
-					     async_submit);
-		if (ret) {
+		status = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
+						async_submit);
+		if (status) {
 			bio_put(bio);
 			atomic_dec(&dip->pending_bios);
 			goto out_err;
@@ -8557,9 +8561,9 @@ static int btrfs_submit_direct_hook(stru
 	} while (submit_len > 0);
 
 submit:
-	ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
-				     async_submit);
-	if (!ret)
+	status = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
+					async_submit);
+	if (!status)
 		return 0;
 
 	bio_put(bio);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/btrfs/raid56.c linux-libre-4.13-rc7-gnu/fs/btrfs/raid56.c
--- linux-libre-4.13-rc6-gnu/fs/btrfs/raid56.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/btrfs/raid56.c	2017-08-27 20:20:40.000000000 -0400
@@ -905,7 +905,7 @@ static void raid_write_end_io(struct bio
 	if (!atomic_dec_and_test(&rbio->stripes_pending))
 		return;
 
-	err = 0;
+	err = BLK_STS_OK;
 
 	/* OK, we have read all the stripes we need to. */
 	max_errors = (rbio->operation == BTRFS_RBIO_PARITY_SCRUB) ?
@@ -1324,7 +1324,7 @@ write_data:
 	return;
 
 cleanup:
-	rbio_orig_end_io(rbio, -EIO);
+	rbio_orig_end_io(rbio, BLK_STS_IOERR);
 }
 
 /*
@@ -1475,7 +1475,7 @@ static void raid_rmw_end_io(struct bio *
 
 cleanup:
 
-	rbio_orig_end_io(rbio, -EIO);
+	rbio_orig_end_io(rbio, BLK_STS_IOERR);
 }
 
 static void async_rmw_stripe(struct btrfs_raid_bio *rbio)
@@ -1579,7 +1579,7 @@ static int raid56_rmw_stripe(struct btrf
 	return 0;
 
 cleanup:
-	rbio_orig_end_io(rbio, -EIO);
+	rbio_orig_end_io(rbio, BLK_STS_IOERR);
 	return -EIO;
 
 finish:
@@ -1795,12 +1795,12 @@ static void __raid_recover_end_io(struct
 	void **pointers;
 	int faila = -1, failb = -1;
 	struct page *page;
-	int err;
+	blk_status_t err;
 	int i;
 
 	pointers = kcalloc(rbio->real_stripes, sizeof(void *), GFP_NOFS);
 	if (!pointers) {
-		err = -ENOMEM;
+		err = BLK_STS_RESOURCE;
 		goto cleanup_io;
 	}
 
@@ -1856,7 +1856,7 @@ static void __raid_recover_end_io(struct
 					 * a bad data or Q stripe.
 					 * TODO, we should redo the xor here.
 					 */
-					err = -EIO;
+					err = BLK_STS_IOERR;
 					goto cleanup;
 				}
 				/*
@@ -1882,7 +1882,7 @@ static void __raid_recover_end_io(struct
 			if (rbio->bbio->raid_map[failb] == RAID6_Q_STRIPE) {
 				if (rbio->bbio->raid_map[faila] ==
 				    RAID5_P_STRIPE) {
-					err = -EIO;
+					err = BLK_STS_IOERR;
 					goto cleanup;
 				}
 				/*
@@ -1954,13 +1954,13 @@ pstripe:
 		}
 	}
 
-	err = 0;
+	err = BLK_STS_OK;
 cleanup:
 	kfree(pointers);
 
 cleanup_io:
 	if (rbio->operation == BTRFS_RBIO_READ_REBUILD) {
-		if (err == 0)
+		if (err == BLK_STS_OK)
 			cache_rbio_pages(rbio);
 		else
 			clear_bit(RBIO_CACHE_READY_BIT, &rbio->flags);
@@ -1968,7 +1968,7 @@ cleanup_io:
 		rbio_orig_end_io(rbio, err);
 	} else if (rbio->operation == BTRFS_RBIO_REBUILD_MISSING) {
 		rbio_orig_end_io(rbio, err);
-	} else if (err == 0) {
+	} else if (err == BLK_STS_OK) {
 		rbio->faila = -1;
 		rbio->failb = -1;
 
@@ -2005,7 +2005,7 @@ static void raid_recover_end_io(struct b
 		return;
 
 	if (atomic_read(&rbio->error) > rbio->bbio->max_errors)
-		rbio_orig_end_io(rbio, -EIO);
+		rbio_orig_end_io(rbio, BLK_STS_IOERR);
 	else
 		__raid_recover_end_io(rbio);
 }
@@ -2104,7 +2104,7 @@ out:
 cleanup:
 	if (rbio->operation == BTRFS_RBIO_READ_REBUILD ||
 	    rbio->operation == BTRFS_RBIO_REBUILD_MISSING)
-		rbio_orig_end_io(rbio, -EIO);
+		rbio_orig_end_io(rbio, BLK_STS_IOERR);
 	return -EIO;
 }
 
@@ -2431,7 +2431,7 @@ submit_write:
 	nr_data = bio_list_size(&bio_list);
 	if (!nr_data) {
 		/* Every parity is right */
-		rbio_orig_end_io(rbio, 0);
+		rbio_orig_end_io(rbio, BLK_STS_OK);
 		return;
 	}
 
@@ -2451,7 +2451,7 @@ submit_write:
 	return;
 
 cleanup:
-	rbio_orig_end_io(rbio, -EIO);
+	rbio_orig_end_io(rbio, BLK_STS_IOERR);
 }
 
 static inline int is_data_stripe(struct btrfs_raid_bio *rbio, int stripe)
@@ -2519,7 +2519,7 @@ static void validate_rbio_for_parity_scr
 	return;
 
 cleanup:
-	rbio_orig_end_io(rbio, -EIO);
+	rbio_orig_end_io(rbio, BLK_STS_IOERR);
 }
 
 /*
@@ -2633,7 +2633,7 @@ static void raid56_parity_scrub_stripe(s
 	return;
 
 cleanup:
-	rbio_orig_end_io(rbio, -EIO);
+	rbio_orig_end_io(rbio, BLK_STS_IOERR);
 	return;
 
 finish:
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/btrfs/volumes.c linux-libre-4.13-rc7-gnu/fs/btrfs/volumes.c
--- linux-libre-4.13-rc6-gnu/fs/btrfs/volumes.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/btrfs/volumes.c	2017-08-27 20:20:40.000000000 -0400
@@ -6212,8 +6212,8 @@ static void bbio_error(struct btrfs_bio
 	}
 }
 
-int btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
-		  int mirror_num, int async_submit)
+blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
+			   int mirror_num, int async_submit)
 {
 	struct btrfs_device *dev;
 	struct bio *first_bio = bio;
@@ -6233,7 +6233,7 @@ int btrfs_map_bio(struct btrfs_fs_info *
 				&map_length, &bbio, mirror_num, 1);
 	if (ret) {
 		btrfs_bio_counter_dec(fs_info);
-		return ret;
+		return errno_to_blk_status(ret);
 	}
 
 	total_devs = bbio->num_stripes;
@@ -6256,7 +6256,7 @@ int btrfs_map_bio(struct btrfs_fs_info *
 		}
 
 		btrfs_bio_counter_dec(fs_info);
-		return ret;
+		return errno_to_blk_status(ret);
 	}
 
 	if (map_length < length) {
@@ -6283,7 +6283,7 @@ int btrfs_map_bio(struct btrfs_fs_info *
 				  dev_nr, async_submit);
 	}
 	btrfs_bio_counter_dec(fs_info);
-	return 0;
+	return BLK_STS_OK;
 }
 
 struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/btrfs/volumes.h linux-libre-4.13-rc7-gnu/fs/btrfs/volumes.h
--- linux-libre-4.13-rc6-gnu/fs/btrfs/volumes.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/btrfs/volumes.h	2017-08-27 20:20:40.000000000 -0400
@@ -74,7 +74,7 @@ struct btrfs_device {
 	int missing;
 	int can_discard;
 	int is_tgtdev_for_dev_replace;
-	int last_flush_error;
+	blk_status_t last_flush_error;
 	int flush_bio_sent;
 
 #ifdef __BTRFS_NEED_DEVICE_DATA_ORDERED
@@ -416,8 +416,8 @@ int btrfs_alloc_chunk(struct btrfs_trans
 		      struct btrfs_fs_info *fs_info, u64 type);
 void btrfs_mapping_init(struct btrfs_mapping_tree *tree);
 void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree);
-int btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
-		  int mirror_num, int async_submit);
+blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
+			   int mirror_num, int async_submit);
 int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
 		       fmode_t flags, void *holder);
 int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/cifs/dir.c linux-libre-4.13-rc7-gnu/fs/cifs/dir.c
--- linux-libre-4.13-rc6-gnu/fs/cifs/dir.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/cifs/dir.c	2017-08-27 20:20:40.000000000 -0400
@@ -194,15 +194,20 @@ cifs_bp_rename_retry:
 }
 
 /*
+ * Don't allow path components longer than the server max.
  * Don't allow the separator character in a path component.
  * The VFS will not allow "/", but "\" is allowed by posix.
  */
 static int
-check_name(struct dentry *direntry)
+check_name(struct dentry *direntry, struct cifs_tcon *tcon)
 {
 	struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
 	int i;
 
+	if (unlikely(direntry->d_name.len >
+		     tcon->fsAttrInfo.MaxPathNameComponentLength))
+		return -ENAMETOOLONG;
+
 	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)) {
 		for (i = 0; i < direntry->d_name.len; i++) {
 			if (direntry->d_name.name[i] == '\\') {
@@ -500,10 +505,6 @@ cifs_atomic_open(struct inode *inode, st
 		return finish_no_open(file, res);
 	}
 
-	rc = check_name(direntry);
-	if (rc)
-		return rc;
-
 	xid = get_xid();
 
 	cifs_dbg(FYI, "parent inode = 0x%p name is: %pd and dentry = 0x%p\n",
@@ -516,6 +517,11 @@ cifs_atomic_open(struct inode *inode, st
 	}
 
 	tcon = tlink_tcon(tlink);
+
+	rc = check_name(direntry, tcon);
+	if (rc)
+		goto out_free_xid;
+
 	server = tcon->ses->server;
 
 	if (server->ops->new_lease_key)
@@ -776,7 +782,7 @@ cifs_lookup(struct inode *parent_dir_ino
 	}
 	pTcon = tlink_tcon(tlink);
 
-	rc = check_name(direntry);
+	rc = check_name(direntry, pTcon);
 	if (rc)
 		goto lookup_out;
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/cifs/smb2pdu.c linux-libre-4.13-rc7-gnu/fs/cifs/smb2pdu.c
--- linux-libre-4.13-rc6-gnu/fs/cifs/smb2pdu.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/cifs/smb2pdu.c	2017-08-27 20:20:40.000000000 -0400
@@ -3219,8 +3219,8 @@ copy_fs_info_to_kstatfs(struct smb2_fs_f
 	kst->f_bsize = le32_to_cpu(pfs_inf->BytesPerSector) *
 			  le32_to_cpu(pfs_inf->SectorsPerAllocationUnit);
 	kst->f_blocks = le64_to_cpu(pfs_inf->TotalAllocationUnits);
-	kst->f_bfree  = le64_to_cpu(pfs_inf->ActualAvailableAllocationUnits);
-	kst->f_bavail = le64_to_cpu(pfs_inf->CallerAvailableAllocationUnits);
+	kst->f_bfree  = kst->f_bavail =
+			le64_to_cpu(pfs_inf->CallerAvailableAllocationUnits);
 	return;
 }
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/dax.c linux-libre-4.13-rc7-gnu/fs/dax.c
--- linux-libre-4.13-rc6-gnu/fs/dax.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/dax.c	2017-08-27 20:20:40.000000000 -0400
@@ -1383,6 +1383,16 @@ static int dax_iomap_pmd_fault(struct vm
 
 	trace_dax_pmd_fault(inode, vmf, max_pgoff, 0);
 
+	/*
+	 * Make sure that the faulting address's PMD offset (color) matches
+	 * the PMD offset from the start of the file.  This is necessary so
+	 * that a PMD range in the page table overlaps exactly with a PMD
+	 * range in the radix tree.
+	 */
+	if ((vmf->pgoff & PG_PMD_COLOUR) !=
+	    ((vmf->address >> PAGE_SHIFT) & PG_PMD_COLOUR))
+		goto fallback;
+
 	/* Fall back to PTEs if we're going to COW */
 	if (write && !(vma->vm_flags & VM_SHARED))
 		goto fallback;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/devpts/inode.c linux-libre-4.13-rc7-gnu/fs/devpts/inode.c
--- linux-libre-4.13-rc6-gnu/fs/devpts/inode.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/devpts/inode.c	2017-08-27 20:20:40.000000000 -0400
@@ -133,7 +133,51 @@ static inline struct pts_fs_info *DEVPTS
 	return sb->s_fs_info;
 }
 
-struct pts_fs_info *devpts_acquire(struct file *filp, struct vfsmount **ptsmnt)
+static int devpts_ptmx_path(struct path *path)
+{
+	struct super_block *sb;
+	int err;
+
+	/* Has the devpts filesystem already been found? */
+	if (path->mnt->mnt_sb->s_magic == DEVPTS_SUPER_MAGIC)
+		return 0;
+
+	/* Is a devpts filesystem at "pts" in the same directory? */
+	err = path_pts(path);
+	if (err)
+		return err;
+
+	/* Is the path the root of a devpts filesystem? */
+	sb = path->mnt->mnt_sb;
+	if ((sb->s_magic != DEVPTS_SUPER_MAGIC) ||
+	    (path->mnt->mnt_root != sb->s_root))
+		return -ENODEV;
+
+	return 0;
+}
+
+struct vfsmount *devpts_mntget(struct file *filp, struct pts_fs_info *fsi)
+{
+	struct path path;
+	int err;
+
+	path = filp->f_path;
+	path_get(&path);
+
+	err = devpts_ptmx_path(&path);
+	dput(path.dentry);
+	if (err) {
+		mntput(path.mnt);
+		path.mnt = ERR_PTR(err);
+	}
+	if (DEVPTS_SB(path.mnt->mnt_sb) != fsi) {
+		mntput(path.mnt);
+		path.mnt = ERR_PTR(-ENODEV);
+	}
+	return path.mnt;
+}
+
+struct pts_fs_info *devpts_acquire(struct file *filp)
 {
 	struct pts_fs_info *result;
 	struct path path;
@@ -142,31 +186,18 @@ struct pts_fs_info *devpts_acquire(struc
 
 	path = filp->f_path;
 	path_get(&path);
-	*ptsmnt = NULL;
-
-	/* Has the devpts filesystem already been found? */
-	sb = path.mnt->mnt_sb;
-	if (sb->s_magic != DEVPTS_SUPER_MAGIC) {
-		/* Is a devpts filesystem at "pts" in the same directory? */
-		err = path_pts(&path);
-		if (err) {
-			result = ERR_PTR(err);
-			goto out;
-		}
 
-		/* Is the path the root of a devpts filesystem? */
-		result = ERR_PTR(-ENODEV);
-		sb = path.mnt->mnt_sb;
-		if ((sb->s_magic != DEVPTS_SUPER_MAGIC) ||
-		    (path.mnt->mnt_root != sb->s_root))
-			goto out;
+	err = devpts_ptmx_path(&path);
+	if (err) {
+		result = ERR_PTR(err);
+		goto out;
 	}
 
 	/*
 	 * pty code needs to hold extra references in case of last /dev/tty close
 	 */
+	sb = path.mnt->mnt_sb;
 	atomic_inc(&sb->s_active);
-	*ptsmnt = mntget(path.mnt);
 	result = DEVPTS_SB(sb);
 
 out:
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/ext4/mballoc.c linux-libre-4.13-rc7-gnu/fs/ext4/mballoc.c
--- linux-libre-4.13-rc6-gnu/fs/ext4/mballoc.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/ext4/mballoc.c	2017-08-27 20:20:40.000000000 -0400
@@ -2300,7 +2300,7 @@ static int ext4_mb_seq_groups_show(struc
 					     EXT4_MAX_BLOCK_LOG_SIZE);
 	struct sg {
 		struct ext4_group_info info;
-		ext4_grpblk_t counters[blocksize_bits + 2];
+		ext4_grpblk_t counters[EXT4_MAX_BLOCK_LOG_SIZE + 2];
 	} sg;
 
 	group--;
@@ -2309,6 +2309,9 @@ static int ext4_mb_seq_groups_show(struc
 			      " 2^0   2^1   2^2   2^3   2^4   2^5   2^6  "
 			      " 2^7   2^8   2^9   2^10  2^11  2^12  2^13  ]\n");
 
+	i = (blocksize_bits + 2) * sizeof(sg.info.bb_counters[0]) +
+		sizeof(struct ext4_group_info);
+
 	grinfo = ext4_get_group_info(sb, group);
 	/* Load the group info in memory only if not already loaded. */
 	if (unlikely(EXT4_MB_GRP_NEED_INIT(grinfo))) {
@@ -2320,7 +2323,7 @@ static int ext4_mb_seq_groups_show(struc
 		buddy_loaded = 1;
 	}
 
-	memcpy(&sg, ext4_get_group_info(sb, group), sizeof(sg));
+	memcpy(&sg, ext4_get_group_info(sb, group), i);
 
 	if (buddy_loaded)
 		ext4_mb_unload_buddy(&e4b);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/ext4/xattr.c linux-libre-4.13-rc7-gnu/fs/ext4/xattr.c
--- linux-libre-4.13-rc6-gnu/fs/ext4/xattr.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/ext4/xattr.c	2017-08-27 20:20:40.000000000 -0400
@@ -1543,7 +1543,7 @@ static int ext4_xattr_set_entry(struct e
 			/* Clear padding bytes. */
 			memset(val + i->value_len, 0, new_size - i->value_len);
 		}
-		return 0;
+		goto update_hash;
 	}
 
 	/* Compute min_offs and last. */
@@ -1707,6 +1707,7 @@ static int ext4_xattr_set_entry(struct e
 		here->e_value_size = cpu_to_le32(i->value_len);
 	}
 
+update_hash:
 	if (i->value) {
 		__le32 hash = 0;
 
@@ -1725,7 +1726,8 @@ static int ext4_xattr_set_entry(struct e
 						     here->e_name_len,
 						     &crc32c_hash, 1);
 		} else if (is_block) {
-			__le32 *value = s->base + min_offs - new_size;
+			__le32 *value = s->base + le16_to_cpu(
+							here->e_value_offs);
 
 			hash = ext4_xattr_hash_entry(here->e_name,
 						     here->e_name_len, value,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/fs/nfsd/nfs4xdr.c linux-libre-4.13-rc7-gnu/fs/nfsd/nfs4xdr.c
--- linux-libre-4.13-rc6-gnu/fs/nfsd/nfs4xdr.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/fs/nfsd/nfs4xdr.c	2017-08-27 20:20:40.000000000 -0400
@@ -144,7 +144,7 @@ static void next_decode_page(struct nfsd
 	argp->p = page_address(argp->pagelist[0]);
 	argp->pagelist++;
 	if (argp->pagelen < PAGE_SIZE) {
-		argp->end = argp->p + (argp->pagelen>>2);
+		argp->end = argp->p + XDR_QUADLEN(argp->pagelen);
 		argp->pagelen = 0;
 	} else {
 		argp->end = argp->p + (PAGE_SIZE>>2);
@@ -1279,9 +1279,7 @@ nfsd4_decode_write(struct nfsd4_compound
 		argp->pagelen -= pages * PAGE_SIZE;
 		len -= pages * PAGE_SIZE;
 
-		argp->p = (__be32 *)page_address(argp->pagelist[0]);
-		argp->pagelist++;
-		argp->end = argp->p + XDR_QUADLEN(PAGE_SIZE);
+		next_decode_page(argp);
 	}
 	argp->p += XDR_QUADLEN(len);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/asm-generic/vmlinux.lds.h linux-libre-4.13-rc7-gnu/include/asm-generic/vmlinux.lds.h
--- linux-libre-4.13-rc6-gnu/include/asm-generic/vmlinux.lds.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/asm-generic/vmlinux.lds.h	2017-08-27 20:20:40.000000000 -0400
@@ -60,6 +60,22 @@
 #define ALIGN_FUNCTION()  . = ALIGN(8)
 
 /*
+ * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections, which
+ * generates .data.identifier sections, which need to be pulled in with
+ * .data. We don't want to pull in .data..other sections, which Linux
+ * has defined. Same for text and bss.
+ */
+#ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
+#define TEXT_MAIN .text .text.[0-9a-zA-Z_]*
+#define DATA_MAIN .data .data.[0-9a-zA-Z_]*
+#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]*
+#else
+#define TEXT_MAIN .text
+#define DATA_MAIN .data
+#define BSS_MAIN .bss
+#endif
+
+/*
  * Align to a 32 byte boundary equal to the
  * alignment gcc 4.5 uses for a struct
  */
@@ -198,12 +214,9 @@
 
 /*
  * .data section
- * LD_DEAD_CODE_DATA_ELIMINATION option enables -fdata-sections generates
- * .data.identifier which needs to be pulled in with .data, but don't want to
- * pull in .data..stuff which has its own requirements. Same for bss.
  */
 #define DATA_DATA							\
-	*(.data .data.[0-9a-zA-Z_]*)					\
+	*(DATA_MAIN)							\
 	*(.ref.data)							\
 	*(.data..shared_aligned) /* percpu related */			\
 	MEM_KEEP(init.data)						\
@@ -434,16 +447,17 @@
 		VMLINUX_SYMBOL(__security_initcall_end) = .;		\
 	}
 
-/* .text section. Map to function alignment to avoid address changes
+/*
+ * .text section. Map to function alignment to avoid address changes
  * during second ld run in second ld pass when generating System.map
- * LD_DEAD_CODE_DATA_ELIMINATION option enables -ffunction-sections generates
- * .text.identifier which needs to be pulled in with .text , but some
- * architectures define .text.foo which is not intended to be pulled in here.
- * Those enabling LD_DEAD_CODE_DATA_ELIMINATION must ensure they don't have
- * conflicting section names, and must pull in .text.[0-9a-zA-Z_]* */
+ *
+ * TEXT_MAIN here will match .text.fixup and .text.unlikely if dead
+ * code elimination is enabled, so these sections should be converted
+ * to use ".." first.
+ */
 #define TEXT_TEXT							\
 		ALIGN_FUNCTION();					\
-		*(.text.hot .text .text.fixup .text.unlikely)		\
+		*(.text.hot TEXT_MAIN .text.fixup .text.unlikely)	\
 		*(.ref.text)						\
 	MEM_KEEP(init.text)						\
 	MEM_KEEP(exit.text)						\
@@ -613,7 +627,7 @@
 		BSS_FIRST_SECTIONS					\
 		*(.bss..page_aligned)					\
 		*(.dynbss)						\
-		*(.bss .bss.[0-9a-zA-Z_]*)				\
+		*(BSS_MAIN)						\
 		*(COMMON)						\
 	}
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/blkdev.h linux-libre-4.13-rc7-gnu/include/linux/blkdev.h
--- linux-libre-4.13-rc6-gnu/include/linux/blkdev.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/blkdev.h	2017-08-27 20:20:40.000000000 -0400
@@ -568,7 +568,6 @@ struct request_queue {
 
 #if defined(CONFIG_BLK_DEV_BSG)
 	bsg_job_fn		*bsg_job_fn;
-	int			bsg_job_size;
 	struct bsg_class_device bsg_dev;
 #endif
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/bsg-lib.h linux-libre-4.13-rc7-gnu/include/linux/bsg-lib.h
--- linux-libre-4.13-rc6-gnu/include/linux/bsg-lib.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/bsg-lib.h	2017-08-27 20:20:40.000000000 -0400
@@ -24,6 +24,7 @@
 #define _BLK_BSG_
 
 #include <linux/blkdev.h>
+#include <scsi/scsi_request.h>
 
 struct request;
 struct device;
@@ -37,6 +38,7 @@ struct bsg_buffer {
 };
 
 struct bsg_job {
+	struct scsi_request sreq;
 	struct device *dev;
 	struct request *req;
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/devpts_fs.h linux-libre-4.13-rc7-gnu/include/linux/devpts_fs.h
--- linux-libre-4.13-rc6-gnu/include/linux/devpts_fs.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/devpts_fs.h	2017-08-27 20:20:40.000000000 -0400
@@ -19,7 +19,8 @@
 
 struct pts_fs_info;
 
-struct pts_fs_info *devpts_acquire(struct file *, struct vfsmount **ptsmnt);
+struct vfsmount *devpts_mntget(struct file *, struct pts_fs_info *);
+struct pts_fs_info *devpts_acquire(struct file *);
 void devpts_release(struct pts_fs_info *);
 
 int devpts_new_index(struct pts_fs_info *);
@@ -32,6 +33,15 @@ void *devpts_get_priv(struct dentry *);
 /* unlink */
 void devpts_pty_kill(struct dentry *);
 
+/* in pty.c */
+int ptm_open_peer(struct file *master, struct tty_struct *tty, int flags);
+
+#else
+static inline int
+ptm_open_peer(struct file *master, struct tty_struct *tty, int flags)
+{
+	return -EIO;
+}
 #endif
 
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/fs.h linux-libre-4.13-rc7-gnu/include/linux/fs.h
--- linux-libre-4.13-rc6-gnu/include/linux/fs.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/fs.h	2017-08-27 20:20:40.000000000 -0400
@@ -907,9 +907,9 @@ static inline struct file *get_file(stru
 /* Page cache limit. The filesystems should put that into their s_maxbytes 
    limits, otherwise bad things can happen in VM. */ 
 #if BITS_PER_LONG==32
-#define MAX_LFS_FILESIZE	(((loff_t)PAGE_SIZE << (BITS_PER_LONG-1))-1)
+#define MAX_LFS_FILESIZE	((loff_t)ULONG_MAX << PAGE_SHIFT)
 #elif BITS_PER_LONG==64
-#define MAX_LFS_FILESIZE 	((loff_t)0x7fffffffffffffffLL)
+#define MAX_LFS_FILESIZE 	((loff_t)LLONG_MAX)
 #endif
 
 #define FL_POSIX	1
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/iio/iio.h linux-libre-4.13-rc7-gnu/include/linux/iio/iio.h
--- linux-libre-4.13-rc6-gnu/include/linux/iio/iio.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/iio/iio.h	2017-08-27 20:20:40.000000000 -0400
@@ -535,7 +535,7 @@ struct iio_buffer_setup_ops {
  * @scan_timestamp:	[INTERN] set if any buffers have requested timestamp
  * @scan_index_timestamp:[INTERN] cache of the index to the timestamp
  * @trig:		[INTERN] current device trigger (buffer modes)
- * @trig_readonly	[INTERN] mark the current trigger immutable
+ * @trig_readonly:	[INTERN] mark the current trigger immutable
  * @pollfunc:		[DRIVER] function run on trigger being received
  * @pollfunc_event:	[DRIVER] function run on events trigger being received
  * @channels:		[DRIVER] channel specification structure table
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/iio/trigger.h linux-libre-4.13-rc7-gnu/include/linux/iio/trigger.h
--- linux-libre-4.13-rc6-gnu/include/linux/iio/trigger.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/iio/trigger.h	2017-08-27 20:20:40.000000000 -0400
@@ -144,8 +144,8 @@ void devm_iio_trigger_unregister(struct
 /**
  * iio_trigger_set_immutable() - set an immutable trigger on destination
  *
- * @indio_dev - IIO device structure containing the device
- * @trig - trigger to assign to device
+ * @indio_dev: IIO device structure containing the device
+ * @trig: trigger to assign to device
  *
  **/
 int iio_trigger_set_immutable(struct iio_dev *indio_dev, struct iio_trigger *trig);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/iommu.h linux-libre-4.13-rc7-gnu/include/linux/iommu.h
--- linux-libre-4.13-rc6-gnu/include/linux/iommu.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/iommu.h	2017-08-27 20:20:40.000000000 -0400
@@ -240,7 +240,7 @@ struct iommu_device {
 	struct list_head list;
 	const struct iommu_ops *ops;
 	struct fwnode_handle *fwnode;
-	struct device dev;
+	struct device *dev;
 };
 
 int  iommu_device_register(struct iommu_device *iommu);
@@ -265,6 +265,11 @@ static inline void iommu_device_set_fwno
 	iommu->fwnode = fwnode;
 }
 
+static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
+{
+	return (struct iommu_device *)dev_get_drvdata(dev);
+}
+
 #define IOMMU_GROUP_NOTIFY_ADD_DEVICE		1 /* Device added */
 #define IOMMU_GROUP_NOTIFY_DEL_DEVICE		2 /* Pre Device removed */
 #define IOMMU_GROUP_NOTIFY_BIND_DRIVER		3 /* Pre Driver bind */
@@ -589,6 +594,11 @@ static inline void iommu_device_set_fwno
 {
 }
 
+static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
+{
+	return NULL;
+}
+
 static inline void iommu_device_unregister(struct iommu_device *iommu)
 {
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/pid.h linux-libre-4.13-rc7-gnu/include/linux/pid.h
--- linux-libre-4.13-rc6-gnu/include/linux/pid.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/pid.h	2017-08-27 20:20:40.000000000 -0400
@@ -8,7 +8,9 @@ enum pid_type
 	PIDTYPE_PID,
 	PIDTYPE_PGID,
 	PIDTYPE_SID,
-	PIDTYPE_MAX
+	PIDTYPE_MAX,
+	/* only valid to __task_pid_nr_ns() */
+	__PIDTYPE_TGID
 };
 
 /*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/ptr_ring.h linux-libre-4.13-rc7-gnu/include/linux/ptr_ring.h
--- linux-libre-4.13-rc6-gnu/include/linux/ptr_ring.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/ptr_ring.h	2017-08-27 20:20:40.000000000 -0400
@@ -436,9 +436,9 @@ static inline int ptr_ring_consume_batch
 	__PTR_RING_PEEK_CALL_v; \
 })
 
-static inline void **__ptr_ring_init_queue_alloc(int size, gfp_t gfp)
+static inline void **__ptr_ring_init_queue_alloc(unsigned int size, gfp_t gfp)
 {
-	return kzalloc(ALIGN(size * sizeof(void *), SMP_CACHE_BYTES), gfp);
+	return kcalloc(size, sizeof(void *), gfp);
 }
 
 static inline void __ptr_ring_set_size(struct ptr_ring *r, int size)
@@ -582,7 +582,8 @@ static inline int ptr_ring_resize(struct
  * In particular if you consume ring in interrupt or BH context, you must
  * disable interrupts/BH when doing so.
  */
-static inline int ptr_ring_resize_multiple(struct ptr_ring **rings, int nrings,
+static inline int ptr_ring_resize_multiple(struct ptr_ring **rings,
+					   unsigned int nrings,
 					   int size,
 					   gfp_t gfp, void (*destroy)(void *))
 {
@@ -590,7 +591,7 @@ static inline int ptr_ring_resize_multip
 	void ***queues;
 	int i;
 
-	queues = kmalloc(nrings * sizeof *queues, gfp);
+	queues = kmalloc_array(nrings, sizeof(*queues), gfp);
 	if (!queues)
 		goto noqueues;
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/sched.h linux-libre-4.13-rc7-gnu/include/linux/sched.h
--- linux-libre-4.13-rc6-gnu/include/linux/sched.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/sched.h	2017-08-27 20:20:40.000000000 -0400
@@ -1163,13 +1163,6 @@ static inline pid_t task_tgid_nr(struct
 	return tsk->tgid;
 }
 
-extern pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns);
-
-static inline pid_t task_tgid_vnr(struct task_struct *tsk)
-{
-	return pid_vnr(task_tgid(tsk));
-}
-
 /**
  * pid_alive - check that a task structure is not stale
  * @p: Task structure to be checked.
@@ -1185,23 +1178,6 @@ static inline int pid_alive(const struct
 	return p->pids[PIDTYPE_PID].pid != NULL;
 }
 
-static inline pid_t task_ppid_nr_ns(const struct task_struct *tsk, struct pid_namespace *ns)
-{
-	pid_t pid = 0;
-
-	rcu_read_lock();
-	if (pid_alive(tsk))
-		pid = task_tgid_nr_ns(rcu_dereference(tsk->real_parent), ns);
-	rcu_read_unlock();
-
-	return pid;
-}
-
-static inline pid_t task_ppid_nr(const struct task_struct *tsk)
-{
-	return task_ppid_nr_ns(tsk, &init_pid_ns);
-}
-
 static inline pid_t task_pgrp_nr_ns(struct task_struct *tsk, struct pid_namespace *ns)
 {
 	return __task_pid_nr_ns(tsk, PIDTYPE_PGID, ns);
@@ -1223,6 +1199,33 @@ static inline pid_t task_session_vnr(str
 	return __task_pid_nr_ns(tsk, PIDTYPE_SID, NULL);
 }
 
+static inline pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns)
+{
+	return __task_pid_nr_ns(tsk, __PIDTYPE_TGID, ns);
+}
+
+static inline pid_t task_tgid_vnr(struct task_struct *tsk)
+{
+	return __task_pid_nr_ns(tsk, __PIDTYPE_TGID, NULL);
+}
+
+static inline pid_t task_ppid_nr_ns(const struct task_struct *tsk, struct pid_namespace *ns)
+{
+	pid_t pid = 0;
+
+	rcu_read_lock();
+	if (pid_alive(tsk))
+		pid = task_tgid_nr_ns(rcu_dereference(tsk->real_parent), ns);
+	rcu_read_unlock();
+
+	return pid;
+}
+
+static inline pid_t task_ppid_nr(const struct task_struct *tsk)
+{
+	return task_ppid_nr_ns(tsk, &init_pid_ns);
+}
+
 /* Obsolete, do not use: */
 static inline pid_t task_pgrp_nr(struct task_struct *tsk)
 {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/linux/skb_array.h linux-libre-4.13-rc7-gnu/include/linux/skb_array.h
--- linux-libre-4.13-rc6-gnu/include/linux/skb_array.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/linux/skb_array.h	2017-08-27 20:20:40.000000000 -0400
@@ -193,7 +193,8 @@ static inline int skb_array_resize(struc
 }
 
 static inline int skb_array_resize_multiple(struct skb_array **rings,
-					    int nrings, int size, gfp_t gfp)
+					    int nrings, unsigned int size,
+					    gfp_t gfp)
 {
 	BUILD_BUG_ON(offsetof(struct skb_array, ring));
 	return ptr_ring_resize_multiple((struct ptr_ring **)rings,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/net/ip.h linux-libre-4.13-rc7-gnu/include/net/ip.h
--- linux-libre-4.13-rc6-gnu/include/net/ip.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/net/ip.h	2017-08-27 20:20:40.000000000 -0400
@@ -352,7 +352,7 @@ static inline unsigned int ip_dst_mtu_ma
 	    !forwarding)
 		return dst_mtu(dst);
 
-	return min(dst->dev->mtu, IP_MAX_MTU);
+	return min(READ_ONCE(dst->dev->mtu), IP_MAX_MTU);
 }
 
 static inline unsigned int ip_skb_dst_mtu(struct sock *sk,
@@ -364,7 +364,7 @@ static inline unsigned int ip_skb_dst_mt
 		return ip_dst_mtu_maybe_forward(skb_dst(skb), forwarding);
 	}
 
-	return min(skb_dst(skb)->dev->mtu, IP_MAX_MTU);
+	return min(READ_ONCE(skb_dst(skb)->dev->mtu), IP_MAX_MTU);
 }
 
 u32 ip_idents_reserve(u32 hash, int segs);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/net/sch_generic.h linux-libre-4.13-rc7-gnu/include/net/sch_generic.h
--- linux-libre-4.13-rc6-gnu/include/net/sch_generic.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/net/sch_generic.h	2017-08-27 20:20:40.000000000 -0400
@@ -806,8 +806,11 @@ static inline struct Qdisc *qdisc_replac
 	old = *pold;
 	*pold = new;
 	if (old != NULL) {
-		qdisc_tree_reduce_backlog(old, old->q.qlen, old->qstats.backlog);
+		unsigned int qlen = old->q.qlen;
+		unsigned int backlog = old->qstats.backlog;
+
 		qdisc_reset(old);
+		qdisc_tree_reduce_backlog(old, qlen, backlog);
 	}
 	sch_tree_unlock(sch);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/net/sock.h linux-libre-4.13-rc7-gnu/include/net/sock.h
--- linux-libre-4.13-rc6-gnu/include/net/sock.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/net/sock.h	2017-08-27 20:20:40.000000000 -0400
@@ -507,9 +507,7 @@ int sk_set_peek_off(struct sock *sk, int
 static inline int sk_peek_offset(struct sock *sk, int flags)
 {
 	if (unlikely(flags & MSG_PEEK)) {
-		s32 off = READ_ONCE(sk->sk_peek_off);
-		if (off >= 0)
-			return off;
+		return READ_ONCE(sk->sk_peek_off);
 	}
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/rdma/ib_verbs.h linux-libre-4.13-rc7-gnu/include/rdma/ib_verbs.h
--- linux-libre-4.13-rc6-gnu/include/rdma/ib_verbs.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/rdma/ib_verbs.h	2017-08-27 20:20:40.000000000 -0400
@@ -1683,6 +1683,7 @@ struct ib_qp {
 	enum ib_qp_type		qp_type;
 	struct ib_rwq_ind_table *rwq_ind_tbl;
 	struct ib_qp_security  *qp_sec;
+	u8			port;
 };
 
 struct ib_mr {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/scsi/scsi_cmnd.h linux-libre-4.13-rc7-gnu/include/scsi/scsi_cmnd.h
--- linux-libre-4.13-rc6-gnu/include/scsi/scsi_cmnd.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/scsi/scsi_cmnd.h	2017-08-27 20:20:40.000000000 -0400
@@ -57,6 +57,7 @@ struct scsi_pointer {
 /* for scmd->flags */
 #define SCMD_TAGGED		(1 << 0)
 #define SCMD_UNCHECKED_ISA_DMA	(1 << 1)
+#define SCMD_ZONE_WRITE_LOCK	(1 << 2)
 
 struct scsi_cmnd {
 	struct scsi_request req;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/include/uapi/linux/loop.h linux-libre-4.13-rc7-gnu/include/uapi/linux/loop.h
--- linux-libre-4.13-rc6-gnu/include/uapi/linux/loop.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/include/uapi/linux/loop.h	2017-08-27 20:20:40.000000000 -0400
@@ -22,7 +22,6 @@ enum {
 	LO_FLAGS_AUTOCLEAR	= 4,
 	LO_FLAGS_PARTSCAN	= 8,
 	LO_FLAGS_DIRECT_IO	= 16,
-	LO_FLAGS_BLOCKSIZE	= 32,
 };
 
 #include <asm/posix_types.h>	/* for __kernel_old_dev_t */
@@ -60,8 +59,6 @@ struct loop_info64 {
 	__u64		   lo_init[2];
 };
 
-#define LO_INFO_BLOCKSIZE(l) (l)->lo_init[0]
-
 /*
  * Loop filter types
  */
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/events/core.c linux-libre-4.13-rc7-gnu/kernel/events/core.c
--- linux-libre-4.13-rc6-gnu/kernel/events/core.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/events/core.c	2017-08-27 20:20:40.000000000 -0400
@@ -10032,28 +10032,27 @@ SYSCALL_DEFINE5(perf_event_open,
 			goto err_context;
 
 		/*
-		 * Do not allow to attach to a group in a different
-		 * task or CPU context:
+		 * Make sure we're both events for the same CPU;
+		 * grouping events for different CPUs is broken; since
+		 * you can never concurrently schedule them anyhow.
 		 */
-		if (move_group) {
-			/*
-			 * Make sure we're both on the same task, or both
-			 * per-cpu events.
-			 */
-			if (group_leader->ctx->task != ctx->task)
-				goto err_context;
+		if (group_leader->cpu != event->cpu)
+			goto err_context;
 
-			/*
-			 * Make sure we're both events for the same CPU;
-			 * grouping events for different CPUs is broken; since
-			 * you can never concurrently schedule them anyhow.
-			 */
-			if (group_leader->cpu != event->cpu)
-				goto err_context;
-		} else {
-			if (group_leader->ctx != ctx)
-				goto err_context;
-		}
+		/*
+		 * Make sure we're both on the same task, or both
+		 * per-CPU events.
+		 */
+		if (group_leader->ctx->task != ctx->task)
+			goto err_context;
+
+		/*
+		 * Do not allow to attach to a group in a different task
+		 * or CPU context. If we're moving SW events, we'll fix
+		 * this up later, so allow that.
+		 */
+		if (!move_group && group_leader->ctx != ctx)
+			goto err_context;
 
 		/*
 		 * Only a group leader can be exclusive or pinned
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/fork.c linux-libre-4.13-rc7-gnu/kernel/fork.c
--- linux-libre-4.13-rc6-gnu/kernel/fork.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/fork.c	2017-08-27 20:20:40.000000000 -0400
@@ -806,6 +806,7 @@ static struct mm_struct *mm_init(struct
 	mm_init_cpumask(mm);
 	mm_init_aio(mm);
 	mm_init_owner(mm, p);
+	RCU_INIT_POINTER(mm->exe_file, NULL);
 	mmu_notifier_mm_init(mm);
 	init_tlb_flush_pending(mm);
 #if defined(CONFIG_TRANSPARENT_HUGEPAGE) && !USE_SPLIT_PMD_PTLOCKS
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/pid.c linux-libre-4.13-rc7-gnu/kernel/pid.c
--- linux-libre-4.13-rc6-gnu/kernel/pid.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/pid.c	2017-08-27 20:20:40.000000000 -0400
@@ -527,8 +527,11 @@ pid_t __task_pid_nr_ns(struct task_struc
 	if (!ns)
 		ns = task_active_pid_ns(current);
 	if (likely(pid_alive(task))) {
-		if (type != PIDTYPE_PID)
+		if (type != PIDTYPE_PID) {
+			if (type == __PIDTYPE_TGID)
+				type = PIDTYPE_PID;
 			task = task->group_leader;
+		}
 		nr = pid_nr_ns(rcu_dereference(task->pids[type].pid), ns);
 	}
 	rcu_read_unlock();
@@ -537,12 +540,6 @@ pid_t __task_pid_nr_ns(struct task_struc
 }
 EXPORT_SYMBOL(__task_pid_nr_ns);
 
-pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns)
-{
-	return pid_nr_ns(task_tgid(tsk), ns);
-}
-EXPORT_SYMBOL(task_tgid_nr_ns);
-
 struct pid_namespace *task_active_pid_ns(struct task_struct *tsk)
 {
 	return ns_of_pid(task_pid(tsk));
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/sched/wait.c linux-libre-4.13-rc7-gnu/kernel/sched/wait.c
--- linux-libre-4.13-rc6-gnu/kernel/sched/wait.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/sched/wait.c	2017-08-27 20:20:40.000000000 -0400
@@ -70,9 +70,10 @@ static void __wake_up_common(struct wait
 
 	list_for_each_entry_safe(curr, next, &wq_head->head, entry) {
 		unsigned flags = curr->flags;
-
-		if (curr->func(curr, mode, wake_flags, key) &&
-				(flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
+		int ret = curr->func(curr, mode, wake_flags, key);
+		if (ret < 0)
+			break;
+		if (ret && (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
 			break;
 	}
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/time/timer.c linux-libre-4.13-rc7-gnu/kernel/time/timer.c
--- linux-libre-4.13-rc6-gnu/kernel/time/timer.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/time/timer.c	2017-08-27 20:20:40.000000000 -0400
@@ -203,6 +203,7 @@ struct timer_base {
 	bool			migration_enabled;
 	bool			nohz_active;
 	bool			is_idle;
+	bool			must_forward_clk;
 	DECLARE_BITMAP(pending_map, WHEEL_SIZE);
 	struct hlist_head	vectors[WHEEL_SIZE];
 } ____cacheline_aligned;
@@ -856,13 +857,19 @@ get_target_base(struct timer_base *base,
 
 static inline void forward_timer_base(struct timer_base *base)
 {
-	unsigned long jnow = READ_ONCE(jiffies);
+	unsigned long jnow;
 
 	/*
-	 * We only forward the base when it's idle and we have a delta between
-	 * base clock and jiffies.
+	 * We only forward the base when we are idle or have just come out of
+	 * idle (must_forward_clk logic), and have a delta between base clock
+	 * and jiffies. In the common case, run_timers will take care of it.
 	 */
-	if (!base->is_idle || (long) (jnow - base->clk) < 2)
+	if (likely(!base->must_forward_clk))
+		return;
+
+	jnow = READ_ONCE(jiffies);
+	base->must_forward_clk = base->is_idle;
+	if ((long)(jnow - base->clk) < 2)
 		return;
 
 	/*
@@ -938,6 +945,11 @@ __mod_timer(struct timer_list *timer, un
 	 * same array bucket then just return:
 	 */
 	if (timer_pending(timer)) {
+		/*
+		 * The downside of this optimization is that it can result in
+		 * larger granularity than you would get from adding a new
+		 * timer with this expiry.
+		 */
 		if (timer->expires == expires)
 			return 1;
 
@@ -948,6 +960,7 @@ __mod_timer(struct timer_list *timer, un
 		 * dequeue/enqueue dance.
 		 */
 		base = lock_timer_base(timer, &flags);
+		forward_timer_base(base);
 
 		clk = base->clk;
 		idx = calc_wheel_index(expires, clk);
@@ -964,6 +977,7 @@ __mod_timer(struct timer_list *timer, un
 		}
 	} else {
 		base = lock_timer_base(timer, &flags);
+		forward_timer_base(base);
 	}
 
 	ret = detach_if_pending(timer, base, false);
@@ -991,12 +1005,10 @@ __mod_timer(struct timer_list *timer, un
 			raw_spin_lock(&base->lock);
 			WRITE_ONCE(timer->flags,
 				   (timer->flags & ~TIMER_BASEMASK) | base->cpu);
+			forward_timer_base(base);
 		}
 	}
 
-	/* Try to forward a stale timer base clock */
-	forward_timer_base(base);
-
 	timer->expires = expires;
 	/*
 	 * If 'idx' was calculated above and the base time did not advance
@@ -1112,6 +1124,7 @@ void add_timer_on(struct timer_list *tim
 		WRITE_ONCE(timer->flags,
 			   (timer->flags & ~TIMER_BASEMASK) | cpu);
 	}
+	forward_timer_base(base);
 
 	debug_activate(timer, timer->expires);
 	internal_add_timer(base, timer);
@@ -1497,10 +1510,16 @@ u64 get_next_timer_interrupt(unsigned lo
 		if (!is_max_delta)
 			expires = basem + (u64)(nextevt - basej) * TICK_NSEC;
 		/*
-		 * If we expect to sleep more than a tick, mark the base idle:
+		 * If we expect to sleep more than a tick, mark the base idle.
+		 * Also the tick is stopped so any added timer must forward
+		 * the base clk itself to keep granularity small. This idle
+		 * logic is only maintained for the BASE_STD base, deferrable
+		 * timers may still see large granularity skew (by design).
 		 */
-		if ((expires - basem) > TICK_NSEC)
+		if ((expires - basem) > TICK_NSEC) {
+			base->must_forward_clk = true;
 			base->is_idle = true;
+		}
 	}
 	raw_spin_unlock(&base->lock);
 
@@ -1611,6 +1630,19 @@ static __latent_entropy void run_timer_s
 {
 	struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
 
+	/*
+	 * must_forward_clk must be cleared before running timers so that any
+	 * timer functions that call mod_timer will not try to forward the
+	 * base. idle trcking / clock forwarding logic is only used with
+	 * BASE_STD timers.
+	 *
+	 * The deferrable base does not do idle tracking at all, so we do
+	 * not forward it. This can result in very large variations in
+	 * granularity for deferrable timers, but they can be deferred for
+	 * long periods due to idle.
+	 */
+	base->must_forward_clk = false;
+
 	__run_timers(base);
 	if (IS_ENABLED(CONFIG_NO_HZ_COMMON) && base->nohz_active)
 		__run_timers(this_cpu_ptr(&timer_bases[BASE_DEF]));
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/trace/ftrace.c linux-libre-4.13-rc7-gnu/kernel/trace/ftrace.c
--- linux-libre-4.13-rc6-gnu/kernel/trace/ftrace.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/trace/ftrace.c	2017-08-27 20:20:40.000000000 -0400
@@ -889,6 +889,10 @@ static int profile_graph_entry(struct ft
 
 	function_profile_call(trace->func, 0, NULL, NULL);
 
+	/* If function graph is shutting down, ret_stack can be NULL */
+	if (!current->ret_stack)
+		return 0;
+
 	if (index >= 0 && index < FTRACE_RETFUNC_DEPTH)
 		current->ret_stack[index].subtime = 0;
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/trace/ring_buffer_benchmark.c linux-libre-4.13-rc7-gnu/kernel/trace/ring_buffer_benchmark.c
--- linux-libre-4.13-rc6-gnu/kernel/trace/ring_buffer_benchmark.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/trace/ring_buffer_benchmark.c	2017-08-27 20:20:40.000000000 -0400
@@ -113,7 +113,7 @@ static enum event_status read_page(int c
 	int i;
 
 	bpage = ring_buffer_alloc_read_page(buffer, cpu);
-	if (!bpage)
+	if (IS_ERR(bpage))
 		return EVENT_DROPPED;
 
 	ret = ring_buffer_read_page(buffer, &bpage, PAGE_SIZE, cpu, 1);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/trace/ring_buffer.c linux-libre-4.13-rc7-gnu/kernel/trace/ring_buffer.c
--- linux-libre-4.13-rc6-gnu/kernel/trace/ring_buffer.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/trace/ring_buffer.c	2017-08-27 20:20:40.000000000 -0400
@@ -4386,15 +4386,19 @@ EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu);
  * the page that was allocated, with the read page of the buffer.
  *
  * Returns:
- *  The page allocated, or NULL on error.
+ *  The page allocated, or ERR_PTR
  */
 void *ring_buffer_alloc_read_page(struct ring_buffer *buffer, int cpu)
 {
-	struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
+	struct ring_buffer_per_cpu *cpu_buffer;
 	struct buffer_data_page *bpage = NULL;
 	unsigned long flags;
 	struct page *page;
 
+	if (!cpumask_test_cpu(cpu, buffer->cpumask))
+		return ERR_PTR(-ENODEV);
+
+	cpu_buffer = buffer->buffers[cpu];
 	local_irq_save(flags);
 	arch_spin_lock(&cpu_buffer->lock);
 
@@ -4412,7 +4416,7 @@ void *ring_buffer_alloc_read_page(struct
 	page = alloc_pages_node(cpu_to_node(cpu),
 				GFP_KERNEL | __GFP_NORETRY, 0);
 	if (!page)
-		return NULL;
+		return ERR_PTR(-ENOMEM);
 
 	bpage = page_address(page);
 
@@ -4467,8 +4471,8 @@ EXPORT_SYMBOL_GPL(ring_buffer_free_read_
  *
  * for example:
  *	rpage = ring_buffer_alloc_read_page(buffer, cpu);
- *	if (!rpage)
- *		return error;
+ *	if (IS_ERR(rpage))
+ *		return PTR_ERR(rpage);
  *	ret = ring_buffer_read_page(buffer, &rpage, len, cpu, 0);
  *	if (ret >= 0)
  *		process_page(rpage, ret);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/trace/trace.c linux-libre-4.13-rc7-gnu/kernel/trace/trace.c
--- linux-libre-4.13-rc6-gnu/kernel/trace/trace.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/trace/trace.c	2017-08-27 20:20:40.000000000 -0400
@@ -6598,7 +6598,7 @@ tracing_buffers_read(struct file *filp,
 {
 	struct ftrace_buffer_info *info = filp->private_data;
 	struct trace_iterator *iter = &info->iter;
-	ssize_t ret;
+	ssize_t ret = 0;
 	ssize_t size;
 
 	if (!count)
@@ -6612,10 +6612,15 @@ tracing_buffers_read(struct file *filp,
 	if (!info->spare) {
 		info->spare = ring_buffer_alloc_read_page(iter->trace_buffer->buffer,
 							  iter->cpu_file);
-		info->spare_cpu = iter->cpu_file;
+		if (IS_ERR(info->spare)) {
+			ret = PTR_ERR(info->spare);
+			info->spare = NULL;
+		} else {
+			info->spare_cpu = iter->cpu_file;
+		}
 	}
 	if (!info->spare)
-		return -ENOMEM;
+		return ret;
 
 	/* Do we have previous read data to read? */
 	if (info->read < PAGE_SIZE)
@@ -6790,8 +6795,9 @@ tracing_buffers_splice_read(struct file
 		ref->ref = 1;
 		ref->buffer = iter->trace_buffer->buffer;
 		ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file);
-		if (!ref->page) {
-			ret = -ENOMEM;
+		if (IS_ERR(ref->page)) {
+			ret = PTR_ERR(ref->page);
+			ref->page = NULL;
 			kfree(ref);
 			break;
 		}
@@ -8293,6 +8299,7 @@ __init static int tracer_alloc_buffers(v
 	if (ret < 0)
 		goto out_free_cpumask;
 	/* Used for event triggers */
+	ret = -ENOMEM;
 	temp_buffer = ring_buffer_alloc(PAGE_SIZE, RB_FL_OVERWRITE);
 	if (!temp_buffer)
 		goto out_rm_hp_state;
@@ -8407,4 +8414,4 @@ __init static int clear_boot_tracer(void
 }
 
 fs_initcall(tracer_init_tracefs);
-late_initcall(clear_boot_tracer);
+late_initcall_sync(clear_boot_tracer);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/trace/trace_events_filter.c linux-libre-4.13-rc7-gnu/kernel/trace/trace_events_filter.c
--- linux-libre-4.13-rc6-gnu/kernel/trace/trace_events_filter.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/trace/trace_events_filter.c	2017-08-27 20:20:40.000000000 -0400
@@ -1959,6 +1959,10 @@ static int create_filter(struct trace_ev
 		if (err && set_str)
 			append_filter_err(ps, filter);
 	}
+	if (err && !set_str) {
+		free_event_filter(filter);
+		filter = NULL;
+	}
 	create_filter_finish(ps);
 
 	*filterp = filter;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/kernel/trace/tracing_map.c linux-libre-4.13-rc7-gnu/kernel/trace/tracing_map.c
--- linux-libre-4.13-rc6-gnu/kernel/trace/tracing_map.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/kernel/trace/tracing_map.c	2017-08-27 20:20:40.000000000 -0400
@@ -221,16 +221,19 @@ void tracing_map_array_free(struct traci
 	if (!a)
 		return;
 
-	if (!a->pages) {
-		kfree(a);
-		return;
-	}
+	if (!a->pages)
+		goto free;
 
 	for (i = 0; i < a->n_pages; i++) {
 		if (!a->pages[i])
 			break;
 		free_page((unsigned long)a->pages[i]);
 	}
+
+	kfree(a->pages);
+
+ free:
+	kfree(a);
 }
 
 struct tracing_map_array *tracing_map_array_alloc(unsigned int n_elts,
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/Makefile linux-libre-4.13-rc7-gnu/Makefile
--- linux-libre-4.13-rc6-gnu/Makefile	2017-08-27 02:25:00.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/Makefile	2017-08-27 21:40:17.000000000 -0400
@@ -1,7 +1,7 @@
 VERSION = 4
 PATCHLEVEL = 13
 SUBLEVEL = 0
-EXTRAVERSION = -rc6-gnu
+EXTRAVERSION = -rc7-gnu
 NAME = Fearless Coyote
 
 # *DOCUMENTATION*
@@ -396,7 +396,7 @@ LINUXINCLUDE    := \
 KBUILD_CPPFLAGS := -D__KERNEL__
 
 KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-		   -fno-strict-aliasing -fno-common \
+		   -fno-strict-aliasing -fno-common -fshort-wchar \
 		   -Werror-implicit-function-declaration \
 		   -Wno-format-security \
 		   -std=gnu89 $(call cc-option,-fno-PIE)
@@ -442,7 +442,7 @@ export RCS_TAR_IGNORE := --exclude SCCS
 # ===========================================================================
 # Rules shared between *config targets and build targets
 
-# Basic helpers built in scripts/
+# Basic helpers built in scripts/basic/
 PHONY += scripts_basic
 scripts_basic:
 	$(Q)$(MAKE) $(build)=scripts/basic
@@ -505,7 +505,7 @@ ifeq ($(KBUILD_EXTMOD),)
                 endif
         endif
 endif
-# install and module_install need also be processed one by one
+# install and modules_install need also be processed one by one
 ifneq ($(filter install,$(MAKECMDGOALS)),)
         ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
 	        mixed-targets := 1
@@ -964,7 +964,7 @@ export KBUILD_VMLINUX_MAIN := $(core-y)
 export KBUILD_VMLINUX_LIBS := $(libs-y1)
 export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds
 export LDFLAGS_vmlinux
-# used by scripts/pacmage/Makefile
+# used by scripts/package/Makefile
 export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools)
 
 vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) $(KBUILD_VMLINUX_LIBS)
@@ -992,8 +992,8 @@ include/generated/autoksyms.h: FORCE
 ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
 
 # Final link of vmlinux with optional arch pass after final link
-    cmd_link-vmlinux =                                                 \
-	$(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) ;       \
+cmd_link-vmlinux =                                                 \
+	$(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) ;    \
 	$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
 
 vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE
@@ -1184,6 +1184,7 @@ PHONY += kselftest
 kselftest:
 	$(Q)$(MAKE) -C tools/testing/selftests run_tests
 
+PHONY += kselftest-clean
 kselftest-clean:
 	$(Q)$(MAKE) -C tools/testing/selftests clean
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/mm/filemap.c linux-libre-4.13-rc7-gnu/mm/filemap.c
--- linux-libre-4.13-rc6-gnu/mm/filemap.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/mm/filemap.c	2017-08-27 20:20:40.000000000 -0400
@@ -885,6 +885,7 @@ void __init pagecache_init(void)
 	page_writeback_init();
 }
 
+/* This has the same layout as wait_bit_key - see fs/cachefiles/rdwr.c */
 struct wait_page_key {
 	struct page *page;
 	int bit_nr;
@@ -909,8 +910,10 @@ static int wake_page_function(wait_queue
 
 	if (wait_page->bit_nr != key->bit_nr)
 		return 0;
+
+	/* Stop walking if it's locked */
 	if (test_bit(key->bit_nr, &key->page->flags))
-		return 0;
+		return -1;
 
 	return autoremove_wake_function(wait, mode, sync, key);
 }
@@ -964,6 +967,7 @@ static inline int wait_on_page_bit_commo
 	int ret = 0;
 
 	init_wait(wait);
+	wait->flags = lock ? WQ_FLAG_EXCLUSIVE : 0;
 	wait->func = wake_page_function;
 	wait_page.page = page;
 	wait_page.bit_nr = bit_nr;
@@ -972,10 +976,7 @@ static inline int wait_on_page_bit_commo
 		spin_lock_irq(&q->lock);
 
 		if (likely(list_empty(&wait->entry))) {
-			if (lock)
-				__add_wait_queue_entry_tail_exclusive(q, wait);
-			else
-				__add_wait_queue(q, wait);
+			__add_wait_queue_entry_tail(q, wait);
 			SetPageWaiters(page);
 		}
 
@@ -985,10 +986,6 @@ static inline int wait_on_page_bit_commo
 
 		if (likely(test_bit(bit_nr, &page->flags))) {
 			io_schedule();
-			if (unlikely(signal_pending_state(state, current))) {
-				ret = -EINTR;
-				break;
-			}
 		}
 
 		if (lock) {
@@ -998,6 +995,11 @@ static inline int wait_on_page_bit_commo
 			if (!test_bit(bit_nr, &page->flags))
 				break;
 		}
+
+		if (unlikely(signal_pending_state(state, current))) {
+			ret = -EINTR;
+			break;
+		}
 	}
 
 	finish_wait(q, wait);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/mm/madvise.c linux-libre-4.13-rc7-gnu/mm/madvise.c
--- linux-libre-4.13-rc6-gnu/mm/madvise.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/mm/madvise.c	2017-08-27 20:20:40.000000000 -0400
@@ -368,8 +368,8 @@ static int madvise_free_pte_range(pmd_t
 				pte_offset_map_lock(mm, pmd, addr, &ptl);
 				goto out;
 			}
-			put_page(page);
 			unlock_page(page);
+			put_page(page);
 			pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
 			pte--;
 			addr -= PAGE_SIZE;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/mm/memblock.c linux-libre-4.13-rc7-gnu/mm/memblock.c
--- linux-libre-4.13-rc6-gnu/mm/memblock.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/mm/memblock.c	2017-08-27 20:20:40.000000000 -0400
@@ -299,7 +299,7 @@ void __init memblock_discard(void)
 		__memblock_free_late(addr, size);
 	}
 
-	if (memblock.memory.regions == memblock_memory_init_regions) {
+	if (memblock.memory.regions != memblock_memory_init_regions) {
 		addr = __pa(memblock.memory.regions);
 		size = PAGE_ALIGN(sizeof(struct memblock_region) *
 				  memblock.memory.max);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/mm/page_alloc.c linux-libre-4.13-rc7-gnu/mm/page_alloc.c
--- linux-libre-4.13-rc6-gnu/mm/page_alloc.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/mm/page_alloc.c	2017-08-27 20:20:40.000000000 -0400
@@ -66,6 +66,7 @@
 #include <linux/kthread.h>
 #include <linux/memcontrol.h>
 #include <linux/ftrace.h>
+#include <linux/nmi.h>
 
 #include <asm/sections.h>
 #include <asm/tlbflush.h>
@@ -2535,9 +2536,14 @@ void drain_all_pages(struct zone *zone)
 
 #ifdef CONFIG_HIBERNATION
 
+/*
+ * Touch the watchdog for every WD_PAGE_COUNT pages.
+ */
+#define WD_PAGE_COUNT	(128*1024)
+
 void mark_free_pages(struct zone *zone)
 {
-	unsigned long pfn, max_zone_pfn;
+	unsigned long pfn, max_zone_pfn, page_count = WD_PAGE_COUNT;
 	unsigned long flags;
 	unsigned int order, t;
 	struct page *page;
@@ -2552,6 +2558,11 @@ void mark_free_pages(struct zone *zone)
 		if (pfn_valid(pfn)) {
 			page = pfn_to_page(pfn);
 
+			if (!--page_count) {
+				touch_nmi_watchdog();
+				page_count = WD_PAGE_COUNT;
+			}
+
 			if (page_zone(page) != zone)
 				continue;
 
@@ -2565,8 +2576,13 @@ void mark_free_pages(struct zone *zone)
 			unsigned long i;
 
 			pfn = page_to_pfn(page);
-			for (i = 0; i < (1UL << order); i++)
+			for (i = 0; i < (1UL << order); i++) {
+				if (!--page_count) {
+					touch_nmi_watchdog();
+					page_count = WD_PAGE_COUNT;
+				}
 				swsusp_set_page_free(pfn_to_page(pfn + i));
+			}
 		}
 	}
 	spin_unlock_irqrestore(&zone->lock, flags);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/mm/shmem.c linux-libre-4.13-rc7-gnu/mm/shmem.c
--- linux-libre-4.13-rc6-gnu/mm/shmem.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/mm/shmem.c	2017-08-27 20:20:40.000000000 -0400
@@ -3967,7 +3967,7 @@ int __init shmem_init(void)
 	}
 
 #ifdef CONFIG_TRANSPARENT_HUGE_PAGECACHE
-	if (has_transparent_hugepage() && shmem_huge < SHMEM_HUGE_DENY)
+	if (has_transparent_hugepage() && shmem_huge > SHMEM_HUGE_DENY)
 		SHMEM_SB(shm_mnt->mnt_sb)->huge = shmem_huge;
 	else
 		shmem_huge = 0; /* just in case it was patched */
@@ -4028,7 +4028,7 @@ static ssize_t shmem_enabled_store(struc
 		return -EINVAL;
 
 	shmem_huge = huge;
-	if (shmem_huge < SHMEM_HUGE_DENY)
+	if (shmem_huge > SHMEM_HUGE_DENY)
 		SHMEM_SB(shm_mnt->mnt_sb)->huge = shmem_huge;
 	return count;
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/core/datagram.c linux-libre-4.13-rc7-gnu/net/core/datagram.c
--- linux-libre-4.13-rc6-gnu/net/core/datagram.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/core/datagram.c	2017-08-27 20:20:40.000000000 -0400
@@ -169,14 +169,20 @@ struct sk_buff *__skb_try_recv_from_queu
 					  int *peeked, int *off, int *err,
 					  struct sk_buff **last)
 {
+	bool peek_at_off = false;
 	struct sk_buff *skb;
-	int _off = *off;
+	int _off = 0;
+
+	if (unlikely(flags & MSG_PEEK && *off >= 0)) {
+		peek_at_off = true;
+		_off = *off;
+	}
 
 	*last = queue->prev;
 	skb_queue_walk(queue, skb) {
 		if (flags & MSG_PEEK) {
-			if (_off >= skb->len && (skb->len || _off ||
-						 skb->peeked)) {
+			if (peek_at_off && _off >= skb->len &&
+			    (_off || skb->peeked)) {
 				_off -= skb->len;
 				continue;
 			}
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/dccp/proto.c linux-libre-4.13-rc7-gnu/net/dccp/proto.c
--- linux-libre-4.13-rc6-gnu/net/dccp/proto.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/dccp/proto.c	2017-08-27 20:20:40.000000000 -0400
@@ -24,6 +24,7 @@
 #include <net/checksum.h>
 
 #include <net/inet_sock.h>
+#include <net/inet_common.h>
 #include <net/sock.h>
 #include <net/xfrm.h>
 
@@ -170,6 +171,15 @@ const char *dccp_packet_name(const int t
 
 EXPORT_SYMBOL_GPL(dccp_packet_name);
 
+static void dccp_sk_destruct(struct sock *sk)
+{
+	struct dccp_sock *dp = dccp_sk(sk);
+
+	ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk);
+	dp->dccps_hc_tx_ccid = NULL;
+	inet_sock_destruct(sk);
+}
+
 int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized)
 {
 	struct dccp_sock *dp = dccp_sk(sk);
@@ -179,6 +189,7 @@ int dccp_init_sock(struct sock *sk, cons
 	icsk->icsk_syn_retries	= sysctl_dccp_request_retries;
 	sk->sk_state		= DCCP_CLOSED;
 	sk->sk_write_space	= dccp_write_space;
+	sk->sk_destruct		= dccp_sk_destruct;
 	icsk->icsk_sync_mss	= dccp_sync_mss;
 	dp->dccps_mss_cache	= 536;
 	dp->dccps_rate_last	= jiffies;
@@ -219,8 +230,7 @@ void dccp_destroy_sock(struct sock *sk)
 		dp->dccps_hc_rx_ackvec = NULL;
 	}
 	ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk);
-	ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk);
-	dp->dccps_hc_rx_ccid = dp->dccps_hc_tx_ccid = NULL;
+	dp->dccps_hc_rx_ccid = NULL;
 
 	/* clean up feature negotiation state */
 	dccp_feat_list_purge(&dp->dccps_featneg);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/ipv4/igmp.c linux-libre-4.13-rc7-gnu/net/ipv4/igmp.c
--- linux-libre-4.13-rc6-gnu/net/ipv4/igmp.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/ipv4/igmp.c	2017-08-27 20:20:40.000000000 -0400
@@ -1007,10 +1007,18 @@ int igmp_rcv(struct sk_buff *skb)
 {
 	/* This basically follows the spec line by line -- see RFC1112 */
 	struct igmphdr *ih;
-	struct in_device *in_dev = __in_dev_get_rcu(skb->dev);
+	struct net_device *dev = skb->dev;
+	struct in_device *in_dev;
 	int len = skb->len;
 	bool dropped = true;
 
+	if (netif_is_l3_master(dev)) {
+		dev = dev_get_by_index_rcu(dev_net(dev), IPCB(skb)->iif);
+		if (!dev)
+			goto drop;
+	}
+
+	in_dev = __in_dev_get_rcu(dev);
 	if (!in_dev)
 		goto drop;
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/ipv4/route.c linux-libre-4.13-rc7-gnu/net/ipv4/route.c
--- linux-libre-4.13-rc6-gnu/net/ipv4/route.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/ipv4/route.c	2017-08-27 20:20:40.000000000 -0400
@@ -1267,7 +1267,7 @@ static unsigned int ipv4_mtu(const struc
 	if (mtu)
 		return mtu;
 
-	mtu = dst->dev->mtu;
+	mtu = READ_ONCE(dst->dev->mtu);
 
 	if (unlikely(dst_metric_locked(dst, RTAX_MTU))) {
 		if (rt->rt_uses_gateway && mtu > 576)
@@ -2763,14 +2763,21 @@ static int inet_rtm_getroute(struct sk_b
 	if (rtm->rtm_flags & RTM_F_LOOKUP_TABLE)
 		table_id = rt->rt_table_id;
 
-	if (rtm->rtm_flags & RTM_F_FIB_MATCH)
+	if (rtm->rtm_flags & RTM_F_FIB_MATCH) {
+		if (!res.fi) {
+			err = fib_props[res.type].error;
+			if (!err)
+				err = -EHOSTUNREACH;
+			goto errout_free;
+		}
 		err = fib_dump_info(skb, NETLINK_CB(in_skb).portid,
 				    nlh->nlmsg_seq, RTM_NEWROUTE, table_id,
 				    rt->rt_type, res.prefix, res.prefixlen,
 				    fl4.flowi4_tos, res.fi, 0);
-	else
+	} else {
 		err = rt_fill_info(net, dst, src, table_id, &fl4, skb,
 				   NETLINK_CB(in_skb).portid, nlh->nlmsg_seq);
+	}
 	if (err < 0)
 		goto errout_free;
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/ipv4/tcp_input.c linux-libre-4.13-rc7-gnu/net/ipv4/tcp_input.c
--- linux-libre-4.13-rc6-gnu/net/ipv4/tcp_input.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/ipv4/tcp_input.c	2017-08-27 20:20:40.000000000 -0400
@@ -3009,8 +3009,7 @@ void tcp_rearm_rto(struct sock *sk)
 			/* delta_us may not be positive if the socket is locked
 			 * when the retrans timer fires and is rescheduled.
 			 */
-			if (delta_us > 0)
-				rto = usecs_to_jiffies(delta_us);
+			rto = usecs_to_jiffies(max_t(int, delta_us, 1));
 		}
 		inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, rto,
 					  TCP_RTO_MAX);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/ipv4/udp.c linux-libre-4.13-rc7-gnu/net/ipv4/udp.c
--- linux-libre-4.13-rc6-gnu/net/ipv4/udp.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/ipv4/udp.c	2017-08-27 20:20:40.000000000 -0400
@@ -1574,7 +1574,8 @@ int udp_recvmsg(struct sock *sk, struct
 		return ip_recv_error(sk, msg, len, addr_len);
 
 try_again:
-	peeking = off = sk_peek_offset(sk, flags);
+	peeking = flags & MSG_PEEK;
+	off = sk_peek_offset(sk, flags);
 	skb = __skb_recv_udp(sk, flags, noblock, &peeked, &off, &err);
 	if (!skb)
 		return err;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/ipv6/ip6_fib.c linux-libre-4.13-rc7-gnu/net/ipv6/ip6_fib.c
--- linux-libre-4.13-rc6-gnu/net/ipv6/ip6_fib.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/ipv6/ip6_fib.c	2017-08-27 20:20:40.000000000 -0400
@@ -914,6 +914,8 @@ add:
 		}
 		nsiblings = iter->rt6i_nsiblings;
 		fib6_purge_rt(iter, fn, info->nl_net);
+		if (fn->rr_ptr == iter)
+			fn->rr_ptr = NULL;
 		rt6_release(iter);
 
 		if (nsiblings) {
@@ -926,6 +928,8 @@ add:
 				if (rt6_qualify_for_ecmp(iter)) {
 					*ins = iter->dst.rt6_next;
 					fib6_purge_rt(iter, fn, info->nl_net);
+					if (fn->rr_ptr == iter)
+						fn->rr_ptr = NULL;
 					rt6_release(iter);
 					nsiblings--;
 				} else {
@@ -1014,7 +1018,7 @@ int fib6_add(struct fib6_node *root, str
 			/* Create subtree root node */
 			sfn = node_alloc();
 			if (!sfn)
-				goto st_failure;
+				goto failure;
 
 			sfn->leaf = info->nl_net->ipv6.ip6_null_entry;
 			atomic_inc(&info->nl_net->ipv6.ip6_null_entry->rt6i_ref);
@@ -1031,12 +1035,12 @@ int fib6_add(struct fib6_node *root, str
 
 			if (IS_ERR(sn)) {
 				/* If it is failed, discard just allocated
-				   root, and then (in st_failure) stale node
+				   root, and then (in failure) stale node
 				   in main tree.
 				 */
 				node_free(sfn);
 				err = PTR_ERR(sn);
-				goto st_failure;
+				goto failure;
 			}
 
 			/* Now link new subtree to main tree */
@@ -1051,7 +1055,7 @@ int fib6_add(struct fib6_node *root, str
 
 			if (IS_ERR(sn)) {
 				err = PTR_ERR(sn);
-				goto st_failure;
+				goto failure;
 			}
 		}
 
@@ -1092,18 +1096,17 @@ out:
 			atomic_inc(&pn->leaf->rt6i_ref);
 		}
 #endif
-		/* Always release dst as dst->__refcnt is guaranteed
-		 * to be taken before entering this function
-		 */
-		dst_release_immediate(&rt->dst);
+		goto failure;
 	}
 	return err;
 
-#ifdef CONFIG_IPV6_SUBTREES
-	/* Subtree creation failed, probably main tree node
-	   is orphan. If it is, shoot it.
+failure:
+	/* fn->leaf could be NULL if fn is an intermediate node and we
+	 * failed to add the new route to it in both subtree creation
+	 * failure and fib6_add_rt2node() failure case.
+	 * In both cases, fib6_repair_tree() should be called to fix
+	 * fn->leaf.
 	 */
-st_failure:
 	if (fn && !(fn->fn_flags & (RTN_RTINFO|RTN_ROOT)))
 		fib6_repair_tree(info->nl_net, fn);
 	/* Always release dst as dst->__refcnt is guaranteed
@@ -1111,7 +1114,6 @@ st_failure:
 	 */
 	dst_release_immediate(&rt->dst);
 	return err;
-#endif
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/ipv6/udp.c linux-libre-4.13-rc7-gnu/net/ipv6/udp.c
--- linux-libre-4.13-rc6-gnu/net/ipv6/udp.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/ipv6/udp.c	2017-08-27 20:20:40.000000000 -0400
@@ -362,7 +362,8 @@ int udpv6_recvmsg(struct sock *sk, struc
 		return ipv6_recv_rxpmtu(sk, msg, len, addr_len);
 
 try_again:
-	peeking = off = sk_peek_offset(sk, flags);
+	peeking = flags & MSG_PEEK;
+	off = sk_peek_offset(sk, flags);
 	skb = __skb_recv_udp(sk, flags, noblock, &peeked, &off, &err);
 	if (!skb)
 		return err;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/irda/af_irda.c linux-libre-4.13-rc7-gnu/net/irda/af_irda.c
--- linux-libre-4.13-rc6-gnu/net/irda/af_irda.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/irda/af_irda.c	2017-08-27 20:20:40.000000000 -0400
@@ -2213,7 +2213,7 @@ static int irda_getsockopt(struct socket
 {
 	struct sock *sk = sock->sk;
 	struct irda_sock *self = irda_sk(sk);
-	struct irda_device_list list;
+	struct irda_device_list list = { 0 };
 	struct irda_device_info *discoveries;
 	struct irda_ias_set *	ias_opt;	/* IAS get/query params */
 	struct ias_object *	ias_obj;	/* Object in IAS */
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/openvswitch/actions.c linux-libre-4.13-rc7-gnu/net/openvswitch/actions.c
--- linux-libre-4.13-rc6-gnu/net/openvswitch/actions.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/openvswitch/actions.c	2017-08-27 20:20:40.000000000 -0400
@@ -1337,6 +1337,7 @@ int ovs_execute_actions(struct datapath
 		goto out;
 	}
 
+	OVS_CB(skb)->acts_origlen = acts->orig_len;
 	err = do_execute_actions(dp, skb, key,
 				 acts->actions, acts->actions_len);
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/openvswitch/datapath.c linux-libre-4.13-rc7-gnu/net/openvswitch/datapath.c
--- linux-libre-4.13-rc6-gnu/net/openvswitch/datapath.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/openvswitch/datapath.c	2017-08-27 20:20:40.000000000 -0400
@@ -381,7 +381,7 @@ static int queue_gso_packets(struct data
 }
 
 static size_t upcall_msg_size(const struct dp_upcall_info *upcall_info,
-			      unsigned int hdrlen)
+			      unsigned int hdrlen, int actions_attrlen)
 {
 	size_t size = NLMSG_ALIGN(sizeof(struct ovs_header))
 		+ nla_total_size(hdrlen) /* OVS_PACKET_ATTR_PACKET */
@@ -398,7 +398,7 @@ static size_t upcall_msg_size(const stru
 
 	/* OVS_PACKET_ATTR_ACTIONS */
 	if (upcall_info->actions_len)
-		size += nla_total_size(upcall_info->actions_len);
+		size += nla_total_size(actions_attrlen);
 
 	/* OVS_PACKET_ATTR_MRU */
 	if (upcall_info->mru)
@@ -465,7 +465,8 @@ static int queue_userspace_packet(struct
 	else
 		hlen = skb->len;
 
-	len = upcall_msg_size(upcall_info, hlen - cutlen);
+	len = upcall_msg_size(upcall_info, hlen - cutlen,
+			      OVS_CB(skb)->acts_origlen);
 	user_skb = genlmsg_new(len, GFP_ATOMIC);
 	if (!user_skb) {
 		err = -ENOMEM;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/openvswitch/datapath.h linux-libre-4.13-rc7-gnu/net/openvswitch/datapath.h
--- linux-libre-4.13-rc6-gnu/net/openvswitch/datapath.h	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/openvswitch/datapath.h	2017-08-27 20:20:40.000000000 -0400
@@ -99,11 +99,13 @@ struct datapath {
  * when a packet is received by OVS.
  * @mru: The maximum received fragement size; 0 if the packet is not
  * fragmented.
+ * @acts_origlen: The netlink size of the flow actions applied to this skb.
  * @cutlen: The number of bytes from the packet end to be removed.
  */
 struct ovs_skb_cb {
 	struct vport		*input_vport;
 	u16			mru;
+	u16			acts_origlen;
 	u32			cutlen;
 };
 #define OVS_CB(skb) ((struct ovs_skb_cb *)(skb)->cb)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/rxrpc/call_accept.c linux-libre-4.13-rc7-gnu/net/rxrpc/call_accept.c
--- linux-libre-4.13-rc6-gnu/net/rxrpc/call_accept.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/rxrpc/call_accept.c	2017-08-27 20:20:40.000000000 -0400
@@ -223,6 +223,7 @@ void rxrpc_discard_prealloc(struct rxrpc
 	tail = b->call_backlog_tail;
 	while (CIRC_CNT(head, tail, size) > 0) {
 		struct rxrpc_call *call = b->call_backlog[tail];
+		call->socket = rx;
 		if (rx->discard_new_call) {
 			_debug("discard %lx", call->user_call_ID);
 			rx->discard_new_call(call, call->user_call_ID);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/sched/act_ipt.c linux-libre-4.13-rc7-gnu/net/sched/act_ipt.c
--- linux-libre-4.13-rc6-gnu/net/sched/act_ipt.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/sched/act_ipt.c	2017-08-27 20:20:40.000000000 -0400
@@ -41,6 +41,7 @@ static int ipt_init_target(struct net *n
 {
 	struct xt_tgchk_param par;
 	struct xt_target *target;
+	struct ipt_entry e = {};
 	int ret = 0;
 
 	target = xt_request_find_target(AF_INET, t->u.user.name,
@@ -52,6 +53,7 @@ static int ipt_init_target(struct net *n
 	memset(&par, 0, sizeof(par));
 	par.net       = net;
 	par.table     = table;
+	par.entryinfo = &e;
 	par.target    = target;
 	par.targinfo  = t->data;
 	par.hook_mask = hook;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/sched/cls_api.c linux-libre-4.13-rc7-gnu/net/sched/cls_api.c
--- linux-libre-4.13-rc6-gnu/net/sched/cls_api.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/sched/cls_api.c	2017-08-27 20:20:40.000000000 -0400
@@ -205,7 +205,7 @@ static void tcf_chain_flush(struct tcf_c
 {
 	struct tcf_proto *tp;
 
-	if (*chain->p_filter_chain)
+	if (chain->p_filter_chain)
 		RCU_INIT_POINTER(*chain->p_filter_chain, NULL);
 	while ((tp = rtnl_dereference(chain->filter_chain)) != NULL) {
 		RCU_INIT_POINTER(chain->filter_chain, tp->next);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/sctp/ipv6.c linux-libre-4.13-rc7-gnu/net/sctp/ipv6.c
--- linux-libre-4.13-rc6-gnu/net/sctp/ipv6.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/sctp/ipv6.c	2017-08-27 20:20:40.000000000 -0400
@@ -512,7 +512,9 @@ static void sctp_v6_to_addr(union sctp_a
 {
 	addr->sa.sa_family = AF_INET6;
 	addr->v6.sin6_port = port;
+	addr->v6.sin6_flowinfo = 0;
 	addr->v6.sin6_addr = *saddr;
+	addr->v6.sin6_scope_id = 0;
 }
 
 /* Compare addresses exactly.
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/sunrpc/svcsock.c linux-libre-4.13-rc7-gnu/net/sunrpc/svcsock.c
--- linux-libre-4.13-rc6-gnu/net/sunrpc/svcsock.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/sunrpc/svcsock.c	2017-08-27 20:20:40.000000000 -0400
@@ -421,6 +421,9 @@ static void svc_data_ready(struct sock *
 		dprintk("svc: socket %p(inet %p), busy=%d\n",
 			svsk, sk,
 			test_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags));
+
+		/* Refer to svc_setup_socket() for details. */
+		rmb();
 		svsk->sk_odata(sk);
 		if (!test_and_set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags))
 			svc_xprt_enqueue(&svsk->sk_xprt);
@@ -437,6 +440,9 @@ static void svc_write_space(struct sock
 	if (svsk) {
 		dprintk("svc: socket %p(inet %p), write_space busy=%d\n",
 			svsk, sk, test_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags));
+
+		/* Refer to svc_setup_socket() for details. */
+		rmb();
 		svsk->sk_owspace(sk);
 		svc_xprt_enqueue(&svsk->sk_xprt);
 	}
@@ -760,8 +766,12 @@ static void svc_tcp_listen_data_ready(st
 	dprintk("svc: socket %p TCP (listen) state change %d\n",
 		sk, sk->sk_state);
 
-	if (svsk)
+	if (svsk) {
+		/* Refer to svc_setup_socket() for details. */
+		rmb();
 		svsk->sk_odata(sk);
+	}
+
 	/*
 	 * This callback may called twice when a new connection
 	 * is established as a child socket inherits everything
@@ -794,6 +804,8 @@ static void svc_tcp_state_change(struct
 	if (!svsk)
 		printk("svc: socket %p: no user data\n", sk);
 	else {
+		/* Refer to svc_setup_socket() for details. */
+		rmb();
 		svsk->sk_ostate(sk);
 		if (sk->sk_state != TCP_ESTABLISHED) {
 			set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
@@ -1381,12 +1393,18 @@ static struct svc_sock *svc_setup_socket
 		return ERR_PTR(err);
 	}
 
-	inet->sk_user_data = svsk;
 	svsk->sk_sock = sock;
 	svsk->sk_sk = inet;
 	svsk->sk_ostate = inet->sk_state_change;
 	svsk->sk_odata = inet->sk_data_ready;
 	svsk->sk_owspace = inet->sk_write_space;
+	/*
+	 * This barrier is necessary in order to prevent race condition
+	 * with svc_data_ready(), svc_listen_data_ready() and others
+	 * when calling callbacks above.
+	 */
+	wmb();
+	inet->sk_user_data = svsk;
 
 	/* Initialize the socket */
 	if (sock->type == SOCK_DGRAM)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/tipc/netlink_compat.c linux-libre-4.13-rc7-gnu/net/tipc/netlink_compat.c
--- linux-libre-4.13-rc6-gnu/net/tipc/netlink_compat.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/tipc/netlink_compat.c	2017-08-27 20:20:40.000000000 -0400
@@ -258,13 +258,15 @@ static int tipc_nl_compat_dumpit(struct
 	arg = nlmsg_new(0, GFP_KERNEL);
 	if (!arg) {
 		kfree_skb(msg->rep);
+		msg->rep = NULL;
 		return -ENOMEM;
 	}
 
 	err = __tipc_nl_compat_dumpit(cmd, msg, arg);
-	if (err)
+	if (err) {
 		kfree_skb(msg->rep);
-
+		msg->rep = NULL;
+	}
 	kfree_skb(arg);
 
 	return err;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/net/unix/af_unix.c linux-libre-4.13-rc7-gnu/net/unix/af_unix.c
--- linux-libre-4.13-rc6-gnu/net/unix/af_unix.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/net/unix/af_unix.c	2017-08-27 20:20:40.000000000 -0400
@@ -2304,10 +2304,7 @@ static int unix_stream_read_generic(stru
 	 */
 	mutex_lock(&u->iolock);
 
-	if (flags & MSG_PEEK)
-		skip = sk_peek_offset(sk, flags);
-	else
-		skip = 0;
+	skip = max(sk_peek_offset(sk, flags), 0);
 
 	do {
 		int chunk;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/scripts/basic/fixdep.c linux-libre-4.13-rc7-gnu/scripts/basic/fixdep.c
--- linux-libre-4.13-rc6-gnu/scripts/basic/fixdep.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/scripts/basic/fixdep.c	2017-08-27 20:20:40.000000000 -0400
@@ -25,7 +25,7 @@
  *
  * So we play the same trick that "mkdep" played before. We replace
  * the dependency on autoconf.h by a dependency on every config
- * option which is mentioned in any of the listed prequisites.
+ * option which is mentioned in any of the listed prerequisites.
  *
  * kconfig populates a tree in include/config/ with an empty file
  * for each config symbol and when the configuration is updated
@@ -34,7 +34,7 @@
  * the config symbols are rebuilt.
  *
  * So if the user changes his CONFIG_HIS_DRIVER option, only the objects
- * which depend on "include/linux/config/his/driver.h" will be rebuilt,
+ * which depend on "include/config/his/driver.h" will be rebuilt,
  * so most likely only his driver ;-)
  *
  * The idea above dates, by the way, back to Michael E Chastain, AFAIK.
@@ -75,7 +75,7 @@
  * and then basically copies the .<target>.d file to stdout, in the
  * process filtering out the dependency on autoconf.h and adding
  * dependencies on include/config/my/option.h for every
- * CONFIG_MY_OPTION encountered in any of the prequisites.
+ * CONFIG_MY_OPTION encountered in any of the prerequisites.
  *
  * It will also filter out all the dependencies on *.ver. We need
  * to make sure that the generated version checksum are globally up
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/scripts/basic/Makefile linux-libre-4.13-rc7-gnu/scripts/basic/Makefile
--- linux-libre-4.13-rc6-gnu/scripts/basic/Makefile	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/scripts/basic/Makefile	2017-08-27 20:20:40.000000000 -0400
@@ -1,5 +1,5 @@
 ###
-# Makefile.basic lists the most basic programs used during the build process.
+# This Makefile lists the most basic programs used during the build process.
 # The programs listed herein are what are needed to do the basic stuff,
 # such as fix file dependencies.
 # This initial step is needed to avoid files to be recompiled
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/scripts/Kbuild.include linux-libre-4.13-rc7-gnu/scripts/Kbuild.include
--- linux-libre-4.13-rc6-gnu/scripts/Kbuild.include	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/scripts/Kbuild.include	2017-08-27 20:20:40.000000000 -0400
@@ -85,8 +85,8 @@ TMPOUT := $(if $(KBUILD_EXTMOD),$(firstw
 
 # try-run
 # Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
-# Exit code chooses option. "$$TMP" is can be used as temporary file and
-# is automatically cleaned up.
+# Exit code chooses option. "$$TMP" serves as a temporary file and is
+# automatically cleaned up.
 try-run = $(shell set -e;		\
 	TMP="$(TMPOUT).$$$$.tmp";	\
 	TMPO="$(TMPOUT).$$$$.o";	\
@@ -261,7 +261,6 @@ make-cmd = $(call escsq,$(subst \#,\\\#,
 any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
 
 # Execute command if command has changed or prerequisite(s) are updated.
-#
 if_changed = $(if $(strip $(any-prereq) $(arg-check)),                       \
 	@set -e;                                                             \
 	$(echo-cmd) $(cmd_$(1));                                             \
@@ -315,7 +314,7 @@ if_changed_rule = $(if $(strip $(any-pre
 	$(rule_$(1)), @:)
 
 ###
-# why - tell why a a target got build
+# why - tell why a target got built
 #       enabled by make V=2
 #       Output (listed in the order they are checked):
 #          (1) - due to target is PHONY
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/scripts/Makefile.asm-generic linux-libre-4.13-rc7-gnu/scripts/Makefile.asm-generic
--- linux-libre-4.13-rc6-gnu/scripts/Makefile.asm-generic	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/scripts/Makefile.asm-generic	2017-08-27 20:20:40.000000000 -0400
@@ -1,9 +1,9 @@
 # include/asm-generic contains a lot of files that are used
 # verbatim by several architectures.
 #
-# This Makefile reads the file arch/$(SRCARCH)/include/asm/Kbuild
+# This Makefile reads the file arch/$(SRCARCH)/include/$(src)/Kbuild
 # and for each file listed in this file with generic-y creates
-# a small wrapper file in $(obj) (arch/$(SRCARCH)/include/generated/asm)
+# a small wrapper file in $(obj) (arch/$(SRCARCH)/include/generated/$(src))
 
 kbuild-file := $(srctree)/arch/$(SRCARCH)/include/$(src)/Kbuild
 -include $(kbuild-file)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/scripts/Makefile.build linux-libre-4.13-rc7-gnu/scripts/Makefile.build
--- linux-libre-4.13-rc6-gnu/scripts/Makefile.build	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/scripts/Makefile.build	2017-08-27 20:20:40.000000000 -0400
@@ -229,8 +229,8 @@ ifeq ("$(origin RECORDMCOUNT_WARN)", "co
 endif
 # Due to recursion, we must skip empty.o.
 # The empty.o file is created in the make process in order to determine
-#  the target endianness and word size. It is made before all other C
-#  files, including recordmcount.
+# the target endianness and word size. It is made before all other C
+# files, including recordmcount.
 sub_cmd_record_mcount =					\
 	if [ $(@) != "scripts/mod/empty.o" ]; then	\
 		$(objtree)/scripts/recordmcount $(RECORDMCOUNT_FLAGS) "$(@)";	\
@@ -245,13 +245,13 @@ sub_cmd_record_mcount = set -e ; perl $(
 	"$(LD)" "$(NM)" "$(RM)" "$(MV)" \
 	"$(if $(part-of-module),1,0)" "$(@)";
 recordmcount_source := $(srctree)/scripts/recordmcount.pl
-endif
+endif # BUILD_C_RECORDMCOUNT
 cmd_record_mcount =						\
 	if [ "$(findstring $(CC_FLAGS_FTRACE),$(_c_flags))" =	\
 	     "$(CC_FLAGS_FTRACE)" ]; then			\
 		$(sub_cmd_record_mcount)			\
 	fi;
-endif
+endif # CONFIG_FTRACE_MCOUNT_RECORD
 
 ifdef CONFIG_STACK_VALIDATION
 ifneq ($(SKIP_STACK_VALIDATION),1)
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/scripts/Makefile.dtbinst linux-libre-4.13-rc7-gnu/scripts/Makefile.dtbinst
--- linux-libre-4.13-rc6-gnu/scripts/Makefile.dtbinst	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/scripts/Makefile.dtbinst	2017-08-27 20:20:40.000000000 -0400
@@ -14,7 +14,7 @@ src := $(obj)
 PHONY := __dtbs_install
 __dtbs_install:
 
-export dtbinst-root ?= $(obj)
+export dtbinst_root ?= $(obj)
 
 include include/config/auto.conf
 include scripts/Kbuild.include
@@ -27,7 +27,7 @@ dtbinst-dirs	:= $(dts-dirs)
 quiet_cmd_dtb_install =	INSTALL $<
       cmd_dtb_install =	mkdir -p $(2); cp $< $(2)
 
-install-dir = $(patsubst $(dtbinst-root)%,$(INSTALL_DTBS_PATH)%,$(obj))
+install-dir = $(patsubst $(dtbinst_root)%,$(INSTALL_DTBS_PATH)%,$(obj))
 
 $(dtbinst-files): %.dtb: $(obj)/%.dtb
 	$(call cmd,dtb_install,$(install-dir))
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/sound/core/control.c linux-libre-4.13-rc7-gnu/sound/core/control.c
--- linux-libre-4.13-rc6-gnu/sound/core/control.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/sound/core/control.c	2017-08-27 20:20:40.000000000 -0400
@@ -1137,7 +1137,7 @@ static int snd_ctl_elem_user_tlv(struct
 		mutex_lock(&ue->card->user_ctl_lock);
 		change = ue->tlv_data_size != size;
 		if (!change)
-			change = memcmp(ue->tlv_data, new_data, size);
+			change = memcmp(ue->tlv_data, new_data, size) != 0;
 		kfree(ue->tlv_data);
 		ue->tlv_data = new_data;
 		ue->tlv_data_size = size;
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/sound/firewire/iso-resources.c linux-libre-4.13-rc7-gnu/sound/firewire/iso-resources.c
--- linux-libre-4.13-rc6-gnu/sound/firewire/iso-resources.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/sound/firewire/iso-resources.c	2017-08-27 20:20:40.000000000 -0400
@@ -210,9 +210,14 @@ EXPORT_SYMBOL(fw_iso_resources_update);
  */
 void fw_iso_resources_free(struct fw_iso_resources *r)
 {
-	struct fw_card *card = fw_parent_device(r->unit)->card;
+	struct fw_card *card;
 	int bandwidth, channel;
 
+	/* Not initialized. */
+	if (r->unit == NULL)
+		return;
+	card = fw_parent_device(r->unit)->card;
+
 	mutex_lock(&r->mutex);
 
 	if (r->allocated) {
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/sound/firewire/motu/motu.c linux-libre-4.13-rc7-gnu/sound/firewire/motu/motu.c
--- linux-libre-4.13-rc6-gnu/sound/firewire/motu/motu.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/sound/firewire/motu/motu.c	2017-08-27 20:20:40.000000000 -0400
@@ -128,6 +128,7 @@ static void do_registration(struct work_
 	return;
 error:
 	snd_motu_transaction_unregister(motu);
+	snd_motu_stream_destroy_duplex(motu);
 	snd_card_free(motu->card);
 	dev_info(&motu->unit->device,
 		 "Sound card registration failed: %d\n", err);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/sound/pci/hda/patch_conexant.c linux-libre-4.13-rc7-gnu/sound/pci/hda/patch_conexant.c
--- linux-libre-4.13-rc6-gnu/sound/pci/hda/patch_conexant.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/sound/pci/hda/patch_conexant.c	2017-08-27 20:20:40.000000000 -0400
@@ -947,6 +947,7 @@ static const struct snd_pci_quirk cxt506
 	SND_PCI_QUIRK(0x17aa, 0x390b, "Lenovo G50-80", CXT_FIXUP_STEREO_DMIC),
 	SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC),
 	SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC),
+	SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo G50-70", CXT_FIXUP_STEREO_DMIC),
 	SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC),
 	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", CXT_FIXUP_THINKPAD_ACPI),
 	SND_PCI_QUIRK(0x1c06, 0x2011, "Lemote A1004", CXT_PINCFG_LEMOTE_A1004),
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/sound/soc/codecs/rt5677.c linux-libre-4.13-rc7-gnu/sound/soc/codecs/rt5677.c
--- linux-libre-4.13-rc6-gnu/sound/soc/codecs/rt5677.c	2017-08-27 03:06:26.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/sound/soc/codecs/rt5677.c	2017-08-27 22:07:55.000000000 -0400
@@ -5021,6 +5021,7 @@ static const struct regmap_config rt5677
 static const struct i2c_device_id rt5677_i2c_id[] = {
 	{ "rt5677", RT5677 },
 	{ "rt5676", RT5676 },
+	{ "RT5677CE:00", RT5677 },
 	{ }
 };
 MODULE_DEVICE_TABLE(i2c, rt5677_i2c_id);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/sound/usb/quirks.c linux-libre-4.13-rc7-gnu/sound/usb/quirks.c
--- linux-libre-4.13-rc6-gnu/sound/usb/quirks.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/sound/usb/quirks.c	2017-08-27 20:20:40.000000000 -0400
@@ -1309,10 +1309,13 @@ void snd_usb_ctl_msg_quirk(struct usb_de
 	    && (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
 		mdelay(20);
 
-	/* Zoom R16/24 needs a tiny delay here, otherwise requests like
-	 * get/set frequency return as failed despite actually succeeding.
+	/* Zoom R16/24, Logitech H650e, Jabra 550a needs a tiny delay here,
+	 * otherwise requests like get/set frequency return as failed despite
+	 * actually succeeding.
 	 */
-	if (chip->usb_id == USB_ID(0x1686, 0x00dd) &&
+	if ((chip->usb_id == USB_ID(0x1686, 0x00dd) ||
+	     chip->usb_id == USB_ID(0x046d, 0x0a46) ||
+	     chip->usb_id == USB_ID(0x0b0e, 0x0349)) &&
 	    (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
 		mdelay(1);
 }
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/tools/lib/bpf/libbpf.c linux-libre-4.13-rc7-gnu/tools/lib/bpf/libbpf.c
--- linux-libre-4.13-rc6-gnu/tools/lib/bpf/libbpf.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/tools/lib/bpf/libbpf.c	2017-08-27 20:20:40.000000000 -0400
@@ -879,7 +879,8 @@ bpf_object__create_maps(struct bpf_objec
 			size_t j;
 			int err = *pfd;
 
-			pr_warning("failed to create map: %s\n",
+			pr_warning("failed to create map (name: '%s'): %s\n",
+				   obj->maps[i].name,
 				   strerror(errno));
 			for (j = 0; j < i; j++)
 				zclose(obj->maps[j].fd);
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/tools/objtool/arch/x86/decode.c linux-libre-4.13-rc7-gnu/tools/objtool/arch/x86/decode.c
--- linux-libre-4.13-rc6-gnu/tools/objtool/arch/x86/decode.c	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/tools/objtool/arch/x86/decode.c	2017-08-27 20:20:40.000000000 -0400
@@ -271,7 +271,7 @@ int arch_decode_instruction(struct elf *
 	case 0x8d:
 		if (rex == 0x48 && modrm == 0x65) {
 
-			/* lea -disp(%rbp), %rsp */
+			/* lea disp(%rbp), %rsp */
 			*type = INSN_STACK;
 			op->src.type = OP_SRC_ADD;
 			op->src.reg = CFI_BP;
@@ -281,6 +281,30 @@ int arch_decode_instruction(struct elf *
 			break;
 		}
 
+		if (rex == 0x48 && (modrm == 0xa4 || modrm == 0x64) &&
+		    sib == 0x24) {
+
+			/* lea disp(%rsp), %rsp */
+			*type = INSN_STACK;
+			op->src.type = OP_SRC_ADD;
+			op->src.reg = CFI_SP;
+			op->src.offset = insn.displacement.value;
+			op->dest.type = OP_DEST_REG;
+			op->dest.reg = CFI_SP;
+			break;
+		}
+
+		if (rex == 0x48 && modrm == 0x2c && sib == 0x24) {
+
+			/* lea (%rsp), %rbp */
+			*type = INSN_STACK;
+			op->src.type = OP_SRC_REG;
+			op->src.reg = CFI_SP;
+			op->dest.type = OP_DEST_REG;
+			op->dest.reg = CFI_BP;
+			break;
+		}
+
 		if (rex == 0x4c && modrm == 0x54 && sib == 0x24 &&
 		    insn.displacement.value == 8) {
 
diff -druNp --no-dereference linux-libre-4.13-rc6-gnu/tools/testing/selftests/ntb/ntb_test.sh linux-libre-4.13-rc7-gnu/tools/testing/selftests/ntb/ntb_test.sh
--- linux-libre-4.13-rc6-gnu/tools/testing/selftests/ntb/ntb_test.sh	2017-08-20 17:13:52.000000000 -0400
+++ linux-libre-4.13-rc7-gnu/tools/testing/selftests/ntb/ntb_test.sh	2017-08-27 20:20:40.000000000 -0400
@@ -333,6 +333,10 @@ function ntb_tool_tests()
 	link_test $LOCAL_TOOL $REMOTE_TOOL
 	link_test $REMOTE_TOOL $LOCAL_TOOL
 
+	#Ensure the link is up on both sides before continuing
+	write_file Y $LOCAL_TOOL/link_event
+	write_file Y $REMOTE_TOOL/link_event
+
 	for PEER_TRANS in $(ls $LOCAL_TOOL/peer_trans*); do
 		PT=$(basename $PEER_TRANS)
 		write_file $MW_SIZE $LOCAL_TOOL/$PT
