diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/exynos5420-arndale-octa.dts linux-libre-5.1.10-gnu/arch/arm/boot/dts/exynos5420-arndale-octa.dts
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/exynos5420-arndale-octa.dts	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/exynos5420-arndale-octa.dts	2019-06-15 05:53:06.000000000 -0400
@@ -107,6 +107,7 @@
 				regulator-name = "PVDD_APIO_1V8";
 				regulator-min-microvolt = <1800000>;
 				regulator-max-microvolt = <1800000>;
+				regulator-always-on;
 			};
 
 			ldo3_reg: LDO3 {
@@ -145,6 +146,7 @@
 				regulator-name = "PVDD_ABB_1V8";
 				regulator-min-microvolt = <1800000>;
 				regulator-max-microvolt = <1800000>;
+				regulator-always-on;
 			};
 
 			ldo9_reg: LDO9 {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx50.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx50.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx50.dtsi	2019-06-11 14:35:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx50.dtsi	2019-06-15 16:58:43.000000000 -0400
@@ -411,7 +411,7 @@
 				reg = <0x63fb0000 0x4000>;
 				interrupts = <6>;
 				clocks = <&clks IMX5_CLK_SDMA_GATE>,
-					 <&clks IMX5_CLK_SDMA_GATE>;
+					 <&clks IMX5_CLK_AHB>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
 				fsl,sdma-ram-script-name = "/*(DEBLOBBED)*/";
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx51.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx51.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx51.dtsi	2019-06-11 14:35:26.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx51.dtsi	2019-06-15 16:58:46.000000000 -0400
@@ -489,7 +489,7 @@
 				reg = <0x83fb0000 0x4000>;
 				interrupts = <6>;
 				clocks = <&clks IMX5_CLK_SDMA_GATE>,
-					 <&clks IMX5_CLK_SDMA_GATE>;
+					 <&clks IMX5_CLK_AHB>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
 				fsl,sdma-ram-script-name = "/*(DEBLOBBED)*/";
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx53.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx53.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx53.dtsi	2019-06-11 14:35:29.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx53.dtsi	2019-06-15 16:58:48.000000000 -0400
@@ -702,7 +702,7 @@
 				reg = <0x63fb0000 0x4000>;
 				interrupts = <6>;
 				clocks = <&clks IMX5_CLK_SDMA_GATE>,
-					 <&clks IMX5_CLK_SDMA_GATE>;
+					 <&clks IMX5_CLK_AHB>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
 				fsl,sdma-ram-script-name = "/*(DEBLOBBED)*/";
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6qdl.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6qdl.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6qdl.dtsi	2019-06-11 14:35:35.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6qdl.dtsi	2019-06-15 16:58:54.000000000 -0400
@@ -918,7 +918,7 @@
 				compatible = "fsl,imx6q-sdma", "fsl,imx35-sdma";
 				reg = <0x020ec000 0x4000>;
 				interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clks IMX6QDL_CLK_SDMA>,
+				clocks = <&clks IMX6QDL_CLK_IPG>,
 					 <&clks IMX6QDL_CLK_SDMA>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6sl.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6sl.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6sl.dtsi	2019-06-11 14:35:38.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6sl.dtsi	2019-06-15 16:58:58.000000000 -0400
@@ -741,7 +741,7 @@
 				reg = <0x020ec000 0x4000>;
 				interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>;
 				clocks = <&clks IMX6SL_CLK_SDMA>,
-					 <&clks IMX6SL_CLK_SDMA>;
+					 <&clks IMX6SL_CLK_AHB>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
 				/* imx6sl reuses imx6q sdma firmware */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6sll.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6sll.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6sll.dtsi	2019-06-11 14:35:41.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6sll.dtsi	2019-06-15 16:59:00.000000000 -0400
@@ -621,7 +621,7 @@
 				compatible = "fsl,imx6sll-sdma", "fsl,imx35-sdma";
 				reg = <0x020ec000 0x4000>;
 				interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clks IMX6SLL_CLK_SDMA>,
+				clocks = <&clks IMX6SLL_CLK_IPG>,
 					 <&clks IMX6SLL_CLK_SDMA>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6sx.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6sx.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6sx.dtsi	2019-06-11 14:35:45.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6sx.dtsi	2019-06-15 16:59:04.000000000 -0400
@@ -820,7 +820,7 @@
 				compatible = "fsl,imx6sx-sdma", "fsl,imx6q-sdma";
 				reg = <0x020ec000 0x4000>;
 				interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clks IMX6SX_CLK_SDMA>,
+				clocks = <&clks IMX6SX_CLK_IPG>,
 					 <&clks IMX6SX_CLK_SDMA>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6ul.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6ul.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx6ul.dtsi	2019-06-11 14:35:48.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx6ul.dtsi	2019-06-15 16:59:07.000000000 -0400
@@ -708,7 +708,7 @@
 					     "fsl,imx35-sdma";
 				reg = <0x020ec000 0x4000>;
 				interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clks IMX6UL_CLK_SDMA>,
+				clocks = <&clks IMX6UL_CLK_IPG>,
 					 <&clks IMX6UL_CLK_SDMA>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx7s.dtsi linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx7s.dtsi
--- linux-libre-5.1.9-gnu/arch/arm/boot/dts/imx7s.dtsi	2019-06-11 14:35:51.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/boot/dts/imx7s.dtsi	2019-06-15 16:59:10.000000000 -0400
@@ -1067,8 +1067,8 @@
 				compatible = "fsl,imx7d-sdma", "fsl,imx35-sdma";
 				reg = <0x30bd0000 0x10000>;
 				interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
-				clocks = <&clks IMX7D_SDMA_CORE_CLK>,
-					 <&clks IMX7D_AHB_CHANNEL_ROOT_CLK>;
+				clocks = <&clks IMX7D_IPG_ROOT_CLK>,
+					 <&clks IMX7D_SDMA_CORE_CLK>;
 				clock-names = "ipg", "ahb";
 				#dma-cells = <3>;
 				fsl,sdma-ram-script-name = "/*(DEBLOBBED)*/";
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/include/asm/hardirq.h linux-libre-5.1.10-gnu/arch/arm/include/asm/hardirq.h
--- linux-libre-5.1.9-gnu/arch/arm/include/asm/hardirq.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/include/asm/hardirq.h	2019-06-15 05:53:06.000000000 -0400
@@ -6,6 +6,7 @@
 #include <linux/threads.h>
 #include <asm/irq.h>
 
+/* number of IPIS _not_ including IPI_CPU_BACKTRACE */
 #define NR_IPI	7
 
 typedef struct {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/kernel/smp.c linux-libre-5.1.10-gnu/arch/arm/kernel/smp.c
--- linux-libre-5.1.9-gnu/arch/arm/kernel/smp.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/kernel/smp.c	2019-06-15 05:53:06.000000000 -0400
@@ -70,6 +70,10 @@ enum ipi_msg_type {
 	IPI_CPU_STOP,
 	IPI_IRQ_WORK,
 	IPI_COMPLETION,
+	/*
+	 * CPU_BACKTRACE is special and not included in NR_IPI
+	 * or tracable with trace_ipi_*
+	 */
 	IPI_CPU_BACKTRACE,
 	/*
 	 * SGI8-15 can be reserved by secure firmware, and thus may
@@ -797,7 +801,7 @@ core_initcall(register_cpufreq_notifier)
 
 static void raise_nmi(cpumask_t *mask)
 {
-	smp_cross_call(mask, IPI_CPU_BACKTRACE);
+	__smp_cross_call(mask, IPI_CPU_BACKTRACE);
 }
 
 void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/mach-exynos/suspend.c linux-libre-5.1.10-gnu/arch/arm/mach-exynos/suspend.c
--- linux-libre-5.1.9-gnu/arch/arm/mach-exynos/suspend.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/mach-exynos/suspend.c	2019-06-15 05:53:06.000000000 -0400
@@ -444,8 +444,27 @@ early_wakeup:
 
 static void exynos5420_prepare_pm_resume(void)
 {
+	unsigned int mpidr, cluster;
+
+	mpidr = read_cpuid_mpidr();
+	cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+
 	if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM))
 		WARN_ON(mcpm_cpu_powered_up());
+
+	if (IS_ENABLED(CONFIG_HW_PERF_EVENTS) && cluster != 0) {
+		/*
+		 * When system is resumed on the LITTLE/KFC core (cluster 1),
+		 * the DSCR is not properly updated until the power is turned
+		 * on also for the cluster 0. Enable it for a while to
+		 * propagate the SPNIDEN and SPIDEN signals from Secure JTAG
+		 * block and avoid undefined instruction issue on CP14 reset.
+		 */
+		pmu_raw_writel(S5P_CORE_LOCAL_PWR_EN,
+				EXYNOS_COMMON_CONFIGURATION(0));
+		pmu_raw_writel(0,
+				EXYNOS_COMMON_CONFIGURATION(0));
+	}
 }
 
 static void exynos5420_pm_resume(void)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/mach-omap2/pm33xx-core.c linux-libre-5.1.10-gnu/arch/arm/mach-omap2/pm33xx-core.c
--- linux-libre-5.1.9-gnu/arch/arm/mach-omap2/pm33xx-core.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/mach-omap2/pm33xx-core.c	2019-06-15 05:53:06.000000000 -0400
@@ -51,10 +51,12 @@ static int amx3_common_init(void)
 
 	/* CEFUSE domain can be turned off post bootup */
 	cefuse_pwrdm = pwrdm_lookup("cefuse_pwrdm");
-	if (cefuse_pwrdm)
-		omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF);
-	else
+	if (!cefuse_pwrdm)
 		pr_err("PM: Failed to get cefuse_pwrdm\n");
+	else if (omap_type() != OMAP2_DEVICE_TYPE_GP)
+		pr_info("PM: Leaving EFUSE power domain active\n");
+	else
+		omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c linux-libre-5.1.10-gnu/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
--- linux-libre-5.1.9-gnu/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c	2019-06-15 05:53:06.000000000 -0400
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * R-Car Generation 2 da9063/da9210 regulator quirk
+ * R-Car Generation 2 da9063(L)/da9210 regulator quirk
  *
  * Certain Gen2 development boards have an da9063 and one or more da9210
  * regulators. All of these regulators have their interrupt request lines
@@ -65,6 +65,7 @@ static struct i2c_msg da9210_msg = {
 
 static const struct of_device_id rcar_gen2_quirk_match[] = {
 	{ .compatible = "dlg,da9063", .data = &da9063_msg },
+	{ .compatible = "dlg,da9063l", .data = &da9063_msg },
 	{ .compatible = "dlg,da9210", .data = &da9210_msg },
 	{},
 };
@@ -147,6 +148,7 @@ static int __init rcar_gen2_regulator_qu
 
 	if (!of_machine_is_compatible("renesas,koelsch") &&
 	    !of_machine_is_compatible("renesas,lager") &&
+	    !of_machine_is_compatible("renesas,porter") &&
 	    !of_machine_is_compatible("renesas,stout") &&
 	    !of_machine_is_compatible("renesas,gose"))
 		return -ENODEV;
@@ -210,7 +212,7 @@ static int __init rcar_gen2_regulator_qu
 		goto err_free;
 	}
 
-	pr_info("IRQ2 is asserted, installing da9063/da9210 regulator quirk\n");
+	pr_info("IRQ2 is asserted, installing regulator quirk\n");
 
 	bus_register_notifier(&i2c_bus_type, &regulator_quirk_nb);
 	return 0;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm64/boot/dts/freescale/imx8mq.dtsi linux-libre-5.1.10-gnu/arch/arm64/boot/dts/freescale/imx8mq.dtsi
--- linux-libre-5.1.9-gnu/arch/arm64/boot/dts/freescale/imx8mq.dtsi	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm64/boot/dts/freescale/imx8mq.dtsi	2019-06-15 05:53:06.000000000 -0400
@@ -240,7 +240,7 @@
 			};
 
 			iomuxc_gpr: syscon@30340000 {
-				compatible = "fsl,imx8mq-iomuxc-gpr", "syscon";
+				compatible = "fsl,imx8mq-iomuxc-gpr", "fsl,imx6q-iomuxc-gpr", "syscon";
 				reg = <0x30340000 0x10000>;
 			};
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi linux-libre-5.1.10-gnu/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi
--- linux-libre-5.1.9-gnu/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi	2019-06-15 05:53:06.000000000 -0400
@@ -37,18 +37,18 @@
 	pms405-regulators {
 		compatible = "qcom,rpm-pms405-regulators";
 
-		vdd-s1-supply = <&vph_pwr>;
-		vdd-s2-supply = <&vph_pwr>;
-		vdd-s3-supply = <&vph_pwr>;
-		vdd-s4-supply = <&vph_pwr>;
-		vdd-s5-supply = <&vph_pwr>;
-		vdd-l1-l2-supply = <&vreg_s5_1p35>;
-		vdd-l3-l8-supply = <&vreg_s5_1p35>;
-		vdd-l4-supply = <&vreg_s5_1p35>;
-		vdd-l5-l6-supply = <&vreg_s4_1p8>;
-		vdd-l7-supply = <&vph_pwr>;
-		vdd-l9-supply = <&vreg_s5_1p35>;
-		vdd-l10-l11-l12-l13-supply = <&vph_pwr>;
+		vdd_s1-supply = <&vph_pwr>;
+		vdd_s2-supply = <&vph_pwr>;
+		vdd_s3-supply = <&vph_pwr>;
+		vdd_s4-supply = <&vph_pwr>;
+		vdd_s5-supply = <&vph_pwr>;
+		vdd_l1_l2-supply = <&vreg_s5_1p35>;
+		vdd_l3_l8-supply = <&vreg_s5_1p35>;
+		vdd_l4-supply = <&vreg_s5_1p35>;
+		vdd_l5_l6-supply = <&vreg_s4_1p8>;
+		vdd_l7-supply = <&vph_pwr>;
+		vdd_l9-supply = <&vreg_s5_1p35>;
+		vdd_l10_l11_l12_l13-supply = <&vph_pwr>;
 
 		vreg_s4_1p8: s4 {
 			regulator-min-microvolt = <1728000>;
@@ -56,8 +56,8 @@
 		};
 
 		vreg_s5_1p35: s5 {
-			regulator-min-microvolt = <>;
-			regulator-max-microvolt = <>;
+			regulator-min-microvolt = <1352000>;
+			regulator-max-microvolt = <1352000>;
 		};
 
 		vreg_l1_1p3: l1 {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/arm64/configs/defconfig linux-libre-5.1.10-gnu/arch/arm64/configs/defconfig
--- linux-libre-5.1.9-gnu/arch/arm64/configs/defconfig	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/arm64/configs/defconfig	2019-06-15 05:53:06.000000000 -0400
@@ -222,10 +222,10 @@ CONFIG_BLK_DEV_SD=y
 CONFIG_SCSI_SAS_ATA=y
 CONFIG_SCSI_HISI_SAS=y
 CONFIG_SCSI_HISI_SAS_PCI=y
-CONFIG_SCSI_UFSHCD=m
-CONFIG_SCSI_UFSHCD_PLATFORM=m
+CONFIG_SCSI_UFSHCD=y
+CONFIG_SCSI_UFSHCD_PLATFORM=y
 CONFIG_SCSI_UFS_QCOM=m
-CONFIG_SCSI_UFS_HISI=m
+CONFIG_SCSI_UFS_HISI=y
 CONFIG_ATA=y
 CONFIG_SATA_AHCI=y
 CONFIG_SATA_AHCI_PLATFORM=y
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/mips/kernel/prom.c linux-libre-5.1.10-gnu/arch/mips/kernel/prom.c
--- linux-libre-5.1.9-gnu/arch/mips/kernel/prom.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/mips/kernel/prom.c	2019-06-15 05:53:06.000000000 -0400
@@ -41,7 +41,19 @@ char *mips_get_machine_name(void)
 #ifdef CONFIG_USE_OF
 void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 {
-	return add_memory_region(base, size, BOOT_MEM_RAM);
+	if (base >= PHYS_ADDR_MAX) {
+		pr_warn("Trying to add an invalid memory region, skipped\n");
+		return;
+	}
+
+	/* Truncate the passed memory region instead of type casting */
+	if (base + size - 1 >= PHYS_ADDR_MAX || base + size < base) {
+		pr_warn("Truncate memory region %llx @ %llx to size %llx\n",
+			size, base, PHYS_ADDR_MAX - base);
+		size = PHYS_ADDR_MAX - base;
+	}
+
+	add_memory_region(base, size, BOOT_MEM_RAM);
 }
 
 int __init early_init_dt_reserve_memory_arch(phys_addr_t base,
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/powerpc/include/asm/drmem.h linux-libre-5.1.10-gnu/arch/powerpc/include/asm/drmem.h
--- linux-libre-5.1.9-gnu/arch/powerpc/include/asm/drmem.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/powerpc/include/asm/drmem.h	2019-06-15 05:53:06.000000000 -0400
@@ -17,6 +17,9 @@ struct drmem_lmb {
 	u32     drc_index;
 	u32     aa_index;
 	u32     flags;
+#ifdef CONFIG_MEMORY_HOTPLUG
+	int	nid;
+#endif
 };
 
 struct drmem_lmb_info {
@@ -104,4 +107,22 @@ static inline void invalidate_lmb_associ
 	lmb->aa_index = 0xffffffff;
 }
 
+#ifdef CONFIG_MEMORY_HOTPLUG
+static inline void lmb_set_nid(struct drmem_lmb *lmb)
+{
+	lmb->nid = memory_add_physaddr_to_nid(lmb->base_addr);
+}
+static inline void lmb_clear_nid(struct drmem_lmb *lmb)
+{
+	lmb->nid = -1;
+}
+#else
+static inline void lmb_set_nid(struct drmem_lmb *lmb)
+{
+}
+static inline void lmb_clear_nid(struct drmem_lmb *lmb)
+{
+}
+#endif
+
 #endif /* _ASM_POWERPC_LMB_H */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/powerpc/mm/drmem.c linux-libre-5.1.10-gnu/arch/powerpc/mm/drmem.c
--- linux-libre-5.1.9-gnu/arch/powerpc/mm/drmem.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/powerpc/mm/drmem.c	2019-06-15 05:53:06.000000000 -0400
@@ -366,8 +366,10 @@ static void __init init_drmem_v1_lmbs(co
 	if (!drmem_info->lmbs)
 		return;
 
-	for_each_drmem_lmb(lmb)
+	for_each_drmem_lmb(lmb) {
 		read_drconf_v1_cell(lmb, &prop);
+		lmb_set_nid(lmb);
+	}
 }
 
 static void __init init_drmem_v2_lmbs(const __be32 *prop)
@@ -412,6 +414,8 @@ static void __init init_drmem_v2_lmbs(co
 
 			lmb->aa_index = dr_cell.aa_index;
 			lmb->flags = dr_cell.flags;
+
+			lmb_set_nid(lmb);
 		}
 	}
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c linux-libre-5.1.10-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c
--- linux-libre-5.1.9-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c	2019-06-15 05:53:06.000000000 -0400
@@ -379,7 +379,7 @@ static int dlpar_add_lmb(struct drmem_lm
 static int dlpar_remove_lmb(struct drmem_lmb *lmb)
 {
 	unsigned long block_sz;
-	int nid, rc;
+	int rc;
 
 	if (!lmb_is_removable(lmb))
 		return -EINVAL;
@@ -389,14 +389,14 @@ static int dlpar_remove_lmb(struct drmem
 		return rc;
 
 	block_sz = pseries_memory_block_size();
-	nid = memory_add_physaddr_to_nid(lmb->base_addr);
 
-	__remove_memory(nid, lmb->base_addr, block_sz);
+	__remove_memory(lmb->nid, lmb->base_addr, block_sz);
 
 	/* Update memory regions for memory remove */
 	memblock_remove(lmb->base_addr, block_sz);
 
 	invalidate_lmb_associativity_index(lmb);
+	lmb_clear_nid(lmb);
 	lmb->flags &= ~DRCONF_MEM_ASSIGNED;
 
 	return 0;
@@ -653,7 +653,7 @@ static int dlpar_memory_remove_by_ic(u32
 static int dlpar_add_lmb(struct drmem_lmb *lmb)
 {
 	unsigned long block_sz;
-	int nid, rc;
+	int rc;
 
 	if (lmb->flags & DRCONF_MEM_ASSIGNED)
 		return -EINVAL;
@@ -664,13 +664,11 @@ static int dlpar_add_lmb(struct drmem_lm
 		return rc;
 	}
 
+	lmb_set_nid(lmb);
 	block_sz = memory_block_size_bytes();
 
-	/* Find the node id for this address */
-	nid = memory_add_physaddr_to_nid(lmb->base_addr);
-
 	/* Add the memory */
-	rc = __add_memory(nid, lmb->base_addr, block_sz);
+	rc = __add_memory(lmb->nid, lmb->base_addr, block_sz);
 	if (rc) {
 		invalidate_lmb_associativity_index(lmb);
 		return rc;
@@ -678,8 +676,9 @@ static int dlpar_add_lmb(struct drmem_lm
 
 	rc = dlpar_online_lmb(lmb);
 	if (rc) {
-		__remove_memory(nid, lmb->base_addr, block_sz);
+		__remove_memory(lmb->nid, lmb->base_addr, block_sz);
 		invalidate_lmb_associativity_index(lmb);
+		lmb_clear_nid(lmb);
 	} else {
 		lmb->flags |= DRCONF_MEM_ASSIGNED;
 	}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/um/kernel/time.c linux-libre-5.1.10-gnu/arch/um/kernel/time.c
--- linux-libre-5.1.9-gnu/arch/um/kernel/time.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/um/kernel/time.c	2019-06-15 05:53:06.000000000 -0400
@@ -56,7 +56,7 @@ static int itimer_one_shot(struct clock_
 static struct clock_event_device timer_clockevent = {
 	.name			= "posix-timer",
 	.rating			= 250,
-	.cpumask		= cpu_all_mask,
+	.cpumask		= cpu_possible_mask,
 	.features		= CLOCK_EVT_FEAT_PERIODIC |
 				  CLOCK_EVT_FEAT_ONESHOT,
 	.set_state_shutdown	= itimer_shutdown,
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/x86/events/intel/core.c linux-libre-5.1.10-gnu/arch/x86/events/intel/core.c
--- linux-libre-5.1.9-gnu/arch/x86/events/intel/core.c	2019-06-11 14:29:56.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/x86/events/intel/core.c	2019-06-15 16:53:38.000000000 -0400
@@ -3189,7 +3189,7 @@ static int intel_pmu_hw_config(struct pe
 		return ret;
 
 	if (event->attr.precise_ip) {
-		if (!(event->attr.freq || event->attr.wakeup_events)) {
+		if (!(event->attr.freq || (event->attr.wakeup_events && !event->attr.watermark))) {
 			event->hw.flags |= PERF_X86_EVENT_AUTO_RELOAD;
 			if (!(event->attr.sample_type &
 			      ~intel_pmu_large_pebs_flags(event)))
diff -druNp --no-dereference linux-libre-5.1.9-gnu/arch/x86/pci/irq.c linux-libre-5.1.10-gnu/arch/x86/pci/irq.c
--- linux-libre-5.1.9-gnu/arch/x86/pci/irq.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/arch/x86/pci/irq.c	2019-06-15 05:53:06.000000000 -0400
@@ -1119,6 +1119,8 @@ static const struct dmi_system_id pciirq
 
 void __init pcibios_irq_init(void)
 {
+	struct irq_routing_table *rtable = NULL;
+
 	DBG(KERN_DEBUG "PCI: IRQ init\n");
 
 	if (raw_pci_ops == NULL)
@@ -1129,8 +1131,10 @@ void __init pcibios_irq_init(void)
 	pirq_table = pirq_find_routing_table();
 
 #ifdef CONFIG_PCI_BIOS
-	if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN))
+	if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN)) {
 		pirq_table = pcibios_get_irq_routing_table();
+		rtable = pirq_table;
+	}
 #endif
 	if (pirq_table) {
 		pirq_peer_trick();
@@ -1145,8 +1149,10 @@ void __init pcibios_irq_init(void)
 		 * If we're using the I/O APIC, avoid using the PCI IRQ
 		 * routing table
 		 */
-		if (io_apic_assign_pci_irqs)
+		if (io_apic_assign_pci_irqs) {
+			kfree(rtable);
 			pirq_table = NULL;
+		}
 	}
 
 	x86_init.pci.fixup_irqs();
diff -druNp --no-dereference linux-libre-5.1.9-gnu/block/bfq-iosched.c linux-libre-5.1.10-gnu/block/bfq-iosched.c
--- linux-libre-5.1.9-gnu/block/bfq-iosched.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/block/bfq-iosched.c	2019-06-15 05:53:06.000000000 -0400
@@ -2545,6 +2545,8 @@ static void bfq_arm_slice_timer(struct b
 	if (BFQQ_SEEKY(bfqq) && bfqq->wr_coeff == 1 &&
 	    bfq_symmetric_scenario(bfqd))
 		sl = min_t(u64, sl, BFQ_MIN_TT);
+	else if (bfqq->wr_coeff > 1)
+		sl = max_t(u32, sl, 20ULL * NSEC_PER_MSEC);
 
 	bfqd->last_idling_start = ktime_get();
 	hrtimer_start(&bfqd->idle_slice_timer, ns_to_ktime(sl),
diff -druNp --no-dereference linux-libre-5.1.9-gnu/block/blk-core.c linux-libre-5.1.10-gnu/block/blk-core.c
--- linux-libre-5.1.9-gnu/block/blk-core.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/block/blk-core.c	2019-06-15 05:53:06.000000000 -0400
@@ -237,7 +237,6 @@ void blk_sync_queue(struct request_queue
 		struct blk_mq_hw_ctx *hctx;
 		int i;
 
-		cancel_delayed_work_sync(&q->requeue_work);
 		queue_for_each_hw_ctx(q, hctx, i)
 			cancel_delayed_work_sync(&hctx->run_work);
 	}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/block/blk-mq.c linux-libre-5.1.10-gnu/block/blk-mq.c
--- linux-libre-5.1.9-gnu/block/blk-mq.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/block/blk-mq.c	2019-06-15 05:53:06.000000000 -0400
@@ -2666,6 +2666,8 @@ void blk_mq_release(struct request_queue
 	struct blk_mq_hw_ctx *hctx;
 	unsigned int i;
 
+	cancel_delayed_work_sync(&q->requeue_work);
+
 	/* hctx kobj stays in hctx */
 	queue_for_each_hw_ctx(q, hctx, i) {
 		if (!hctx)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/Documentation/devicetree/bindings/input/touchscreen/goodix.txt linux-libre-5.1.10-gnu/Documentation/devicetree/bindings/input/touchscreen/goodix.txt
--- linux-libre-5.1.9-gnu/Documentation/devicetree/bindings/input/touchscreen/goodix.txt	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/Documentation/devicetree/bindings/input/touchscreen/goodix.txt	2019-06-15 05:53:06.000000000 -0400
@@ -3,6 +3,7 @@ Device tree bindings for Goodix GT9xx se
 Required properties:
 
  - compatible		: Should be "goodix,gt1151"
+				 or "goodix,gt5663"
 				 or "goodix,gt5688"
 				 or "goodix,gt911"
 				 or "goodix,gt9110"
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/clk/rockchip/clk-rk3288.c linux-libre-5.1.10-gnu/drivers/clk/rockchip/clk-rk3288.c
--- linux-libre-5.1.9-gnu/drivers/clk/rockchip/clk-rk3288.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/clk/rockchip/clk-rk3288.c	2019-06-15 05:53:06.000000000 -0400
@@ -856,6 +856,9 @@ static const int rk3288_saved_cru_reg_id
 	RK3288_CLKSEL_CON(10),
 	RK3288_CLKSEL_CON(33),
 	RK3288_CLKSEL_CON(37),
+
+	/* We turn aclk_dmac1 on for suspend; this will restore it */
+	RK3288_CLKGATE_CON(10),
 };
 
 static u32 rk3288_saved_cru_regs[ARRAY_SIZE(rk3288_saved_cru_reg_ids)];
@@ -872,6 +875,14 @@ static int rk3288_clk_suspend(void)
 	}
 
 	/*
+	 * Going into deep sleep (specifically setting PMU_CLR_DMA in
+	 * RK3288_PMU_PWRMODE_CON1) appears to fail unless
+	 * "aclk_dmac1" is on.
+	 */
+	writel_relaxed(1 << (12 + 16),
+		       rk3288_cru_base + RK3288_CLKGATE_CON(10));
+
+	/*
 	 * Switch PLLs other than DPLL (for SDRAM) to slow mode to
 	 * avoid crashes on resume. The Mask ROM on the system will
 	 * put APLL, CPLL, and GPLL into slow mode at resume time
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/dma/idma64.c linux-libre-5.1.10-gnu/drivers/dma/idma64.c
--- linux-libre-5.1.9-gnu/drivers/dma/idma64.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/dma/idma64.c	2019-06-15 05:53:06.000000000 -0400
@@ -592,7 +592,7 @@ static int idma64_probe(struct idma64_ch
 	idma64->dma.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
 	idma64->dma.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
 
-	idma64->dma.dev = chip->dev;
+	idma64->dma.dev = chip->sysdev;
 
 	dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK);
 
@@ -632,6 +632,7 @@ static int idma64_platform_probe(struct
 {
 	struct idma64_chip *chip;
 	struct device *dev = &pdev->dev;
+	struct device *sysdev = dev->parent;
 	struct resource *mem;
 	int ret;
 
@@ -648,11 +649,12 @@ static int idma64_platform_probe(struct
 	if (IS_ERR(chip->regs))
 		return PTR_ERR(chip->regs);
 
-	ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
+	ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
 	if (ret)
 		return ret;
 
 	chip->dev = dev;
+	chip->sysdev = sysdev;
 
 	ret = idma64_probe(chip);
 	if (ret)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/dma/idma64.h linux-libre-5.1.10-gnu/drivers/dma/idma64.h
--- linux-libre-5.1.9-gnu/drivers/dma/idma64.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/dma/idma64.h	2019-06-15 05:53:06.000000000 -0400
@@ -216,12 +216,14 @@ static inline void idma64_writel(struct
 /**
  * struct idma64_chip - representation of iDMA 64-bit controller hardware
  * @dev:		struct device of the DMA controller
+ * @sysdev:		struct device of the physical device that does DMA
  * @irq:		irq line
  * @regs:		memory mapped I/O space
  * @idma64:		struct idma64 that is filed by idma64_probe()
  */
 struct idma64_chip {
 	struct device	*dev;
+	struct device	*sysdev;
 	int		irq;
 	void __iomem	*regs;
 	struct idma64	*idma64;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/edac/Kconfig linux-libre-5.1.10-gnu/drivers/edac/Kconfig
--- linux-libre-5.1.9-gnu/drivers/edac/Kconfig	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/edac/Kconfig	2019-06-15 05:53:06.000000000 -0400
@@ -263,8 +263,8 @@ config EDAC_PND2
 	  micro-server but may appear on others in the future.
 
 config EDAC_MPC85XX
-	tristate "Freescale MPC83xx / MPC85xx"
-	depends on FSL_SOC
+	bool "Freescale MPC83xx / MPC85xx"
+	depends on FSL_SOC && EDAC=y
 	help
 	  Support for error detection and correction on the Freescale
 	  MPC8349, MPC8560, MPC8540, MPC8548, T4240
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpio/gpio-omap.c linux-libre-5.1.10-gnu/drivers/gpio/gpio-omap.c
--- linux-libre-5.1.9-gnu/drivers/gpio/gpio-omap.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpio/gpio-omap.c	2019-06-15 05:53:06.000000000 -0400
@@ -353,6 +353,22 @@ static void omap_clear_gpio_debounce(str
 	}
 }
 
+/*
+ * Off mode wake-up capable GPIOs in bank(s) that are in the wakeup domain.
+ * See TRM section for GPIO for "Wake-Up Generation" for the list of GPIOs
+ * in wakeup domain. If bank->non_wakeup_gpios is not configured, assume none
+ * are capable waking up the system from off mode.
+ */
+static bool omap_gpio_is_off_wakeup_capable(struct gpio_bank *bank, u32 gpio_mask)
+{
+	u32 no_wake = bank->non_wakeup_gpios;
+
+	if (no_wake)
+		return !!(~no_wake & gpio_mask);
+
+	return false;
+}
+
 static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio,
 						unsigned trigger)
 {
@@ -384,13 +400,7 @@ static inline void omap_set_gpio_trigger
 	}
 
 	/* This part needs to be executed always for OMAP{34xx, 44xx} */
-	if (!bank->regs->irqctrl) {
-		/* On omap24xx proceed only when valid GPIO bit is set */
-		if (bank->non_wakeup_gpios) {
-			if (!(bank->non_wakeup_gpios & gpio_bit))
-				goto exit;
-		}
-
+	if (!bank->regs->irqctrl && !omap_gpio_is_off_wakeup_capable(bank, gpio)) {
 		/*
 		 * Log the edge gpio and manually trigger the IRQ
 		 * after resume if the input level changes
@@ -403,7 +413,6 @@ static inline void omap_set_gpio_trigger
 			bank->enabled_non_wakeup_gpios &= ~gpio_bit;
 	}
 
-exit:
 	bank->level_mask =
 		readl_relaxed(bank->base + bank->regs->leveldetect0) |
 		readl_relaxed(bank->base + bank->regs->leveldetect1);
@@ -1444,7 +1453,10 @@ static void omap_gpio_restore_context(st
 static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context)
 {
 	struct device *dev = bank->chip.parent;
-	u32 l1 = 0, l2 = 0;
+	void __iomem *base = bank->base;
+	u32 nowake;
+
+	bank->saved_datain = readl_relaxed(base + bank->regs->datain);
 
 	if (bank->funcs.idle_enable_level_quirk)
 		bank->funcs.idle_enable_level_quirk(bank);
@@ -1456,20 +1468,15 @@ static void omap_gpio_idle(struct gpio_b
 		goto update_gpio_context_count;
 
 	/*
-	 * If going to OFF, remove triggering for all
+	 * If going to OFF, remove triggering for all wkup domain
 	 * non-wakeup GPIOs.  Otherwise spurious IRQs will be
 	 * generated.  See OMAP2420 Errata item 1.101.
 	 */
-	bank->saved_datain = readl_relaxed(bank->base +
-						bank->regs->datain);
-	l1 = bank->context.fallingdetect;
-	l2 = bank->context.risingdetect;
-
-	l1 &= ~bank->enabled_non_wakeup_gpios;
-	l2 &= ~bank->enabled_non_wakeup_gpios;
-
-	writel_relaxed(l1, bank->base + bank->regs->fallingdetect);
-	writel_relaxed(l2, bank->base + bank->regs->risingdetect);
+	if (!bank->loses_context && bank->enabled_non_wakeup_gpios) {
+		nowake = bank->enabled_non_wakeup_gpios;
+		omap_gpio_rmw(base, bank->regs->fallingdetect, nowake, ~nowake);
+		omap_gpio_rmw(base, bank->regs->risingdetect, nowake, ~nowake);
+	}
 
 	bank->workaround_enabled = true;
 
@@ -1518,6 +1525,12 @@ static void omap_gpio_unidle(struct gpio
 				return;
 			}
 		}
+	} else {
+		/* Restore changes done for OMAP2420 errata 1.101 */
+		writel_relaxed(bank->context.fallingdetect,
+			       bank->base + bank->regs->fallingdetect);
+		writel_relaxed(bank->context.risingdetect,
+			       bank->base + bank->regs->risingdetect);
 	}
 
 	if (!bank->workaround_enabled)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpio/gpio-vf610.c linux-libre-5.1.10-gnu/drivers/gpio/gpio-vf610.c
--- linux-libre-5.1.9-gnu/drivers/gpio/gpio-vf610.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpio/gpio-vf610.c	2019-06-15 05:53:06.000000000 -0400
@@ -29,6 +29,7 @@ struct fsl_gpio_soc_data {
 
 struct vf610_gpio_port {
 	struct gpio_chip gc;
+	struct irq_chip ic;
 	void __iomem *base;
 	void __iomem *gpio_base;
 	const struct fsl_gpio_soc_data *sdata;
@@ -60,8 +61,6 @@ struct vf610_gpio_port {
 #define PORT_INT_EITHER_EDGE	0xb
 #define PORT_INT_LOGIC_ONE	0xc
 
-static struct irq_chip vf610_gpio_irq_chip;
-
 static const struct fsl_gpio_soc_data imx_data = {
 	.have_paddr = true,
 };
@@ -237,15 +236,6 @@ static int vf610_gpio_irq_set_wake(struc
 	return 0;
 }
 
-static struct irq_chip vf610_gpio_irq_chip = {
-	.name		= "gpio-vf610",
-	.irq_ack	= vf610_gpio_irq_ack,
-	.irq_mask	= vf610_gpio_irq_mask,
-	.irq_unmask	= vf610_gpio_irq_unmask,
-	.irq_set_type	= vf610_gpio_irq_set_type,
-	.irq_set_wake	= vf610_gpio_irq_set_wake,
-};
-
 static int vf610_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -253,6 +243,7 @@ static int vf610_gpio_probe(struct platf
 	struct vf610_gpio_port *port;
 	struct resource *iores;
 	struct gpio_chip *gc;
+	struct irq_chip *ic;
 	int i;
 	int ret;
 
@@ -316,6 +307,14 @@ static int vf610_gpio_probe(struct platf
 	gc->direction_output = vf610_gpio_direction_output;
 	gc->set = vf610_gpio_set;
 
+	ic = &port->ic;
+	ic->name = "gpio-vf610";
+	ic->irq_ack = vf610_gpio_irq_ack;
+	ic->irq_mask = vf610_gpio_irq_mask;
+	ic->irq_unmask = vf610_gpio_irq_unmask;
+	ic->irq_set_type = vf610_gpio_irq_set_type;
+	ic->irq_set_wake = vf610_gpio_irq_set_wake;
+
 	ret = gpiochip_add_data(gc, port);
 	if (ret < 0)
 		return ret;
@@ -327,14 +326,13 @@ static int vf610_gpio_probe(struct platf
 	/* Clear the interrupt status register for all GPIO's */
 	vf610_gpio_writel(~0, port->base + PORT_ISFR);
 
-	ret = gpiochip_irqchip_add(gc, &vf610_gpio_irq_chip, 0,
-				   handle_edge_irq, IRQ_TYPE_NONE);
+	ret = gpiochip_irqchip_add(gc, ic, 0, handle_edge_irq, IRQ_TYPE_NONE);
 	if (ret) {
 		dev_err(dev, "failed to add irqchip\n");
 		gpiochip_remove(gc);
 		return ret;
 	}
-	gpiochip_set_chained_irqchip(gc, &vf610_gpio_irq_chip, port->irq,
+	gpiochip_set_chained_irqchip(gc, ic, port->irq,
 				     vf610_gpio_irq_handler);
 
 	return 0;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/amd/display/dc/core/dc_link.c linux-libre-5.1.10-gnu/drivers/gpu/drm/amd/display/dc/core/dc_link.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/amd/display/dc/core/dc_link.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/amd/display/dc/core/dc_link.c	2019-06-15 05:53:06.000000000 -0400
@@ -1399,6 +1399,15 @@ static enum dc_status enable_link_dp(
 	/* get link settings for video mode timing */
 	decide_link_settings(stream, &link_settings);
 
+	/* If link settings are different than current and link already enabled
+	 * then need to disable before programming to new rate.
+	 */
+	if (link->link_status.link_active &&
+		(link->cur_link_settings.lane_count != link_settings.lane_count ||
+		 link->cur_link_settings.link_rate != link_settings.link_rate)) {
+		dp_disable_link_phy(link, pipe_ctx->stream->signal);
+	}
+
 	pipe_ctx->stream_res.pix_clk_params.requested_sym_clk =
 			link_settings.link_rate * LINK_RATE_REF_FREQ_IN_KHZ;
 	state->dccg->funcs->update_clocks(state->dccg, state, false);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c linux-libre-5.1.10-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c	2019-06-15 05:53:06.000000000 -0400
@@ -392,6 +392,10 @@ void dpp1_cnv_setup (
 	default:
 		break;
 	}
+
+	/* Set default color space based on format if none is given. */
+	color_space = input_color_space ? input_color_space : color_space;
+
 	REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0,
 			CNVC_SURFACE_PIXEL_FORMAT, pixel_format);
 	REG_UPDATE(FORMAT_CONTROL, FORMAT_CONTROL__ALPHA_EN, alpha_en);
@@ -403,7 +407,7 @@ void dpp1_cnv_setup (
 		for (i = 0; i < 12; i++)
 			tbl_entry.regval[i] = input_csc_color_matrix.matrix[i];
 
-		tbl_entry.color_space = input_color_space;
+		tbl_entry.color_space = color_space;
 
 		if (color_space >= COLOR_SPACE_YCBCR601)
 			select = INPUT_CSC_SELECT_ICSC;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c linux-libre-5.1.10-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c	2019-06-15 05:53:06.000000000 -0400
@@ -1936,7 +1936,7 @@ static void update_dpp(struct dpp *dpp,
 			plane_state->format,
 			EXPANSION_MODE_ZERO,
 			plane_state->input_csc_color_matrix,
-			COLOR_SPACE_YCBCR601_LIMITED);
+			plane_state->color_space);
 
 	//set scale and bias registers
 	build_prescale_params(&bns_params, plane_state);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c linux-libre-5.1.10-gnu/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c	2019-06-15 05:53:06.000000000 -0400
@@ -748,11 +748,11 @@ static void adv7511_mode_set(struct adv7
 			vsync_polarity = 1;
 	}
 
-	if (mode->vrefresh <= 24000)
+	if (drm_mode_vrefresh(mode) <= 24)
 		low_refresh_rate = ADV7511_LOW_REFRESH_RATE_24HZ;
-	else if (mode->vrefresh <= 25000)
+	else if (drm_mode_vrefresh(mode) <= 25)
 		low_refresh_rate = ADV7511_LOW_REFRESH_RATE_25HZ;
-	else if (mode->vrefresh <= 30000)
+	else if (drm_mode_vrefresh(mode) <= 30)
 		low_refresh_rate = ADV7511_LOW_REFRESH_RATE_30HZ;
 	else
 		low_refresh_rate = ADV7511_LOW_REFRESH_RATE_NONE;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/drm_ioctl.c linux-libre-5.1.10-gnu/drivers/gpu/drm/drm_ioctl.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/drm_ioctl.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/drm_ioctl.c	2019-06-15 05:53:06.000000000 -0400
@@ -508,13 +508,6 @@ int drm_version(struct drm_device *dev,
 	return err;
 }
 
-static inline bool
-drm_render_driver_and_ioctl(const struct drm_device *dev, u32 flags)
-{
-	return drm_core_check_feature(dev, DRIVER_RENDER) &&
-		(flags & DRM_RENDER_ALLOW);
-}
-
 /**
  * drm_ioctl_permit - Check ioctl permissions against caller
  *
@@ -529,19 +522,14 @@ drm_render_driver_and_ioctl(const struct
  */
 int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
 {
-	const struct drm_device *dev = file_priv->minor->dev;
-
 	/* ROOT_ONLY is only for CAP_SYS_ADMIN */
 	if (unlikely((flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)))
 		return -EACCES;
 
-	/* AUTH is only for master ... */
-	if (unlikely((flags & DRM_AUTH) && drm_is_primary_client(file_priv))) {
-		/* authenticated ones, or render capable on DRM_RENDER_ALLOW. */
-		if (!file_priv->authenticated &&
-		    !drm_render_driver_and_ioctl(dev, flags))
-			return -EACCES;
-	}
+	/* AUTH is only for authenticated or render client */
+	if (unlikely((flags & DRM_AUTH) && !drm_is_render_client(file_priv) &&
+		     !file_priv->authenticated))
+		return -EACCES;
 
 	/* MASTER is only for master or control clients */
 	if (unlikely((flags & DRM_MASTER) &&
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/msm/msm_gem.c linux-libre-5.1.10-gnu/drivers/gpu/drm/msm/msm_gem.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/msm/msm_gem.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/msm/msm_gem.c	2019-06-15 05:53:06.000000000 -0400
@@ -805,7 +805,8 @@ void msm_gem_describe(struct drm_gem_obj
 		seq_puts(m, "      vmas:");
 
 		list_for_each_entry(vma, &msm_obj->vmas, list)
-			seq_printf(m, " [%s: %08llx,%s,inuse=%d]", vma->aspace->name,
+			seq_printf(m, " [%s: %08llx,%s,inuse=%d]",
+				vma->aspace != NULL ? vma->aspace->name : NULL,
 				vma->iova, vma->mapped ? "mapped" : "unmapped",
 				vma->inuse);
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/disp.h linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/disp.h
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/disp.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/disp.h	2019-06-15 05:53:06.000000000 -0400
@@ -41,6 +41,7 @@ struct nv50_disp_interlock {
 		NV50_DISP_INTERLOCK__SIZE
 	} type;
 	u32 data;
+	u32 wimm;
 };
 
 void corec37d_ntfy_init(struct nouveau_bo *, u32);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/head.c linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/head.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/head.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/head.c	2019-06-15 05:53:06.000000000 -0400
@@ -306,7 +306,7 @@ nv50_head_atomic_check(struct drm_crtc *
 			asyh->set.or = head->func->or != NULL;
 		}
 
-		if (asyh->state.mode_changed)
+		if (asyh->state.mode_changed || asyh->state.connectors_changed)
 			nv50_head_atomic_check_mode(head, asyh);
 
 		if (asyh->state.color_mgmt_changed ||
@@ -413,6 +413,7 @@ nv50_head_atomic_duplicate_state(struct
 	asyh->ovly = armh->ovly;
 	asyh->dither = armh->dither;
 	asyh->procamp = armh->procamp;
+	asyh->or = armh->or;
 	asyh->dp = armh->dp;
 	asyh->clr.mask = 0;
 	asyh->set.mask = 0;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/wimmc37b.c	2019-06-15 05:53:06.000000000 -0400
@@ -75,6 +75,7 @@ wimmc37b_init_(const struct nv50_wimm_fu
 		return ret;
 	}
 
+	wndw->interlock.wimm = wndw->interlock.data;
 	wndw->immd = func;
 	return 0;
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/wndw.c linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/wndw.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/dispnv50/wndw.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/dispnv50/wndw.c	2019-06-15 05:53:06.000000000 -0400
@@ -149,7 +149,7 @@ nv50_wndw_flush_set(struct nv50_wndw *wn
 	if (asyw->set.point) {
 		if (asyw->set.point = false, asyw->set.mask)
 			interlock[wndw->interlock.type] |= wndw->interlock.data;
-		interlock[NV50_DISP_INTERLOCK_WIMM] |= wndw->interlock.data;
+		interlock[NV50_DISP_INTERLOCK_WIMM] |= wndw->interlock.wimm;
 
 		wndw->immd->point(wndw, asyw);
 		wndw->immd->update(wndw, interlock);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/Kconfig linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/Kconfig
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/Kconfig	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/Kconfig	2019-06-15 05:53:06.000000000 -0400
@@ -17,20 +17,9 @@ config DRM_NOUVEAU
 	select INPUT if ACPI && X86
 	select THERMAL if ACPI && X86
 	select ACPI_VIDEO if ACPI && X86
-	help
-	  Choose this option for open-source NVIDIA support.
-
-config NOUVEAU_LEGACY_CTX_SUPPORT
-	bool "Nouveau legacy context support"
-	depends on DRM_NOUVEAU
 	select DRM_VM
-	default y
 	help
-	  There was a version of the nouveau DDX that relied on legacy
-	  ctx ioctls not erroring out. But that was back in time a long
-	  ways, so offer a way to disable it now. For uapi compat with
-	  old nouveau ddx this should be on by default, but modern distros
-	  should consider turning it off.
+	  Choose this option for open-source NVIDIA support.
 
 config NOUVEAU_PLATFORM_DRIVER
 	bool "Nouveau (NVIDIA) SoC GPUs"
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c	2019-06-15 05:53:06.000000000 -0400
@@ -1094,11 +1094,8 @@ nouveau_driver_fops = {
 static struct drm_driver
 driver_stub = {
 	.driver_features =
-		DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER
-#if defined(CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT)
-		| DRIVER_KMS_LEGACY_CONTEXT
-#endif
-		,
+		DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER |
+		DRIVER_KMS_LEGACY_CONTEXT,
 
 	.open = nouveau_drm_open,
 	.postclose = nouveau_drm_postclose,
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c	2019-06-15 05:53:06.000000000 -0400
@@ -365,8 +365,15 @@ nvkm_dp_train(struct nvkm_dp *dp, u32 da
 	 * and it's better to have a failed modeset than that.
 	 */
 	for (cfg = nvkm_dp_rates; cfg->rate; cfg++) {
-		if (cfg->nr <= outp_nr && cfg->nr <= outp_bw)
-			failsafe = cfg;
+		if (cfg->nr <= outp_nr && cfg->nr <= outp_bw) {
+			/* Try to respect sink limits too when selecting
+			 * lowest link configuration.
+			 */
+			if (!failsafe ||
+			    (cfg->nr <= sink_nr && cfg->bw <= sink_bw))
+				failsafe = cfg;
+		}
+
 		if (failsafe && cfg[1].rate < dataKBps)
 			break;
 	}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/gpu/drm/pl111/pl111_display.c linux-libre-5.1.10-gnu/drivers/gpu/drm/pl111/pl111_display.c
--- linux-libre-5.1.9-gnu/drivers/gpu/drm/pl111/pl111_display.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/gpu/drm/pl111/pl111_display.c	2019-06-15 05:53:06.000000000 -0400
@@ -531,14 +531,15 @@ pl111_init_clock_divider(struct drm_devi
 		dev_err(drm->dev, "CLCD: unable to get clcdclk.\n");
 		return PTR_ERR(parent);
 	}
+
+	spin_lock_init(&priv->tim2_lock);
+
 	/* If the clock divider is broken, use the parent directly */
 	if (priv->variant->broken_clockdivider) {
 		priv->clk = parent;
 		return 0;
 	}
 	parent_name = __clk_get_name(parent);
-
-	spin_lock_init(&priv->tim2_lock);
 	div->init = &init;
 
 	ret = devm_clk_hw_register(drm->dev, div);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/input/touchscreen/goodix.c linux-libre-5.1.10-gnu/drivers/input/touchscreen/goodix.c
--- linux-libre-5.1.9-gnu/drivers/input/touchscreen/goodix.c	2019-06-11 14:53:49.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/input/touchscreen/goodix.c	2019-06-15 17:17:14.000000000 -0400
@@ -216,6 +216,7 @@ static const struct goodix_chip_data *go
 {
 	switch (id) {
 	case 1151:
+	case 5663:
 	case 5688:
 		return &gt1x_chip_data;
 
@@ -945,6 +946,7 @@ MODULE_DEVICE_TABLE(acpi, goodix_acpi_ma
 #ifdef CONFIG_OF
 static const struct of_device_id goodix_of_match[] = {
 	{ .compatible = "goodix,gt1151" },
+	{ .compatible = "goodix,gt5663" },
 	{ .compatible = "goodix,gt5688" },
 	{ .compatible = "goodix,gt911" },
 	{ .compatible = "goodix,gt9110" },
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/iommu/arm-smmu-v3.c linux-libre-5.1.10-gnu/drivers/iommu/arm-smmu-v3.c
--- linux-libre-5.1.9-gnu/drivers/iommu/arm-smmu-v3.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/iommu/arm-smmu-v3.c	2019-06-15 05:53:06.000000000 -0400
@@ -2454,13 +2454,9 @@ static int arm_smmu_device_reset(struct
 	/* Clear CR0 and sync (disables SMMU and queue processing) */
 	reg = readl_relaxed(smmu->base + ARM_SMMU_CR0);
 	if (reg & CR0_SMMUEN) {
-		if (is_kdump_kernel()) {
-			arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
-			arm_smmu_device_disable(smmu);
-			return -EBUSY;
-		}
-
 		dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n");
+		WARN_ON(is_kdump_kernel() && !disable_bypass);
+		arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
 	}
 
 	ret = arm_smmu_device_disable(smmu);
@@ -2553,6 +2549,8 @@ static int arm_smmu_device_reset(struct
 		return ret;
 	}
 
+	if (is_kdump_kernel())
+		enables &= ~(CR0_EVTQEN | CR0_PRIQEN);
 
 	/* Enable the SMMU interface, or ensure bypass */
 	if (!bypass || disable_bypass) {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/iommu/intel-iommu.c linux-libre-5.1.10-gnu/drivers/iommu/intel-iommu.c
--- linux-libre-5.1.9-gnu/drivers/iommu/intel-iommu.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/iommu/intel-iommu.c	2019-06-15 05:53:06.000000000 -0400
@@ -3496,7 +3496,13 @@ domains_done:
 
 #ifdef CONFIG_INTEL_IOMMU_SVM
 		if (pasid_supported(iommu) && ecap_prs(iommu->ecap)) {
+			/*
+			 * Call dmar_alloc_hwirq() with dmar_global_lock held,
+			 * could cause possible lock race condition.
+			 */
+			up_write(&dmar_global_lock);
 			ret = intel_svm_enable_prq(iommu);
+			down_write(&dmar_global_lock);
 			if (ret)
 				goto free_iommu;
 		}
@@ -3730,6 +3736,7 @@ static void intel_unmap(struct device *d
 	unsigned long iova_pfn;
 	struct intel_iommu *iommu;
 	struct page *freelist;
+	struct pci_dev *pdev = NULL;
 
 	if (iommu_no_mapping(dev))
 		return;
@@ -3745,11 +3752,14 @@ static void intel_unmap(struct device *d
 	start_pfn = mm_to_dma_pfn(iova_pfn);
 	last_pfn = start_pfn + nrpages - 1;
 
+	if (dev_is_pci(dev))
+		pdev = to_pci_dev(dev);
+
 	dev_dbg(dev, "Device unmapping: pfn %lx-%lx\n", start_pfn, last_pfn);
 
 	freelist = domain_unmap(domain, start_pfn, last_pfn);
 
-	if (intel_iommu_strict) {
+	if (intel_iommu_strict || (pdev && pdev->untrusted)) {
 		iommu_flush_iotlb_psi(iommu, domain, start_pfn,
 				      nrpages, !freelist, 0);
 		/* free iova */
@@ -4055,9 +4065,7 @@ static void __init init_no_remapping_dev
 
 		/* This IOMMU has *only* gfx devices. Either bypass it or
 		   set the gfx_mapped flag, as appropriate */
-		if (dmar_map_gfx) {
-			intel_iommu_gfx_mapped = 1;
-		} else {
+		if (!dmar_map_gfx) {
 			drhd->ignored = 1;
 			for_each_active_dev_scope(drhd->devices,
 						  drhd->devices_cnt, i, dev)
@@ -4896,6 +4904,9 @@ int __init intel_iommu_init(void)
 		goto out_free_reserved_range;
 	}
 
+	if (dmar_map_gfx)
+		intel_iommu_gfx_mapped = 1;
+
 	init_no_remapping_devices();
 
 	ret = init_dmars();
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/mailbox/stm32-ipcc.c linux-libre-5.1.10-gnu/drivers/mailbox/stm32-ipcc.c
--- linux-libre-5.1.9-gnu/drivers/mailbox/stm32-ipcc.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/mailbox/stm32-ipcc.c	2019-06-15 05:53:06.000000000 -0400
@@ -8,9 +8,9 @@
 #include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/interrupt.h>
+#include <linux/io.h>
 #include <linux/mailbox_controller.h>
 #include <linux/module.h>
-#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/pm_wakeirq.h>
 
@@ -240,9 +240,11 @@ static int stm32_ipcc_probe(struct platf
 
 	/* irq */
 	for (i = 0; i < IPCC_IRQ_NUM; i++) {
-		ipcc->irqs[i] = of_irq_get_byname(dev->of_node, irq_name[i]);
+		ipcc->irqs[i] = platform_get_irq_byname(pdev, irq_name[i]);
 		if (ipcc->irqs[i] < 0) {
-			dev_err(dev, "no IRQ specified %s\n", irq_name[i]);
+			if (ipcc->irqs[i] != -EPROBE_DEFER)
+				dev_err(dev, "no IRQ specified %s\n",
+					irq_name[i]);
 			ret = ipcc->irqs[i];
 			goto err_clk;
 		}
@@ -263,9 +265,10 @@ static int stm32_ipcc_probe(struct platf
 
 	/* wakeup */
 	if (of_property_read_bool(np, "wakeup-source")) {
-		ipcc->wkp = of_irq_get_byname(dev->of_node, "wakeup");
+		ipcc->wkp = platform_get_irq_byname(pdev, "wakeup");
 		if (ipcc->wkp < 0) {
-			dev_err(dev, "could not get wakeup IRQ\n");
+			if (ipcc->wkp != -EPROBE_DEFER)
+				dev_err(dev, "could not get wakeup IRQ\n");
 			ret = ipcc->wkp;
 			goto err_clk;
 		}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/media/platform/atmel/atmel-isc.c linux-libre-5.1.10-gnu/drivers/media/platform/atmel/atmel-isc.c
--- linux-libre-5.1.9-gnu/drivers/media/platform/atmel/atmel-isc.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/media/platform/atmel/atmel-isc.c	2019-06-15 05:53:06.000000000 -0400
@@ -2065,8 +2065,11 @@ static int isc_parse_dt(struct device *d
 			break;
 		}
 
-		subdev_entity->asd = devm_kzalloc(dev,
-				     sizeof(*subdev_entity->asd), GFP_KERNEL);
+		/* asd will be freed by the subsystem once it's added to the
+		 * notifier list
+		 */
+		subdev_entity->asd = kzalloc(sizeof(*subdev_entity->asd),
+					     GFP_KERNEL);
 		if (!subdev_entity->asd) {
 			of_node_put(rem);
 			ret = -ENOMEM;
@@ -2210,6 +2213,7 @@ static int atmel_isc_probe(struct platfo
 						     subdev_entity->asd);
 		if (ret) {
 			fwnode_handle_put(subdev_entity->asd->match.fwnode);
+			kfree(subdev_entity->asd);
 			goto cleanup_subdev;
 		}
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/media/v4l2-core/v4l2-ctrls.c linux-libre-5.1.10-gnu/drivers/media/v4l2-core/v4l2-ctrls.c
--- linux-libre-5.1.9-gnu/drivers/media/v4l2-core/v4l2-ctrls.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/media/v4l2-core/v4l2-ctrls.c	2019-06-15 05:53:06.000000000 -0400
@@ -3899,18 +3899,19 @@ void v4l2_ctrl_request_complete(struct m
 }
 EXPORT_SYMBOL(v4l2_ctrl_request_complete);
 
-void v4l2_ctrl_request_setup(struct media_request *req,
+int v4l2_ctrl_request_setup(struct media_request *req,
 			     struct v4l2_ctrl_handler *main_hdl)
 {
 	struct media_request_object *obj;
 	struct v4l2_ctrl_handler *hdl;
 	struct v4l2_ctrl_ref *ref;
+	int ret = 0;
 
 	if (!req || !main_hdl)
-		return;
+		return 0;
 
 	if (WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED))
-		return;
+		return -EBUSY;
 
 	/*
 	 * Note that it is valid if nothing was found. It means
@@ -3919,10 +3920,10 @@ void v4l2_ctrl_request_setup(struct medi
 	 */
 	obj = media_request_object_find(req, &req_ops, main_hdl);
 	if (!obj)
-		return;
+		return 0;
 	if (obj->completed) {
 		media_request_object_put(obj);
-		return;
+		return -EBUSY;
 	}
 	hdl = container_of(obj, struct v4l2_ctrl_handler, req_obj);
 
@@ -3990,12 +3991,15 @@ void v4l2_ctrl_request_setup(struct medi
 				update_from_auto_cluster(master);
 		}
 
-		try_or_set_cluster(NULL, master, true, 0);
-
+		ret = try_or_set_cluster(NULL, master, true, 0);
 		v4l2_ctrl_unlock(master);
+
+		if (ret)
+			break;
 	}
 
 	media_request_object_put(obj);
+	return ret;
 }
 EXPORT_SYMBOL(v4l2_ctrl_request_setup);
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/media/v4l2-core/v4l2-fwnode.c linux-libre-5.1.10-gnu/drivers/media/v4l2-core/v4l2-fwnode.c
--- linux-libre-5.1.9-gnu/drivers/media/v4l2-core/v4l2-fwnode.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/media/v4l2-core/v4l2-fwnode.c	2019-06-15 05:53:06.000000000 -0400
@@ -163,7 +163,7 @@ static int v4l2_fwnode_endpoint_parse_cs
 		}
 
 		if (use_default_lane_mapping)
-			pr_debug("using default lane mapping\n");
+			pr_debug("no lane mapping given, using defaults\n");
 	}
 
 	rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0);
@@ -175,6 +175,10 @@ static int v4l2_fwnode_endpoint_parse_cs
 					       num_data_lanes);
 
 		have_data_lanes = true;
+		if (use_default_lane_mapping) {
+			pr_debug("data-lanes property exists; disabling default mapping\n");
+			use_default_lane_mapping = false;
+		}
 	}
 
 	for (i = 0; i < num_data_lanes; i++) {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/mfd/intel-lpss.c linux-libre-5.1.10-gnu/drivers/mfd/intel-lpss.c
--- linux-libre-5.1.9-gnu/drivers/mfd/intel-lpss.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/mfd/intel-lpss.c	2019-06-15 05:53:06.000000000 -0400
@@ -273,6 +273,9 @@ static void intel_lpss_init_dev(const st
 {
 	u32 value = LPSS_PRIV_SSP_REG_DIS_DMA_FIN;
 
+	/* Set the device in reset state */
+	writel(0, lpss->priv + LPSS_PRIV_RESETS);
+
 	intel_lpss_deassert_reset(lpss);
 
 	intel_lpss_set_remap_addr(lpss);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/mfd/tps65912-spi.c linux-libre-5.1.10-gnu/drivers/mfd/tps65912-spi.c
--- linux-libre-5.1.9-gnu/drivers/mfd/tps65912-spi.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/mfd/tps65912-spi.c	2019-06-15 05:53:06.000000000 -0400
@@ -27,6 +27,7 @@ static const struct of_device_id tps6591
 	{ .compatible = "ti,tps65912", },
 	{ /* sentinel */ }
 };
+MODULE_DEVICE_TABLE(of, tps65912_spi_of_match_table);
 
 static int tps65912_spi_probe(struct spi_device *spi)
 {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/mfd/twl6040.c linux-libre-5.1.10-gnu/drivers/mfd/twl6040.c
--- linux-libre-5.1.9-gnu/drivers/mfd/twl6040.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/mfd/twl6040.c	2019-06-15 05:53:06.000000000 -0400
@@ -322,8 +322,19 @@ int twl6040_power(struct twl6040 *twl604
 			}
 		}
 
+		/*
+		 * Register access can produce errors after power-up unless we
+		 * wait at least 8ms based on measurements on duovero.
+		 */
+		usleep_range(10000, 12000);
+
 		/* Sync with the HW */
-		regcache_sync(twl6040->regmap);
+		ret = regcache_sync(twl6040->regmap);
+		if (ret) {
+			dev_err(twl6040->dev, "Failed to sync with the HW: %i\n",
+				ret);
+			goto out;
+		}
 
 		/* Default PLL configuration after power up */
 		twl6040->pll = TWL6040_SYSCLK_SEL_LPPLL;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/misc/pci_endpoint_test.c linux-libre-5.1.10-gnu/drivers/misc/pci_endpoint_test.c
--- linux-libre-5.1.9-gnu/drivers/misc/pci_endpoint_test.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/misc/pci_endpoint_test.c	2019-06-15 05:53:06.000000000 -0400
@@ -662,6 +662,7 @@ static int pci_endpoint_test_probe(struc
 	data = (struct pci_endpoint_test_data *)ent->driver_data;
 	if (data) {
 		test_reg_bar = data->test_reg_bar;
+		test->test_reg_bar = test_reg_bar;
 		test->alignment = data->alignment;
 		irq_type = data->irq_type;
 	}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/mmc/host/mmci.c linux-libre-5.1.10-gnu/drivers/mmc/host/mmci.c
--- linux-libre-5.1.9-gnu/drivers/mmc/host/mmci.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/mmc/host/mmci.c	2019-06-15 05:53:06.000000000 -0400
@@ -1550,9 +1550,10 @@ static irqreturn_t mmci_irq(int irq, voi
 		}
 
 		/*
-		 * Don't poll for busy completion in irq context.
+		 * Busy detection has been handled by mmci_cmd_irq() above.
+		 * Clear the status bit to prevent polling in IRQ context.
 		 */
-		if (host->variant->busy_detect && host->busy_status)
+		if (host->variant->busy_detect_flag)
 			status &= ~host->variant->busy_detect_flag;
 
 		ret = 1;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c linux-libre-5.1.10-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
--- linux-libre-5.1.9-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c	2019-06-15 05:53:06.000000000 -0400
@@ -5942,8 +5942,11 @@ int hclge_add_uc_addr_common(struct hclg
 	}
 
 	/* check if we just hit the duplicate */
-	if (!ret)
-		ret = -EINVAL;
+	if (!ret) {
+		dev_warn(&hdev->pdev->dev, "VF %d mac(%pM) exists\n",
+			 vport->vport_id, addr);
+		return 0;
+	}
 
 	dev_err(&hdev->pdev->dev,
 		"PF failed to add unicast entry(%pM) in the MAC table\n",
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/net/ethernet/intel/i40e/i40e_main.c linux-libre-5.1.10-gnu/drivers/net/ethernet/intel/i40e/i40e_main.c
--- linux-libre-5.1.9-gnu/drivers/net/ethernet/intel/i40e/i40e_main.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/net/ethernet/intel/i40e/i40e_main.c	2019-06-15 05:53:06.000000000 -0400
@@ -6854,10 +6854,12 @@ static int i40e_setup_tc(struct net_devi
 	struct i40e_pf *pf = vsi->back;
 	u8 enabled_tc = 0, num_tc, hw;
 	bool need_reset = false;
+	int old_queue_pairs;
 	int ret = -EINVAL;
 	u16 mode;
 	int i;
 
+	old_queue_pairs = vsi->num_queue_pairs;
 	num_tc = mqprio_qopt->qopt.num_tc;
 	hw = mqprio_qopt->qopt.hw;
 	mode = mqprio_qopt->mode;
@@ -6958,6 +6960,7 @@ config_tc:
 		}
 		ret = i40e_configure_queue_channels(vsi);
 		if (ret) {
+			vsi->num_queue_pairs = old_queue_pairs;
 			netdev_info(netdev,
 				    "Failed configuring queue channels\n");
 			need_reset = true;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/net/ethernet/intel/ice/ice_main.c linux-libre-5.1.10-gnu/drivers/net/ethernet/intel/ice/ice_main.c
--- linux-libre-5.1.9-gnu/drivers/net/ethernet/intel/ice/ice_main.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/net/ethernet/intel/ice/ice_main.c	2019-06-15 05:53:06.000000000 -0400
@@ -528,6 +528,9 @@ void ice_print_link_msg(struct ice_vsi *
 	case ICE_FC_RX_PAUSE:
 		fc = "RX";
 		break;
+	case ICE_FC_NONE:
+		fc = "None";
+		break;
 	default:
 		fc = "Unknown";
 		break;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/net/ethernet/intel/ice/ice_switch.c linux-libre-5.1.10-gnu/drivers/net/ethernet/intel/ice/ice_switch.c
--- linux-libre-5.1.9-gnu/drivers/net/ethernet/intel/ice/ice_switch.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/net/ethernet/intel/ice/ice_switch.c	2019-06-15 05:53:06.000000000 -0400
@@ -643,21 +643,37 @@ static void ice_fill_sw_info(struct ice_
 	     fi->fltr_act == ICE_FWD_TO_VSI_LIST ||
 	     fi->fltr_act == ICE_FWD_TO_Q ||
 	     fi->fltr_act == ICE_FWD_TO_QGRP)) {
-		fi->lb_en = true;
-		/* Do not set lan_en to TRUE if
+		/* Setting LB for prune actions will result in replicated
+		 * packets to the internal switch that will be dropped.
+		 */
+		if (fi->lkup_type != ICE_SW_LKUP_VLAN)
+			fi->lb_en = true;
+
+		/* Set lan_en to TRUE if
 		 * 1. The switch is a VEB AND
 		 * 2
-		 * 2.1 The lookup is MAC with unicast addr for MAC, OR
-		 * 2.2 The lookup is MAC_VLAN with unicast addr for MAC
+		 * 2.1 The lookup is VLAN, OR
+		 * 2.2 The lookup is default port mode, OR
+		 * 2.3 The lookup is MAC with mcast or bcast addr for MAC, OR
+		 * 2.4 The lookup is MAC_VLAN with mcast or bcast addr for MAC.
 		 *
-		 * In all other cases, the LAN enable has to be set to true.
+		 * OR
+		 *
+		 * The switch is a VEPA.
+		 *
+		 * In all other cases, the LAN enable has to be set to false.
 		 */
-		if (!(hw->evb_veb &&
-		      ((fi->lkup_type == ICE_SW_LKUP_MAC &&
-			is_unicast_ether_addr(fi->l_data.mac.mac_addr)) ||
-		       (fi->lkup_type == ICE_SW_LKUP_MAC_VLAN &&
-			is_unicast_ether_addr(fi->l_data.mac_vlan.mac_addr)))))
+		if (hw->evb_veb) {
+			if (fi->lkup_type == ICE_SW_LKUP_VLAN ||
+			    fi->lkup_type == ICE_SW_LKUP_DFLT ||
+			    (fi->lkup_type == ICE_SW_LKUP_MAC &&
+			     !is_unicast_ether_addr(fi->l_data.mac.mac_addr)) ||
+			    (fi->lkup_type == ICE_SW_LKUP_MAC_VLAN &&
+			     !is_unicast_ether_addr(fi->l_data.mac.mac_addr)))
+				fi->lan_en = true;
+		} else {
 			fi->lan_en = true;
+		}
 	}
 }
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/net/thunderbolt.c linux-libre-5.1.10-gnu/drivers/net/thunderbolt.c
--- linux-libre-5.1.9-gnu/drivers/net/thunderbolt.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/net/thunderbolt.c	2019-06-15 05:53:06.000000000 -0400
@@ -1282,6 +1282,7 @@ static int __maybe_unused tbnet_suspend(
 		tbnet_tear_down(net, true);
 	}
 
+	tb_unregister_protocol_handler(&net->handler);
 	return 0;
 }
 
@@ -1290,6 +1291,8 @@ static int __maybe_unused tbnet_resume(s
 	struct tb_service *svc = tb_to_service(dev);
 	struct tbnet *net = tb_service_get_drvdata(svc);
 
+	tb_register_protocol_handler(&net->handler);
+
 	netif_carrier_off(net->dev);
 	if (netif_running(net->dev)) {
 		netif_device_attach(net->dev);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/nvme/host/pci.c linux-libre-5.1.10-gnu/drivers/nvme/host/pci.c
--- linux-libre-5.1.9-gnu/drivers/nvme/host/pci.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/nvme/host/pci.c	2019-06-15 05:53:06.000000000 -0400
@@ -1271,6 +1271,7 @@ static enum blk_eh_timer_return nvme_tim
 	struct nvme_dev *dev = nvmeq->dev;
 	struct request *abort_req;
 	struct nvme_command cmd;
+	bool shutdown = false;
 	u32 csts = readl(dev->bar + NVME_REG_CSTS);
 
 	/* If PCI error recovery process is happening, we cannot reset or
@@ -1307,12 +1308,14 @@ static enum blk_eh_timer_return nvme_tim
 	 * shutdown, so we return BLK_EH_DONE.
 	 */
 	switch (dev->ctrl.state) {
+	case NVME_CTRL_DELETING:
+		shutdown = true;
 	case NVME_CTRL_CONNECTING:
 	case NVME_CTRL_RESETTING:
 		dev_warn_ratelimited(dev->ctrl.device,
 			 "I/O %d QID %d timeout, disable controller\n",
 			 req->tag, nvmeq->qid);
-		nvme_dev_disable(dev, false);
+		nvme_dev_disable(dev, shutdown);
 		nvme_req(req)->flags |= NVME_REQ_CANCELLED;
 		return BLK_EH_DONE;
 	default:
@@ -2438,8 +2441,11 @@ static void nvme_dev_disable(struct nvme
 	 * must flush all entered requests to their failed completion to avoid
 	 * deadlocking blk-mq hot-cpu notifier.
 	 */
-	if (shutdown)
+	if (shutdown) {
 		nvme_start_queues(&dev->ctrl);
+		if (dev->ctrl.admin_q && !blk_queue_dying(dev->ctrl.admin_q))
+			blk_mq_unquiesce_queue(dev->ctrl.admin_q);
+	}
 	mutex_unlock(&dev->shutdown_lock);
 }
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/nvmem/core.c linux-libre-5.1.10-gnu/drivers/nvmem/core.c
--- linux-libre-5.1.9-gnu/drivers/nvmem/core.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/nvmem/core.c	2019-06-15 05:53:06.000000000 -0400
@@ -1166,7 +1166,7 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put);
 static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
 {
 	u8 *p, *b;
-	int i, bit_offset = cell->bit_offset;
+	int i, extra, bit_offset = cell->bit_offset;
 
 	p = b = buf;
 	if (bit_offset) {
@@ -1181,11 +1181,16 @@ static void nvmem_shift_read_buffer_in_p
 			p = b;
 			*b++ >>= bit_offset;
 		}
-
-		/* result fits in less bytes */
-		if (cell->bytes != DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE))
-			*p-- = 0;
+	} else {
+		/* point to the msb */
+		p += cell->bytes - 1;
 	}
+
+	/* result fits in less bytes */
+	extra = cell->bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE);
+	while (--extra >= 0)
+		*p-- = 0;
+
 	/* clear msb bits if any leftover in the last byte */
 	*p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0);
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/nvmem/sunxi_sid.c linux-libre-5.1.10-gnu/drivers/nvmem/sunxi_sid.c
--- linux-libre-5.1.9-gnu/drivers/nvmem/sunxi_sid.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/nvmem/sunxi_sid.c	2019-06-15 05:53:06.000000000 -0400
@@ -222,8 +222,10 @@ static const struct sunxi_sid_cfg sun50i
 static const struct of_device_id sunxi_sid_of_match[] = {
 	{ .compatible = "allwinner,sun4i-a10-sid", .data = &sun4i_a10_cfg },
 	{ .compatible = "allwinner,sun7i-a20-sid", .data = &sun7i_a20_cfg },
+	{ .compatible = "allwinner,sun8i-a83t-sid", .data = &sun50i_a64_cfg },
 	{ .compatible = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_cfg },
 	{ .compatible = "allwinner,sun50i-a64-sid", .data = &sun50i_a64_cfg },
+	{ .compatible = "allwinner,sun50i-h5-sid", .data = &sun50i_a64_cfg },
 	{/* sentinel */},
 };
 MODULE_DEVICE_TABLE(of, sunxi_sid_of_match);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pcie-designware-ep.c linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pcie-designware-ep.c
--- linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pcie-designware-ep.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pcie-designware-ep.c	2019-06-15 05:53:06.000000000 -0400
@@ -397,6 +397,7 @@ int dw_pcie_ep_raise_msi_irq(struct dw_p
 {
 	struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
 	struct pci_epc *epc = ep->epc;
+	unsigned int aligned_offset;
 	u16 msg_ctrl, msg_data;
 	u32 msg_addr_lower, msg_addr_upper, reg;
 	u64 msg_addr;
@@ -422,13 +423,15 @@ int dw_pcie_ep_raise_msi_irq(struct dw_p
 		reg = ep->msi_cap + PCI_MSI_DATA_32;
 		msg_data = dw_pcie_readw_dbi(pci, reg);
 	}
-	msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower;
+	aligned_offset = msg_addr_lower & (epc->mem->page_size - 1);
+	msg_addr = ((u64)msg_addr_upper) << 32 |
+			(msg_addr_lower & ~aligned_offset);
 	ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
 				  epc->mem->page_size);
 	if (ret)
 		return ret;
 
-	writel(msg_data | (interrupt_num - 1), ep->msi_mem);
+	writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
 
 	dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pcie-designware.h linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pcie-designware.h
--- linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pcie-designware.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pcie-designware.h	2019-06-15 05:53:06.000000000 -0400
@@ -179,6 +179,7 @@ struct pcie_port {
 	struct irq_domain	*irq_domain;
 	struct irq_domain	*msi_domain;
 	dma_addr_t		msi_data;
+	struct page		*msi_page;
 	u32			num_vectors;
 	u32			irq_mask[MAX_MSI_CTRLS];
 	raw_spinlock_t		lock;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pcie-designware-host.c linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pcie-designware-host.c
--- linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pcie-designware-host.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pcie-designware-host.c	2019-06-15 05:53:06.000000000 -0400
@@ -303,20 +303,24 @@ void dw_pcie_free_msi(struct pcie_port *
 
 	irq_domain_remove(pp->msi_domain);
 	irq_domain_remove(pp->irq_domain);
+
+	if (pp->msi_page)
+		__free_page(pp->msi_page);
 }
 
 void dw_pcie_msi_init(struct pcie_port *pp)
 {
 	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
 	struct device *dev = pci->dev;
-	struct page *page;
 	u64 msi_target;
 
-	page = alloc_page(GFP_KERNEL);
-	pp->msi_data = dma_map_page(dev, page, 0, PAGE_SIZE, DMA_FROM_DEVICE);
+	pp->msi_page = alloc_page(GFP_KERNEL);
+	pp->msi_data = dma_map_page(dev, pp->msi_page, 0, PAGE_SIZE,
+				    DMA_FROM_DEVICE);
 	if (dma_mapping_error(dev, pp->msi_data)) {
 		dev_err(dev, "Failed to map MSI data\n");
-		__free_page(page);
+		__free_page(pp->msi_page);
+		pp->msi_page = NULL;
 		return;
 	}
 	msi_target = (u64)pp->msi_data;
@@ -439,7 +443,7 @@ int dw_pcie_host_init(struct pcie_port *
 	if (ret)
 		pci->num_viewport = 2;
 
-	if (IS_ENABLED(CONFIG_PCI_MSI) && pci_msi_enabled()) {
+	if (pci_msi_enabled()) {
 		/*
 		 * If a specific SoC driver needs to change the
 		 * default number of vectors, it needs to implement
@@ -477,7 +481,7 @@ int dw_pcie_host_init(struct pcie_port *
 	if (pp->ops->host_init) {
 		ret = pp->ops->host_init(pp);
 		if (ret)
-			goto error;
+			goto err_free_msi;
 	}
 
 	pp->root_bus_nr = pp->busn->start;
@@ -491,7 +495,7 @@ int dw_pcie_host_init(struct pcie_port *
 
 	ret = pci_scan_root_bus_bridge(bridge);
 	if (ret)
-		goto error;
+		goto err_free_msi;
 
 	bus = bridge->bus;
 
@@ -507,6 +511,9 @@ int dw_pcie_host_init(struct pcie_port *
 	pci_bus_add_devices(bus);
 	return 0;
 
+err_free_msi:
+	if (pci_msi_enabled() && !pp->ops->msi_host_init)
+		dw_pcie_free_msi(pp);
 error:
 	pci_free_host_bridge(bridge);
 	return ret;
@@ -646,17 +653,19 @@ void dw_pcie_setup_rc(struct pcie_port *
 
 	dw_pcie_setup(pci);
 
-	num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
+	if (!pp->ops->msi_host_init) {
+		num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
 
-	/* Initialize IRQ Status array */
-	for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
-		pp->irq_mask[ctrl] = ~0;
-		dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK +
-					(ctrl * MSI_REG_CTRL_BLOCK_SIZE),
-				    4, pp->irq_mask[ctrl]);
-		dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE +
-					(ctrl * MSI_REG_CTRL_BLOCK_SIZE),
-				    4, ~0);
+		/* Initialize IRQ Status array */
+		for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
+			pp->irq_mask[ctrl] = ~0;
+			dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK +
+					    (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
+					    4, pp->irq_mask[ctrl]);
+			dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE +
+					    (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
+					    4, ~0);
+		}
 	}
 
 	/* Setup RC BARs */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pci-keystone.c linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pci-keystone.c
--- linux-libre-5.1.9-gnu/drivers/pci/controller/dwc/pci-keystone.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/controller/dwc/pci-keystone.c	2019-06-15 05:53:06.000000000 -0400
@@ -705,6 +705,7 @@ static void ks_pcie_setup_interrupts(str
 		ks_pcie_enable_error_irq(ks_pcie);
 }
 
+#ifdef CONFIG_ARM
 /*
  * When a PCI device does not exist during config cycles, keystone host gets a
  * bus error instead of returning 0xffffffff. This handler always returns 0
@@ -724,6 +725,7 @@ static int ks_pcie_fault(unsigned long a
 
 	return 0;
 }
+#endif
 
 static int __init ks_pcie_init_id(struct keystone_pcie *ks_pcie)
 {
@@ -766,12 +768,14 @@ static int __init ks_pcie_host_init(stru
 	if (ret < 0)
 		return ret;
 
+#ifdef CONFIG_ARM
 	/*
 	 * PCIe access errors that result into OCP errors are caught by ARM as
 	 * "External aborts"
 	 */
 	hook_fault_code(17, ks_pcie_fault, SIGBUS, 0,
 			"Asynchronous external abort");
+#endif
 
 	return 0;
 }
@@ -873,6 +877,10 @@ static int ks_pcie_enable_phy(struct key
 	int num_lanes = ks_pcie->num_lanes;
 
 	for (i = 0; i < num_lanes; i++) {
+		ret = phy_reset(ks_pcie->phy[i]);
+		if (ret < 0)
+			goto err_phy;
+
 		ret = phy_init(ks_pcie->phy[i]);
 		if (ret < 0)
 			goto err_phy;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/controller/pcie-rcar.c linux-libre-5.1.10-gnu/drivers/pci/controller/pcie-rcar.c
--- linux-libre-5.1.9-gnu/drivers/pci/controller/pcie-rcar.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/controller/pcie-rcar.c	2019-06-15 05:53:06.000000000 -0400
@@ -892,7 +892,7 @@ static int rcar_pcie_enable_msi(struct r
 {
 	struct device *dev = pcie->dev;
 	struct rcar_msi *msi = &pcie->msi;
-	unsigned long base;
+	phys_addr_t base;
 	int err, i;
 
 	mutex_init(&msi->lock);
@@ -931,10 +931,14 @@ static int rcar_pcie_enable_msi(struct r
 
 	/* setup MSI data target */
 	msi->pages = __get_free_pages(GFP_KERNEL, 0);
+	if (!msi->pages) {
+		err = -ENOMEM;
+		goto err;
+	}
 	base = virt_to_phys((void *)msi->pages);
 
-	rcar_pci_write_reg(pcie, base | MSIFE, PCIEMSIALR);
-	rcar_pci_write_reg(pcie, 0, PCIEMSIAUR);
+	rcar_pci_write_reg(pcie, lower_32_bits(base) | MSIFE, PCIEMSIALR);
+	rcar_pci_write_reg(pcie, upper_32_bits(base), PCIEMSIAUR);
 
 	/* enable all MSI interrupts */
 	rcar_pci_write_reg(pcie, 0xffffffff, PCIEMSIIER);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/controller/pcie-xilinx.c linux-libre-5.1.10-gnu/drivers/pci/controller/pcie-xilinx.c
--- linux-libre-5.1.9-gnu/drivers/pci/controller/pcie-xilinx.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/controller/pcie-xilinx.c	2019-06-15 05:53:06.000000000 -0400
@@ -336,14 +336,19 @@ static const struct irq_domain_ops msi_d
  * xilinx_pcie_enable_msi - Enable MSI support
  * @port: PCIe port information
  */
-static void xilinx_pcie_enable_msi(struct xilinx_pcie_port *port)
+static int xilinx_pcie_enable_msi(struct xilinx_pcie_port *port)
 {
 	phys_addr_t msg_addr;
 
 	port->msi_pages = __get_free_pages(GFP_KERNEL, 0);
+	if (!port->msi_pages)
+		return -ENOMEM;
+
 	msg_addr = virt_to_phys((void *)port->msi_pages);
 	pcie_write(port, 0x0, XILINX_PCIE_REG_MSIBASE1);
 	pcie_write(port, msg_addr, XILINX_PCIE_REG_MSIBASE2);
+
+	return 0;
 }
 
 /* INTx Functions */
@@ -498,6 +503,7 @@ static int xilinx_pcie_init_irq_domain(s
 	struct device *dev = port->dev;
 	struct device_node *node = dev->of_node;
 	struct device_node *pcie_intc_node;
+	int ret;
 
 	/* Setup INTx */
 	pcie_intc_node = of_get_next_child(node, NULL);
@@ -526,7 +532,9 @@ static int xilinx_pcie_init_irq_domain(s
 			return -ENODEV;
 		}
 
-		xilinx_pcie_enable_msi(port);
+		ret = xilinx_pcie_enable_msi(port);
+		if (ret)
+			return ret;
 	}
 
 	return 0;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/hotplug/rpadlpar_core.c linux-libre-5.1.10-gnu/drivers/pci/hotplug/rpadlpar_core.c
--- linux-libre-5.1.9-gnu/drivers/pci/hotplug/rpadlpar_core.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/hotplug/rpadlpar_core.c	2019-06-15 05:53:06.000000000 -0400
@@ -51,6 +51,7 @@ static struct device_node *find_vio_slot
 		if (rc == 0)
 			break;
 	}
+	of_node_put(parent);
 
 	return dn;
 }
@@ -71,6 +72,7 @@ static struct device_node *find_php_slot
 	return np;
 }
 
+/* Returns a device_node with its reference count incremented */
 static struct device_node *find_dlpar_node(char *drc_name, int *node_type)
 {
 	struct device_node *dn;
@@ -306,6 +308,7 @@ int dlpar_add_slot(char *drc_name)
 			rc = dlpar_add_phb(drc_name, dn);
 			break;
 	}
+	of_node_put(dn);
 
 	printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name);
 exit:
@@ -439,6 +442,7 @@ int dlpar_remove_slot(char *drc_name)
 			rc = dlpar_remove_pci_slot(drc_name, dn);
 			break;
 	}
+	of_node_put(dn);
 	vm_unmap_aliases();
 
 	printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pci/switch/switchtec.c linux-libre-5.1.10-gnu/drivers/pci/switch/switchtec.c
--- linux-libre-5.1.9-gnu/drivers/pci/switch/switchtec.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pci/switch/switchtec.c	2019-06-15 05:53:06.000000000 -0400
@@ -1162,7 +1162,8 @@ static int mask_event(struct switchtec_d
 	if (!(hdr & SWITCHTEC_EVENT_OCCURRED && hdr & SWITCHTEC_EVENT_EN_IRQ))
 		return 0;
 
-	if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE)
+	if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE ||
+	    eid == SWITCHTEC_IOCTL_EVENT_MRPC_COMP)
 		return 0;
 
 	dev_dbg(&stdev->dev, "%s: %d %d %x\n", __func__, eid, idx, hdr);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pinctrl/intel/pinctrl-intel.c linux-libre-5.1.10-gnu/drivers/pinctrl/intel/pinctrl-intel.c
--- linux-libre-5.1.9-gnu/drivers/pinctrl/intel/pinctrl-intel.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pinctrl/intel/pinctrl-intel.c	2019-06-15 05:53:06.000000000 -0400
@@ -1466,7 +1466,7 @@ static bool intel_pinctrl_should_save(st
 	return false;
 }
 
-int intel_pinctrl_suspend(struct device *dev)
+int intel_pinctrl_suspend_noirq(struct device *dev)
 {
 	struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
 	struct intel_community_context *communities;
@@ -1505,7 +1505,7 @@ int intel_pinctrl_suspend(struct device
 
 	return 0;
 }
-EXPORT_SYMBOL_GPL(intel_pinctrl_suspend);
+EXPORT_SYMBOL_GPL(intel_pinctrl_suspend_noirq);
 
 static void intel_gpio_irq_init(struct intel_pinctrl *pctrl)
 {
@@ -1527,7 +1527,7 @@ static void intel_gpio_irq_init(struct i
 	}
 }
 
-int intel_pinctrl_resume(struct device *dev)
+int intel_pinctrl_resume_noirq(struct device *dev)
 {
 	struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
 	const struct intel_community_context *communities;
@@ -1589,7 +1589,7 @@ int intel_pinctrl_resume(struct device *
 
 	return 0;
 }
-EXPORT_SYMBOL_GPL(intel_pinctrl_resume);
+EXPORT_SYMBOL_GPL(intel_pinctrl_resume_noirq);
 #endif
 
 MODULE_AUTHOR("Mathias Nyman <mathias.nyman@linux.intel.com>");
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pinctrl/intel/pinctrl-intel.h linux-libre-5.1.10-gnu/drivers/pinctrl/intel/pinctrl-intel.h
--- linux-libre-5.1.9-gnu/drivers/pinctrl/intel/pinctrl-intel.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pinctrl/intel/pinctrl-intel.h	2019-06-15 05:53:06.000000000 -0400
@@ -177,13 +177,14 @@ int intel_pinctrl_probe_by_hid(struct pl
 int intel_pinctrl_probe_by_uid(struct platform_device *pdev);
 
 #ifdef CONFIG_PM_SLEEP
-int intel_pinctrl_suspend(struct device *dev);
-int intel_pinctrl_resume(struct device *dev);
+int intel_pinctrl_suspend_noirq(struct device *dev);
+int intel_pinctrl_resume_noirq(struct device *dev);
 #endif
 
-#define INTEL_PINCTRL_PM_OPS(_name)						  \
-const struct dev_pm_ops _name = {						  \
-	SET_LATE_SYSTEM_SLEEP_PM_OPS(intel_pinctrl_suspend, intel_pinctrl_resume) \
+#define INTEL_PINCTRL_PM_OPS(_name)					\
+const struct dev_pm_ops _name = {					\
+	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(intel_pinctrl_suspend_noirq,	\
+				      intel_pinctrl_resume_noirq)	\
 }
 
 #endif /* PINCTRL_INTEL_H */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/platform/chrome/cros_ec_proto.c linux-libre-5.1.10-gnu/drivers/platform/chrome/cros_ec_proto.c
--- linux-libre-5.1.9-gnu/drivers/platform/chrome/cros_ec_proto.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/platform/chrome/cros_ec_proto.c	2019-06-15 05:53:06.000000000 -0400
@@ -56,6 +56,17 @@ static int send_command(struct cros_ec_d
 	else
 		xfer_fxn = ec_dev->cmd_xfer;
 
+	if (!xfer_fxn) {
+		/*
+		 * This error can happen if a communication error happened and
+		 * the EC is trying to use protocol v2, on an underlying
+		 * communication mechanism that does not support v2.
+		 */
+		dev_err_once(ec_dev->dev,
+			     "missing EC transfer API, cannot send command\n");
+		return -EIO;
+	}
+
 	ret = (*xfer_fxn)(ec_dev, msg);
 	if (msg->result == EC_RES_IN_PROGRESS) {
 		int i;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/platform/x86/intel_pmc_ipc.c linux-libre-5.1.10-gnu/drivers/platform/x86/intel_pmc_ipc.c
--- linux-libre-5.1.9-gnu/drivers/platform/x86/intel_pmc_ipc.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/platform/x86/intel_pmc_ipc.c	2019-06-15 05:53:06.000000000 -0400
@@ -771,13 +771,17 @@ static int ipc_create_pmc_devices(void)
 	if (ret) {
 		dev_err(ipcdev.dev, "Failed to add punit platform device\n");
 		platform_device_unregister(ipcdev.tco_dev);
+		return ret;
 	}
 
 	if (!ipcdev.telem_res_inval) {
 		ret = ipc_create_telemetry_device();
-		if (ret)
+		if (ret) {
 			dev_warn(ipcdev.dev,
 				"Failed to add telemetry platform device\n");
+			platform_device_unregister(ipcdev.punit_dev);
+			platform_device_unregister(ipcdev.tco_dev);
+		}
 	}
 
 	return ret;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/power/supply/cpcap-battery.c linux-libre-5.1.10-gnu/drivers/power/supply/cpcap-battery.c
--- linux-libre-5.1.9-gnu/drivers/power/supply/cpcap-battery.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/power/supply/cpcap-battery.c	2019-06-15 05:53:06.000000000 -0400
@@ -82,7 +82,7 @@ struct cpcap_battery_config {
 };
 
 struct cpcap_coulomb_counter_data {
-	s32 sample;		/* 24-bits */
+	s32 sample;		/* 24 or 32 bits */
 	s32 accumulator;
 	s16 offset;		/* 10-bits */
 };
@@ -213,7 +213,7 @@ static int cpcap_battery_get_current(str
  * TI or ST coulomb counter in the PMIC.
  */
 static int cpcap_battery_cc_raw_div(struct cpcap_battery_ddata *ddata,
-				    u32 sample, s32 accumulator,
+				    s32 sample, s32 accumulator,
 				    s16 offset, u32 divider)
 {
 	s64 acc;
@@ -224,7 +224,6 @@ static int cpcap_battery_cc_raw_div(stru
 	if (!divider)
 		return 0;
 
-	sample &= 0xffffff;		/* 24-bits, unsigned */
 	offset &= 0x7ff;		/* 10-bits, signed */
 
 	switch (ddata->vendor) {
@@ -259,7 +258,7 @@ static int cpcap_battery_cc_raw_div(stru
 
 /* 3600000μAms = 1μAh */
 static int cpcap_battery_cc_to_uah(struct cpcap_battery_ddata *ddata,
-				   u32 sample, s32 accumulator,
+				   s32 sample, s32 accumulator,
 				   s16 offset)
 {
 	return cpcap_battery_cc_raw_div(ddata, sample,
@@ -268,7 +267,7 @@ static int cpcap_battery_cc_to_uah(struc
 }
 
 static int cpcap_battery_cc_to_ua(struct cpcap_battery_ddata *ddata,
-				  u32 sample, s32 accumulator,
+				  s32 sample, s32 accumulator,
 				  s16 offset)
 {
 	return cpcap_battery_cc_raw_div(ddata, sample,
@@ -312,6 +311,8 @@ cpcap_battery_read_accumulated(struct cp
 	/* Sample value CPCAP_REG_CCS1 & 2 */
 	ccd->sample = (buf[1] & 0x0fff) << 16;
 	ccd->sample |= buf[0];
+	if (ddata->vendor == CPCAP_VENDOR_TI)
+		ccd->sample = sign_extend32(24, ccd->sample);
 
 	/* Accumulator value CPCAP_REG_CCA1 & 2 */
 	ccd->accumulator = ((s16)buf[3]) << 16;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/power/supply/max14656_charger_detector.c linux-libre-5.1.10-gnu/drivers/power/supply/max14656_charger_detector.c
--- linux-libre-5.1.9-gnu/drivers/power/supply/max14656_charger_detector.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/power/supply/max14656_charger_detector.c	2019-06-15 05:53:06.000000000 -0400
@@ -280,6 +280,13 @@ static int max14656_probe(struct i2c_cli
 
 	INIT_DELAYED_WORK(&chip->irq_work, max14656_irq_worker);
 
+	chip->detect_psy = devm_power_supply_register(dev,
+		       &chip->psy_desc, &psy_cfg);
+	if (IS_ERR(chip->detect_psy)) {
+		dev_err(dev, "power_supply_register failed\n");
+		return -EINVAL;
+	}
+
 	ret = devm_request_irq(dev, chip->irq, max14656_irq,
 			       IRQF_TRIGGER_FALLING,
 			       MAX14656_NAME, chip);
@@ -289,13 +296,6 @@ static int max14656_probe(struct i2c_cli
 	}
 	enable_irq_wake(chip->irq);
 
-	chip->detect_psy = devm_power_supply_register(dev,
-		       &chip->psy_desc, &psy_cfg);
-	if (IS_ERR(chip->detect_psy)) {
-		dev_err(dev, "power_supply_register failed\n");
-		return -EINVAL;
-	}
-
 	schedule_delayed_work(&chip->irq_work, msecs_to_jiffies(2000));
 
 	return 0;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pwm/core.c linux-libre-5.1.10-gnu/drivers/pwm/core.c
--- linux-libre-5.1.9-gnu/drivers/pwm/core.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pwm/core.c	2019-06-15 05:53:06.000000000 -0400
@@ -311,10 +311,12 @@ int pwmchip_add_with_polarity(struct pwm
 	if (IS_ENABLED(CONFIG_OF))
 		of_pwmchip_add(chip);
 
-	pwmchip_sysfs_export(chip);
-
 out:
 	mutex_unlock(&pwm_lock);
+
+	if (!ret)
+		pwmchip_sysfs_export(chip);
+
 	return ret;
 }
 EXPORT_SYMBOL_GPL(pwmchip_add_with_polarity);
@@ -348,7 +350,7 @@ int pwmchip_remove(struct pwm_chip *chip
 	unsigned int i;
 	int ret = 0;
 
-	pwmchip_sysfs_unexport_children(chip);
+	pwmchip_sysfs_unexport(chip);
 
 	mutex_lock(&pwm_lock);
 
@@ -368,8 +370,6 @@ int pwmchip_remove(struct pwm_chip *chip
 
 	free_pwms(chip);
 
-	pwmchip_sysfs_unexport(chip);
-
 out:
 	mutex_unlock(&pwm_lock);
 	return ret;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pwm/pwm-meson.c linux-libre-5.1.10-gnu/drivers/pwm/pwm-meson.c
--- linux-libre-5.1.9-gnu/drivers/pwm/pwm-meson.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pwm/pwm-meson.c	2019-06-15 05:53:06.000000000 -0400
@@ -111,6 +111,10 @@ struct meson_pwm {
 	const struct meson_pwm_data *data;
 	void __iomem *base;
 	u8 inverter_mask;
+	/*
+	 * Protects register (write) access to the REG_MISC_AB register
+	 * that is shared between the two PWMs.
+	 */
 	spinlock_t lock;
 };
 
@@ -235,6 +239,7 @@ static void meson_pwm_enable(struct meso
 {
 	u32 value, clk_shift, clk_enable, enable;
 	unsigned int offset;
+	unsigned long flags;
 
 	switch (id) {
 	case 0:
@@ -255,6 +260,8 @@ static void meson_pwm_enable(struct meso
 		return;
 	}
 
+	spin_lock_irqsave(&meson->lock, flags);
+
 	value = readl(meson->base + REG_MISC_AB);
 	value &= ~(MISC_CLK_DIV_MASK << clk_shift);
 	value |= channel->pre_div << clk_shift;
@@ -267,11 +274,14 @@ static void meson_pwm_enable(struct meso
 	value = readl(meson->base + REG_MISC_AB);
 	value |= enable;
 	writel(value, meson->base + REG_MISC_AB);
+
+	spin_unlock_irqrestore(&meson->lock, flags);
 }
 
 static void meson_pwm_disable(struct meson_pwm *meson, unsigned int id)
 {
 	u32 value, enable;
+	unsigned long flags;
 
 	switch (id) {
 	case 0:
@@ -286,9 +296,13 @@ static void meson_pwm_disable(struct mes
 		return;
 	}
 
+	spin_lock_irqsave(&meson->lock, flags);
+
 	value = readl(meson->base + REG_MISC_AB);
 	value &= ~enable;
 	writel(value, meson->base + REG_MISC_AB);
+
+	spin_unlock_irqrestore(&meson->lock, flags);
 }
 
 static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
@@ -296,19 +310,16 @@ static int meson_pwm_apply(struct pwm_ch
 {
 	struct meson_pwm_channel *channel = pwm_get_chip_data(pwm);
 	struct meson_pwm *meson = to_meson_pwm(chip);
-	unsigned long flags;
 	int err = 0;
 
 	if (!state)
 		return -EINVAL;
 
-	spin_lock_irqsave(&meson->lock, flags);
-
 	if (!state->enabled) {
 		meson_pwm_disable(meson, pwm->hwpwm);
 		channel->state.enabled = false;
 
-		goto unlock;
+		return 0;
 	}
 
 	if (state->period != channel->state.period ||
@@ -329,7 +340,7 @@ static int meson_pwm_apply(struct pwm_ch
 		err = meson_pwm_calc(meson, channel, pwm->hwpwm,
 				     state->duty_cycle, state->period);
 		if (err < 0)
-			goto unlock;
+			return err;
 
 		channel->state.polarity = state->polarity;
 		channel->state.period = state->period;
@@ -341,9 +352,7 @@ static int meson_pwm_apply(struct pwm_ch
 		channel->state.enabled = true;
 	}
 
-unlock:
-	spin_unlock_irqrestore(&meson->lock, flags);
-	return err;
+	return 0;
 }
 
 static void meson_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pwm/pwm-tiehrpwm.c linux-libre-5.1.10-gnu/drivers/pwm/pwm-tiehrpwm.c
--- linux-libre-5.1.9-gnu/drivers/pwm/pwm-tiehrpwm.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pwm/pwm-tiehrpwm.c	2019-06-15 05:53:06.000000000 -0400
@@ -382,6 +382,8 @@ static void ehrpwm_pwm_disable(struct pw
 	}
 
 	/* Update shadow register first before modifying active register */
+	ehrpwm_modify(pc->mmio_base, AQSFRC, AQSFRC_RLDCSF_MASK,
+		      AQSFRC_RLDCSF_ZRO);
 	ehrpwm_modify(pc->mmio_base, AQCSFRC, aqcsfrc_mask, aqcsfrc_val);
 	/*
 	 * Changes to immediate action on Action Qualifier. This puts
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/pwm/sysfs.c linux-libre-5.1.10-gnu/drivers/pwm/sysfs.c
--- linux-libre-5.1.9-gnu/drivers/pwm/sysfs.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/pwm/sysfs.c	2019-06-15 05:53:06.000000000 -0400
@@ -411,19 +411,6 @@ void pwmchip_sysfs_export(struct pwm_chi
 void pwmchip_sysfs_unexport(struct pwm_chip *chip)
 {
 	struct device *parent;
-
-	parent = class_find_device(&pwm_class, NULL, chip,
-				   pwmchip_sysfs_match);
-	if (parent) {
-		/* for class_find_device() */
-		put_device(parent);
-		device_unregister(parent);
-	}
-}
-
-void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
-{
-	struct device *parent;
 	unsigned int i;
 
 	parent = class_find_device(&pwm_class, NULL, chip,
@@ -439,6 +426,7 @@ void pwmchip_sysfs_unexport_children(str
 	}
 
 	put_device(parent);
+	device_unregister(parent);
 }
 
 static int __init pwm_sysfs_init(void)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/rapidio/rio_cm.c linux-libre-5.1.10-gnu/drivers/rapidio/rio_cm.c
--- linux-libre-5.1.9-gnu/drivers/rapidio/rio_cm.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/rapidio/rio_cm.c	2019-06-15 05:53:06.000000000 -0400
@@ -2147,6 +2147,14 @@ static int riocm_add_mport(struct device
 	mutex_init(&cm->rx_lock);
 	riocm_rx_fill(cm, RIOCM_RX_RING_SIZE);
 	cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
+	if (!cm->rx_wq) {
+		riocm_error("failed to allocate IBMBOX_%d on %s",
+			    cmbox, mport->name);
+		rio_release_outb_mbox(mport, cmbox);
+		kfree(cm);
+		return -ENOMEM;
+	}
+
 	INIT_WORK(&cm->rx_work, rio_ibmsg_handler);
 
 	cm->tx_slot = 0;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/scsi/qla2xxx/qla_gs.c linux-libre-5.1.10-gnu/drivers/scsi/qla2xxx/qla_gs.c
--- linux-libre-5.1.9-gnu/drivers/scsi/qla2xxx/qla_gs.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/scsi/qla2xxx/qla_gs.c	2019-06-15 05:53:06.000000000 -0400
@@ -3031,6 +3031,8 @@ static void qla24xx_async_gpsc_sp_done(v
 	    "Async done-%s res %x, WWPN %8phC \n",
 	    sp->name, res, fcport->port_name);
 
+	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
+
 	if (res == QLA_FUNCTION_TIMEOUT)
 		return;
 
@@ -4370,6 +4372,7 @@ int qla24xx_async_gnnid(scsi_qla_host_t
 
 done_free_sp:
 	sp->free(sp);
+	fcport->flags &= ~FCF_ASYNC_SENT;
 done:
 	return rval;
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/soc/mediatek/mtk-pmic-wrap.c linux-libre-5.1.10-gnu/drivers/soc/mediatek/mtk-pmic-wrap.c
--- linux-libre-5.1.9-gnu/drivers/soc/mediatek/mtk-pmic-wrap.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/soc/mediatek/mtk-pmic-wrap.c	2019-06-15 05:53:06.000000000 -0400
@@ -1281,7 +1281,7 @@ static bool pwrap_is_pmic_cipher_ready(s
 static int pwrap_init_cipher(struct pmic_wrapper *wrp)
 {
 	int ret;
-	u32 rdata;
+	u32 rdata = 0;
 
 	pwrap_writel(wrp, 0x1, PWRAP_CIPHER_SWRST);
 	pwrap_writel(wrp, 0x0, PWRAP_CIPHER_SWRST);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/soc/renesas/renesas-soc.c linux-libre-5.1.10-gnu/drivers/soc/renesas/renesas-soc.c
--- linux-libre-5.1.9-gnu/drivers/soc/renesas/renesas-soc.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/soc/renesas/renesas-soc.c	2019-06-15 05:53:06.000000000 -0400
@@ -335,6 +335,9 @@ static int __init renesas_soc_init(void)
 		/* R-Car M3-W ES1.1 incorrectly identifies as ES2.0 */
 		if ((product & 0x7fff) == 0x5210)
 			product ^= 0x11;
+		/* R-Car M3-W ES1.3 incorrectly identifies as ES2.1 */
+		if ((product & 0x7fff) == 0x5211)
+			product ^= 0x12;
 		if (soc->id && ((product >> 8) & 0xff) != soc->id) {
 			pr_warn("SoC mismatch (product = 0x%x)\n", product);
 			return -ENODEV;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/soc/rockchip/grf.c linux-libre-5.1.10-gnu/drivers/soc/rockchip/grf.c
--- linux-libre-5.1.9-gnu/drivers/soc/rockchip/grf.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/soc/rockchip/grf.c	2019-06-15 05:53:06.000000000 -0400
@@ -66,9 +66,11 @@ static const struct rockchip_grf_info rk
 };
 
 #define RK3288_GRF_SOC_CON0		0x244
+#define RK3288_GRF_SOC_CON2		0x24c
 
 static const struct rockchip_grf_value rk3288_defaults[] __initconst = {
 	{ "jtag switching", RK3288_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 12) },
+	{ "pwm select", RK3288_GRF_SOC_CON2, HIWORD_UPDATE(1, 1, 0) },
 };
 
 static const struct rockchip_grf_info rk3288_grf __initconst = {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/soc/tegra/pmc.c linux-libre-5.1.10-gnu/drivers/soc/tegra/pmc.c
--- linux-libre-5.1.9-gnu/drivers/soc/tegra/pmc.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/soc/tegra/pmc.c	2019-06-15 05:53:06.000000000 -0400
@@ -1999,7 +1999,7 @@ static int tegra_pmc_probe(struct platfo
 	if (IS_ENABLED(CONFIG_DEBUG_FS)) {
 		err = tegra_powergate_debugfs_init();
 		if (err < 0)
-			return err;
+			goto cleanup_sysfs;
 	}
 
 	err = register_restart_handler(&tegra_pmc_restart_handler);
@@ -2030,6 +2030,9 @@ cleanup_restart_handler:
 	unregister_restart_handler(&tegra_pmc_restart_handler);
 cleanup_debugfs:
 	debugfs_remove(pmc->debugfs);
+cleanup_sysfs:
+	device_remove_file(&pdev->dev, &dev_attr_reset_reason);
+	device_remove_file(&pdev->dev, &dev_attr_reset_level);
 	return err;
 }
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/spi/spi-pxa2xx.c linux-libre-5.1.10-gnu/drivers/spi/spi-pxa2xx.c
--- linux-libre-5.1.9-gnu/drivers/spi/spi-pxa2xx.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/spi/spi-pxa2xx.c	2019-06-15 05:53:06.000000000 -0400
@@ -1491,12 +1491,7 @@ static int pxa2xx_spi_get_port_id(struct
 
 static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
 {
-	struct device *dev = param;
-
-	if (dev != chan->device->dev->parent)
-		return false;
-
-	return true;
+	return param == chan->device->dev;
 }
 
 #endif /* CONFIG_PCI */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/staging/media/rockchip/vpu/rockchip_vpu_drv.c linux-libre-5.1.10-gnu/drivers/staging/media/rockchip/vpu/rockchip_vpu_drv.c
--- linux-libre-5.1.9-gnu/drivers/staging/media/rockchip/vpu/rockchip_vpu_drv.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/staging/media/rockchip/vpu/rockchip_vpu_drv.c	2019-06-15 05:53:06.000000000 -0400
@@ -481,15 +481,18 @@ static int rockchip_vpu_probe(struct pla
 	return 0;
 err_video_dev_unreg:
 	if (vpu->vfd_enc) {
+		v4l2_m2m_unregister_media_controller(vpu->m2m_dev);
 		video_unregister_device(vpu->vfd_enc);
 		video_device_release(vpu->vfd_enc);
 	}
 err_m2m_rel:
+	media_device_cleanup(&vpu->mdev);
 	v4l2_m2m_release(vpu->m2m_dev);
 err_v4l2_unreg:
 	v4l2_device_unregister(&vpu->v4l2_dev);
 err_clk_unprepare:
 	clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks);
+	pm_runtime_dont_use_autosuspend(vpu->dev);
 	pm_runtime_disable(vpu->dev);
 	return ret;
 }
@@ -501,15 +504,16 @@ static int rockchip_vpu_remove(struct pl
 	v4l2_info(&vpu->v4l2_dev, "Removing %s\n", pdev->name);
 
 	media_device_unregister(&vpu->mdev);
-	v4l2_m2m_unregister_media_controller(vpu->m2m_dev);
-	v4l2_m2m_release(vpu->m2m_dev);
-	media_device_cleanup(&vpu->mdev);
 	if (vpu->vfd_enc) {
+		v4l2_m2m_unregister_media_controller(vpu->m2m_dev);
 		video_unregister_device(vpu->vfd_enc);
 		video_device_release(vpu->vfd_enc);
 	}
+	media_device_cleanup(&vpu->mdev);
+	v4l2_m2m_release(vpu->m2m_dev);
 	v4l2_device_unregister(&vpu->v4l2_dev);
 	clk_bulk_unprepare(vpu->variant->num_clocks, vpu->clocks);
+	pm_runtime_dont_use_autosuspend(vpu->dev);
 	pm_runtime_disable(vpu->dev);
 	return 0;
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/thermal/qcom/tsens.c linux-libre-5.1.10-gnu/drivers/thermal/qcom/tsens.c
--- linux-libre-5.1.9-gnu/drivers/thermal/qcom/tsens.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/thermal/qcom/tsens.c	2019-06-15 05:53:06.000000000 -0400
@@ -160,7 +160,8 @@ static int tsens_probe(struct platform_d
 	if (tmdev->ops->calibrate) {
 		ret = tmdev->ops->calibrate(tmdev);
 		if (ret < 0) {
-			dev_err(dev, "tsens calibration failed\n");
+			if (ret != -EPROBE_DEFER)
+				dev_err(dev, "tsens calibration failed\n");
 			return ret;
 		}
 	}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/thermal/rcar_gen3_thermal.c linux-libre-5.1.10-gnu/drivers/thermal/rcar_gen3_thermal.c
--- linux-libre-5.1.9-gnu/drivers/thermal/rcar_gen3_thermal.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/thermal/rcar_gen3_thermal.c	2019-06-15 05:53:06.000000000 -0400
@@ -331,6 +331,9 @@ MODULE_DEVICE_TABLE(of, rcar_gen3_therma
 static int rcar_gen3_thermal_remove(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
+	struct rcar_gen3_thermal_priv *priv = dev_get_drvdata(dev);
+
+	rcar_thermal_irq_set(priv, false);
 
 	pm_runtime_put(dev);
 	pm_runtime_disable(dev);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/tty/serial/8250/8250_dw.c linux-libre-5.1.10-gnu/drivers/tty/serial/8250/8250_dw.c
--- linux-libre-5.1.9-gnu/drivers/tty/serial/8250/8250_dw.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/tty/serial/8250/8250_dw.c	2019-06-15 05:53:06.000000000 -0400
@@ -365,7 +365,7 @@ static bool dw8250_fallback_dma_filter(s
 
 static bool dw8250_idma_filter(struct dma_chan *chan, void *param)
 {
-	return param == chan->device->dev->parent;
+	return param == chan->device->dev;
 }
 
 /*
@@ -434,7 +434,7 @@ static void dw8250_quirks(struct uart_po
 		data->uart_16550_compatible = true;
 	}
 
-	/* Platforms with iDMA */
+	/* Platforms with iDMA 64-bit */
 	if (platform_get_resource_byname(to_platform_device(p->dev),
 					 IORESOURCE_MEM, "lpss_priv")) {
 		data->dma.rx_param = p->dev->parent;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/usb/host/ohci-da8xx.c linux-libre-5.1.10-gnu/drivers/usb/host/ohci-da8xx.c
--- linux-libre-5.1.9-gnu/drivers/usb/host/ohci-da8xx.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/usb/host/ohci-da8xx.c	2019-06-15 05:53:06.000000000 -0400
@@ -206,12 +206,23 @@ static int ohci_da8xx_regulator_event(st
 	return 0;
 }
 
-static irqreturn_t ohci_da8xx_oc_handler(int irq, void *data)
+static irqreturn_t ohci_da8xx_oc_thread(int irq, void *data)
 {
 	struct da8xx_ohci_hcd *da8xx_ohci = data;
+	struct device *dev = da8xx_ohci->hcd->self.controller;
+	int ret;
 
-	if (gpiod_get_value(da8xx_ohci->oc_gpio))
-		gpiod_set_value(da8xx_ohci->vbus_gpio, 0);
+	if (gpiod_get_value_cansleep(da8xx_ohci->oc_gpio)) {
+		if (da8xx_ohci->vbus_gpio) {
+			gpiod_set_value_cansleep(da8xx_ohci->vbus_gpio, 0);
+		} else if (da8xx_ohci->vbus_reg) {
+			ret = regulator_disable(da8xx_ohci->vbus_reg);
+			if (ret)
+				dev_err(dev,
+					"Failed to disable regulator: %d\n",
+					ret);
+		}
+	}
 
 	return IRQ_HANDLED;
 }
@@ -438,8 +449,9 @@ static int ohci_da8xx_probe(struct platf
 		if (oc_irq < 0)
 			goto err;
 
-		error = devm_request_irq(dev, oc_irq, ohci_da8xx_oc_handler,
-				IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+		error = devm_request_threaded_irq(dev, oc_irq, NULL,
+				ohci_da8xx_oc_thread, IRQF_TRIGGER_RISING |
+				IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
 				"OHCI over-current indicator", da8xx_ohci);
 		if (error)
 			goto err;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/usb/typec/tcpm/fusb302.c linux-libre-5.1.10-gnu/drivers/usb/typec/tcpm/fusb302.c
--- linux-libre-5.1.9-gnu/drivers/usb/typec/tcpm/fusb302.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/usb/typec/tcpm/fusb302.c	2019-06-15 05:53:06.000000000 -0400
@@ -634,6 +634,8 @@ static int fusb302_set_toggling(struct f
 			return ret;
 		chip->intr_togdone = false;
 	} else {
+		/* Datasheet says vconn MUST be off when toggling */
+		WARN(chip->vconn_on, "Vconn is on during toggle start");
 		/* unmask TOGDONE interrupt */
 		ret = fusb302_i2c_clear_bits(chip, FUSB_REG_MASKA,
 					     FUSB_REG_MASKA_TOGDONE);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/vfio/pci/vfio_pci_nvlink2.c linux-libre-5.1.10-gnu/drivers/vfio/pci/vfio_pci_nvlink2.c
--- linux-libre-5.1.9-gnu/drivers/vfio/pci/vfio_pci_nvlink2.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/vfio/pci/vfio_pci_nvlink2.c	2019-06-15 05:53:06.000000000 -0400
@@ -472,6 +472,8 @@ int vfio_pci_ibm_npu2_init(struct vfio_p
 	return 0;
 
 free_exit:
+	if (data->base)
+		memunmap(data->base);
 	kfree(data);
 
 	return ret;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/vfio/vfio.c linux-libre-5.1.10-gnu/drivers/vfio/vfio.c
--- linux-libre-5.1.9-gnu/drivers/vfio/vfio.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/vfio/vfio.c	2019-06-15 05:53:06.000000000 -0400
@@ -34,6 +34,7 @@
 #include <linux/uaccess.h>
 #include <linux/vfio.h>
 #include <linux/wait.h>
+#include <linux/sched/signal.h>
 
 #define DRIVER_VERSION	"0.3"
 #define DRIVER_AUTHOR	"Alex Williamson <alex.williamson@redhat.com>"
@@ -904,30 +905,17 @@ void *vfio_device_data(struct vfio_devic
 }
 EXPORT_SYMBOL_GPL(vfio_device_data);
 
-/* Given a referenced group, check if it contains the device */
-static bool vfio_dev_present(struct vfio_group *group, struct device *dev)
-{
-	struct vfio_device *device;
-
-	device = vfio_group_get_device(group, dev);
-	if (!device)
-		return false;
-
-	vfio_device_put(device);
-	return true;
-}
-
 /*
  * Decrement the device reference count and wait for the device to be
  * removed.  Open file descriptors for the device... */
 void *vfio_del_group_dev(struct device *dev)
 {
+	DEFINE_WAIT_FUNC(wait, woken_wake_function);
 	struct vfio_device *device = dev_get_drvdata(dev);
 	struct vfio_group *group = device->group;
 	void *device_data = device->device_data;
 	struct vfio_unbound_dev *unbound;
 	unsigned int i = 0;
-	long ret;
 	bool interrupted = false;
 
 	/*
@@ -964,6 +952,8 @@ void *vfio_del_group_dev(struct device *
 	 * interval with counter to allow the driver to take escalating
 	 * measures to release the device if it has the ability to do so.
 	 */
+	add_wait_queue(&vfio.release_q, &wait);
+
 	do {
 		device = vfio_group_get_device(group, dev);
 		if (!device)
@@ -975,12 +965,10 @@ void *vfio_del_group_dev(struct device *
 		vfio_device_put(device);
 
 		if (interrupted) {
-			ret = wait_event_timeout(vfio.release_q,
-					!vfio_dev_present(group, dev), HZ * 10);
+			wait_woken(&wait, TASK_UNINTERRUPTIBLE, HZ * 10);
 		} else {
-			ret = wait_event_interruptible_timeout(vfio.release_q,
-					!vfio_dev_present(group, dev), HZ * 10);
-			if (ret == -ERESTARTSYS) {
+			wait_woken(&wait, TASK_INTERRUPTIBLE, HZ * 10);
+			if (signal_pending(current)) {
 				interrupted = true;
 				dev_warn(dev,
 					 "Device is currently in use, task"
@@ -989,8 +977,10 @@ void *vfio_del_group_dev(struct device *
 					 current->comm, task_pid_nr(current));
 			}
 		}
-	} while (ret <= 0);
 
+	} while (1);
+
+	remove_wait_queue(&vfio.release_q, &wait);
 	/*
 	 * In order to support multiple devices per group, devices can be
 	 * plucked from the group while other devices in the group are still
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/video/fbdev/core/fbcon.c linux-libre-5.1.10-gnu/drivers/video/fbdev/core/fbcon.c
--- linux-libre-5.1.9-gnu/drivers/video/fbdev/core/fbcon.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/video/fbdev/core/fbcon.c	2019-06-15 05:53:06.000000000 -0400
@@ -1069,7 +1069,7 @@ static void fbcon_init(struct vc_data *v
 
 	cap = info->flags;
 
-	if (console_loglevel <= CONSOLE_LOGLEVEL_QUIET)
+	if (logo_shown < 0 && console_loglevel <= CONSOLE_LOGLEVEL_QUIET)
 		logo_shown = FBCON_LOGO_DONTSHOW;
 
 	if (vc != svc || logo_shown == FBCON_LOGO_DONTSHOW ||
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/video/fbdev/hgafb.c linux-libre-5.1.10-gnu/drivers/video/fbdev/hgafb.c
--- linux-libre-5.1.9-gnu/drivers/video/fbdev/hgafb.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/video/fbdev/hgafb.c	2019-06-15 05:53:06.000000000 -0400
@@ -285,6 +285,8 @@ static int hga_card_detect(void)
 	hga_vram_len  = 0x08000;
 
 	hga_vram = ioremap(0xb0000, hga_vram_len);
+	if (!hga_vram)
+		goto error;
 
 	if (request_region(0x3b0, 12, "hgafb"))
 		release_io_ports = 1;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/video/fbdev/imsttfb.c linux-libre-5.1.10-gnu/drivers/video/fbdev/imsttfb.c
--- linux-libre-5.1.9-gnu/drivers/video/fbdev/imsttfb.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/video/fbdev/imsttfb.c	2019-06-15 05:53:06.000000000 -0400
@@ -1515,6 +1515,11 @@ static int imsttfb_probe(struct pci_dev
 	info->fix.smem_start = addr;
 	info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
 					    0x400000 : 0x800000);
+	if (!info->screen_base) {
+		release_mem_region(addr, size);
+		framebuffer_release(info);
+		return -ENOMEM;
+	}
 	info->fix.mmio_start = addr + 0x800000;
 	par->dc_regs = ioremap(addr + 0x800000, 0x1000);
 	par->cmap_regs_phys = addr + 0x840000;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/watchdog/imx2_wdt.c linux-libre-5.1.10-gnu/drivers/watchdog/imx2_wdt.c
--- linux-libre-5.1.9-gnu/drivers/watchdog/imx2_wdt.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/watchdog/imx2_wdt.c	2019-06-15 05:53:06.000000000 -0400
@@ -178,8 +178,10 @@ static void __imx2_wdt_set_timeout(struc
 static int imx2_wdt_set_timeout(struct watchdog_device *wdog,
 				unsigned int new_timeout)
 {
-	__imx2_wdt_set_timeout(wdog, new_timeout);
+	unsigned int actual;
 
+	actual = min(new_timeout, wdog->max_hw_heartbeat_ms * 1000);
+	__imx2_wdt_set_timeout(wdog, actual);
 	wdog->timeout = new_timeout;
 	return 0;
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/drivers/watchdog/Kconfig linux-libre-5.1.10-gnu/drivers/watchdog/Kconfig
--- linux-libre-5.1.9-gnu/drivers/watchdog/Kconfig	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/drivers/watchdog/Kconfig	2019-06-15 05:53:06.000000000 -0400
@@ -2028,6 +2028,7 @@ comment "Watchdog Pretimeout Governors"
 
 config WATCHDOG_PRETIMEOUT_GOV
 	bool "Enable watchdog pretimeout governors"
+	depends on WATCHDOG_CORE
 	help
 	  The option allows to select watchdog pretimeout governors.
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/configfs/dir.c linux-libre-5.1.10-gnu/fs/configfs/dir.c
--- linux-libre-5.1.9-gnu/fs/configfs/dir.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/configfs/dir.c	2019-06-15 05:53:06.000000000 -0400
@@ -1755,12 +1755,19 @@ int configfs_register_group(struct confi
 
 	inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
 	ret = create_default_group(parent_group, group);
-	if (!ret) {
-		spin_lock(&configfs_dirent_lock);
-		configfs_dir_set_ready(group->cg_item.ci_dentry->d_fsdata);
-		spin_unlock(&configfs_dirent_lock);
-	}
+	if (ret)
+		goto err_out;
+
+	spin_lock(&configfs_dirent_lock);
+	configfs_dir_set_ready(group->cg_item.ci_dentry->d_fsdata);
+	spin_unlock(&configfs_dirent_lock);
+	inode_unlock(d_inode(parent));
+	return 0;
+err_out:
 	inode_unlock(d_inode(parent));
+	mutex_lock(&subsys->su_mutex);
+	unlink_group(group);
+	mutex_unlock(&subsys->su_mutex);
 	return ret;
 }
 EXPORT_SYMBOL(configfs_register_group);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/dax.c linux-libre-5.1.10-gnu/fs/dax.c
--- linux-libre-5.1.9-gnu/fs/dax.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/dax.c	2019-06-15 05:53:06.000000000 -0400
@@ -814,7 +814,7 @@ static void dax_entry_mkclean(struct add
 				goto unlock_pmd;
 
 			flush_cache_page(vma, address, pfn);
-			pmd = pmdp_huge_clear_flush(vma, address, pmdp);
+			pmd = pmdp_invalidate(vma, address, pmdp);
 			pmd = pmd_wrprotect(pmd);
 			pmd = pmd_mkclean(pmd);
 			set_pmd_at(vma->vm_mm, address, pmdp, pmd);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/checkpoint.c linux-libre-5.1.10-gnu/fs/f2fs/checkpoint.c
--- linux-libre-5.1.9-gnu/fs/f2fs/checkpoint.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/checkpoint.c	2019-06-15 05:53:06.000000000 -0400
@@ -1009,13 +1009,11 @@ retry:
 	if (inode) {
 		unsigned long cur_ino = inode->i_ino;
 
-		if (is_dir)
-			F2FS_I(inode)->cp_task = current;
+		F2FS_I(inode)->cp_task = current;
 
 		filemap_fdatawrite(inode->i_mapping);
 
-		if (is_dir)
-			F2FS_I(inode)->cp_task = NULL;
+		F2FS_I(inode)->cp_task = NULL;
 
 		iput(inode);
 		/* We need to give cpu to another writers. */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/data.c linux-libre-5.1.10-gnu/fs/f2fs/data.c
--- linux-libre-5.1.9-gnu/fs/f2fs/data.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/data.c	2019-06-15 05:53:06.000000000 -0400
@@ -2038,7 +2038,8 @@ out:
 	}
 
 	unlock_page(page);
-	if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode))
+	if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) &&
+					!F2FS_I(inode)->cp_task)
 		f2fs_balance_fs(sbi, need_balance_fs);
 
 	if (unlikely(f2fs_cp_error(sbi))) {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/f2fs.h linux-libre-5.1.10-gnu/fs/f2fs/f2fs.h
--- linux-libre-5.1.9-gnu/fs/f2fs/f2fs.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/f2fs.h	2019-06-15 05:53:06.000000000 -0400
@@ -1789,6 +1789,7 @@ enospc:
 	return -ENOSPC;
 }
 
+void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...);
 static inline void dec_valid_block_count(struct f2fs_sb_info *sbi,
 						struct inode *inode,
 						block_t count)
@@ -1797,13 +1798,21 @@ static inline void dec_valid_block_count
 
 	spin_lock(&sbi->stat_lock);
 	f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count);
-	f2fs_bug_on(sbi, inode->i_blocks < sectors);
 	sbi->total_valid_block_count -= (block_t)count;
 	if (sbi->reserved_blocks &&
 		sbi->current_reserved_blocks < sbi->reserved_blocks)
 		sbi->current_reserved_blocks = min(sbi->reserved_blocks,
 					sbi->current_reserved_blocks + count);
 	spin_unlock(&sbi->stat_lock);
+	if (unlikely(inode->i_blocks < sectors)) {
+		f2fs_msg(sbi->sb, KERN_WARNING,
+			"Inconsistent i_blocks, ino:%lu, iblocks:%llu, sectors:%llu",
+			inode->i_ino,
+			(unsigned long long)inode->i_blocks,
+			(unsigned long long)sectors);
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		return;
+	}
 	f2fs_i_blocks_write(inode, count, false, true);
 }
 
@@ -2020,7 +2029,6 @@ static inline void dec_valid_node_count(
 
 	f2fs_bug_on(sbi, !sbi->total_valid_block_count);
 	f2fs_bug_on(sbi, !sbi->total_valid_node_count);
-	f2fs_bug_on(sbi, !is_inode && !inode->i_blocks);
 
 	sbi->total_valid_node_count--;
 	sbi->total_valid_block_count--;
@@ -2030,10 +2038,19 @@ static inline void dec_valid_node_count(
 
 	spin_unlock(&sbi->stat_lock);
 
-	if (is_inode)
+	if (is_inode) {
 		dquot_free_inode(inode);
-	else
+	} else {
+		if (unlikely(inode->i_blocks == 0)) {
+			f2fs_msg(sbi->sb, KERN_WARNING,
+				"Inconsistent i_blocks, ino:%lu, iblocks:%llu",
+				inode->i_ino,
+				(unsigned long long)inode->i_blocks);
+			set_sbi_flag(sbi, SBI_NEED_FSCK);
+			return;
+		}
 		f2fs_i_blocks_write(inode, 1, false, true);
+	}
 }
 
 static inline unsigned int valid_node_count(struct f2fs_sb_info *sbi)
@@ -2570,7 +2587,9 @@ static inline void *inline_xattr_addr(st
 
 static inline int inline_xattr_size(struct inode *inode)
 {
-	return get_inline_xattr_addrs(inode) * sizeof(__le32);
+	if (f2fs_has_inline_xattr(inode))
+		return get_inline_xattr_addrs(inode) * sizeof(__le32);
+	return 0;
 }
 
 static inline int f2fs_has_inline_data(struct inode *inode)
@@ -2817,7 +2836,6 @@ static inline void f2fs_update_iostat(st
 
 bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi,
 					block_t blkaddr, int type);
-void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...);
 static inline void verify_blkaddr(struct f2fs_sb_info *sbi,
 					block_t blkaddr, int type)
 {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/gc.c linux-libre-5.1.10-gnu/fs/f2fs/gc.c
--- linux-libre-5.1.9-gnu/fs/f2fs/gc.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/gc.c	2019-06-15 05:53:06.000000000 -0400
@@ -1175,6 +1175,7 @@ static int do_garbage_collect(struct f2f
 				"type [%d, %d] in SSA and SIT",
 				segno, type, GET_SUM_TYPE((&sum->footer)));
 			set_sbi_flag(sbi, SBI_NEED_FSCK);
+			f2fs_stop_checkpoint(sbi, false);
 			goto skip;
 		}
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/inline.c linux-libre-5.1.10-gnu/fs/f2fs/inline.c
--- linux-libre-5.1.9-gnu/fs/f2fs/inline.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/inline.c	2019-06-15 05:53:06.000000000 -0400
@@ -420,6 +420,14 @@ static int f2fs_move_inline_dirents(stru
 	stat_dec_inline_dir(dir);
 	clear_inode_flag(dir, FI_INLINE_DENTRY);
 
+	/*
+	 * should retrieve reserved space which was used to keep
+	 * inline_dentry's structure for backward compatibility.
+	 */
+	if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
+			!f2fs_has_inline_xattr(dir))
+		F2FS_I(dir)->i_inline_xattr_size = 0;
+
 	f2fs_i_depth_write(dir, 1);
 	if (i_size_read(dir) < PAGE_SIZE)
 		f2fs_i_size_write(dir, PAGE_SIZE);
@@ -501,6 +509,15 @@ static int f2fs_move_rehashed_dirents(st
 
 	stat_dec_inline_dir(dir);
 	clear_inode_flag(dir, FI_INLINE_DENTRY);
+
+	/*
+	 * should retrieve reserved space which was used to keep
+	 * inline_dentry's structure for backward compatibility.
+	 */
+	if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
+			!f2fs_has_inline_xattr(dir))
+		F2FS_I(dir)->i_inline_xattr_size = 0;
+
 	kvfree(backup_dentry);
 	return 0;
 recover:
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/inode.c linux-libre-5.1.10-gnu/fs/f2fs/inode.c
--- linux-libre-5.1.9-gnu/fs/f2fs/inode.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/inode.c	2019-06-15 05:53:06.000000000 -0400
@@ -177,8 +177,8 @@ bool f2fs_inode_chksum_verify(struct f2f
 
 	if (provided != calculated)
 		f2fs_msg(sbi->sb, KERN_WARNING,
-			"checksum invalid, ino = %x, %x vs. %x",
-			ino_of_node(page), provided, calculated);
+			"checksum invalid, nid = %lu, ino_of_node = %x, %x vs. %x",
+			page->index, ino_of_node(page), provided, calculated);
 
 	return provided == calculated;
 }
@@ -488,6 +488,7 @@ make_now:
 	return inode;
 
 bad_inode:
+	f2fs_inode_synced(inode);
 	iget_failed(inode);
 	trace_f2fs_iget_exit(inode, ret);
 	return ERR_PTR(ret);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/node.c linux-libre-5.1.10-gnu/fs/f2fs/node.c
--- linux-libre-5.1.9-gnu/fs/f2fs/node.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/node.c	2019-06-15 05:53:06.000000000 -0400
@@ -1179,8 +1179,14 @@ int f2fs_remove_inode_page(struct inode
 		f2fs_put_dnode(&dn);
 		return -EIO;
 	}
-	f2fs_bug_on(F2FS_I_SB(inode),
-			inode->i_blocks != 0 && inode->i_blocks != 8);
+
+	if (unlikely(inode->i_blocks != 0 && inode->i_blocks != 8)) {
+		f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
+			"Inconsistent i_blocks, ino:%lu, iblocks:%llu",
+			inode->i_ino,
+			(unsigned long long)inode->i_blocks);
+		set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
+	}
 
 	/* will put inode & node pages */
 	err = truncate_node(&dn);
@@ -1275,9 +1281,10 @@ static int read_node_page(struct page *p
 	int err;
 
 	if (PageUptodate(page)) {
-#ifdef CONFIG_F2FS_CHECK_FS
-		f2fs_bug_on(sbi, !f2fs_inode_chksum_verify(sbi, page));
-#endif
+		if (!f2fs_inode_chksum_verify(sbi, page)) {
+			ClearPageUptodate(page);
+			return -EBADMSG;
+		}
 		return LOCKED_PAGE;
 	}
 
@@ -2076,6 +2083,9 @@ static bool add_free_nid(struct f2fs_sb_
 	if (unlikely(nid == 0))
 		return false;
 
+	if (unlikely(f2fs_check_nid_range(sbi, nid)))
+		return false;
+
 	i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS);
 	i->nid = nid;
 	i->state = FREE_NID;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/recovery.c linux-libre-5.1.10-gnu/fs/f2fs/recovery.c
--- linux-libre-5.1.9-gnu/fs/f2fs/recovery.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/recovery.c	2019-06-15 05:53:06.000000000 -0400
@@ -325,8 +325,10 @@ static int find_fsync_dnodes(struct f2fs
 			break;
 		}
 
-		if (!is_recoverable_dnode(page))
+		if (!is_recoverable_dnode(page)) {
+			f2fs_put_page(page, 1);
 			break;
+		}
 
 		if (!is_fsync_dnode(page))
 			goto next;
@@ -338,8 +340,10 @@ static int find_fsync_dnodes(struct f2fs
 			if (!check_only &&
 					IS_INODE(page) && is_dent_dnode(page)) {
 				err = f2fs_recover_inode_page(sbi, page);
-				if (err)
+				if (err) {
+					f2fs_put_page(page, 1);
 					break;
+				}
 				quota_inode = true;
 			}
 
@@ -355,6 +359,7 @@ static int find_fsync_dnodes(struct f2fs
 					err = 0;
 					goto next;
 				}
+				f2fs_put_page(page, 1);
 				break;
 			}
 		}
@@ -370,6 +375,7 @@ next:
 				"%s: detect looped node chain, "
 				"blkaddr:%u, next:%u",
 				__func__, blkaddr, next_blkaddr_of_node(page));
+			f2fs_put_page(page, 1);
 			err = -EINVAL;
 			break;
 		}
@@ -380,7 +386,6 @@ next:
 
 		f2fs_ra_meta_pages_cond(sbi, blkaddr);
 	}
-	f2fs_put_page(page, 1);
 	return err;
 }
 
@@ -546,7 +551,15 @@ retry_dn:
 		goto err;
 
 	f2fs_bug_on(sbi, ni.ino != ino_of_node(page));
-	f2fs_bug_on(sbi, ofs_of_node(dn.node_page) != ofs_of_node(page));
+
+	if (ofs_of_node(dn.node_page) != ofs_of_node(page)) {
+		f2fs_msg(sbi->sb, KERN_WARNING,
+			"Inconsistent ofs_of_node, ino:%lu, ofs:%u, %u",
+			inode->i_ino, ofs_of_node(dn.node_page),
+			ofs_of_node(page));
+		err = -EFAULT;
+		goto err;
+	}
 
 	for (; start < end; start++, dn.ofs_in_node++) {
 		block_t src, dest;
@@ -666,8 +679,10 @@ static int recover_data(struct f2fs_sb_i
 		 */
 		if (IS_INODE(page)) {
 			err = recover_inode(entry->inode, page);
-			if (err)
+			if (err) {
+				f2fs_put_page(page, 1);
 				break;
+			}
 		}
 		if (entry->last_dentry == blkaddr) {
 			err = recover_dentry(entry->inode, page, dir_list);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/segment.c linux-libre-5.1.10-gnu/fs/f2fs/segment.c
--- linux-libre-5.1.9-gnu/fs/f2fs/segment.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/segment.c	2019-06-15 05:53:06.000000000 -0400
@@ -3188,13 +3188,18 @@ int f2fs_inplace_write_data(struct f2fs_
 {
 	int err;
 	struct f2fs_sb_info *sbi = fio->sbi;
+	unsigned int segno;
 
 	fio->new_blkaddr = fio->old_blkaddr;
 	/* i/o temperature is needed for passing down write hints */
 	__get_segment_type(fio);
 
-	f2fs_bug_on(sbi, !IS_DATASEG(get_seg_entry(sbi,
-			GET_SEGNO(sbi, fio->new_blkaddr))->type));
+	segno = GET_SEGNO(sbi, fio->new_blkaddr);
+
+	if (!IS_DATASEG(get_seg_entry(sbi, segno)->type)) {
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
+		return -EFAULT;
+	}
 
 	stat_inc_inplace_blocks(fio->sbi);
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/f2fs/segment.h linux-libre-5.1.10-gnu/fs/f2fs/segment.h
--- linux-libre-5.1.9-gnu/fs/f2fs/segment.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/f2fs/segment.h	2019-06-15 05:53:06.000000000 -0400
@@ -672,7 +672,6 @@ static inline void verify_block_addr(str
 static inline int check_block_count(struct f2fs_sb_info *sbi,
 		int segno, struct f2fs_sit_entry *raw_sit)
 {
-#ifdef CONFIG_F2FS_CHECK_FS
 	bool is_valid  = test_bit_le(0, raw_sit->valid_map) ? true : false;
 	int valid_blocks = 0;
 	int cur_pos = 0, next_pos;
@@ -699,7 +698,7 @@ static inline int check_block_count(stru
 		set_sbi_flag(sbi, SBI_NEED_FSCK);
 		return -EINVAL;
 	}
-#endif
+
 	/* check segment usage, and check boundary of a given segment number */
 	if (unlikely(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg
 					|| segno > TOTAL_SEGS(sbi) - 1)) {
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/fat/file.c linux-libre-5.1.10-gnu/fs/fat/file.c
--- linux-libre-5.1.9-gnu/fs/fat/file.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/fat/file.c	2019-06-15 05:53:06.000000000 -0400
@@ -193,12 +193,17 @@ static int fat_file_release(struct inode
 int fat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
 {
 	struct inode *inode = filp->f_mapping->host;
-	int res, err;
+	int err;
+
+	err = __generic_file_fsync(filp, start, end, datasync);
+	if (err)
+		return err;
 
-	res = generic_file_fsync(filp, start, end, datasync);
 	err = sync_mapping_buffers(MSDOS_SB(inode->i_sb)->fat_inode->i_mapping);
+	if (err)
+		return err;
 
-	return res ? res : err;
+	return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
 }
 
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/fuse/dev.c linux-libre-5.1.10-gnu/fs/fuse/dev.c
--- linux-libre-5.1.9-gnu/fs/fuse/dev.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/fuse/dev.c	2019-06-15 05:53:06.000000000 -0400
@@ -1749,7 +1749,7 @@ static int fuse_retrieve(struct fuse_con
 	offset = outarg->offset & ~PAGE_MASK;
 	file_size = i_size_read(inode);
 
-	num = outarg->size;
+	num = min(outarg->size, fc->max_write);
 	if (outarg->offset > file_size)
 		num = 0;
 	else if (outarg->offset + num > file_size)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/io_uring.c linux-libre-5.1.10-gnu/fs/io_uring.c
--- linux-libre-5.1.9-gnu/fs/io_uring.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/io_uring.c	2019-06-15 05:53:06.000000000 -0400
@@ -2330,10 +2330,11 @@ static int io_sq_offload_start(struct io
 			ctx->sq_thread_idle = HZ;
 
 		if (p->flags & IORING_SETUP_SQ_AFF) {
-			int cpu = array_index_nospec(p->sq_thread_cpu,
-							nr_cpu_ids);
+			int cpu = p->sq_thread_cpu;
 
 			ret = -EINVAL;
+			if (cpu >= nr_cpu_ids)
+				goto err;
 			if (!cpu_online(cpu))
 				goto err;
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/nfsd/nfs4xdr.c linux-libre-5.1.10-gnu/fs/nfsd/nfs4xdr.c
--- linux-libre-5.1.9-gnu/fs/nfsd/nfs4xdr.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/nfsd/nfs4xdr.c	2019-06-15 05:53:06.000000000 -0400
@@ -2420,8 +2420,10 @@ nfsd4_encode_fattr(struct xdr_stream *xd
 	__be32 status;
 	int err;
 	struct nfs4_acl *acl = NULL;
+#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
 	void *context = NULL;
 	int contextlen;
+#endif
 	bool contextsupport = false;
 	struct nfsd4_compoundres *resp = rqstp->rq_resp;
 	u32 minorversion = resp->cstate.minorversion;
@@ -2906,12 +2908,14 @@ out_acl:
 			*p++ = cpu_to_be32(NFS4_CHANGE_TYPE_IS_TIME_METADATA);
 	}
 
+#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
 	if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
 		status = nfsd4_encode_security_label(xdr, rqstp, context,
 								contextlen);
 		if (status)
 			goto out;
 	}
+#endif
 
 	attrlen = htonl(xdr->buf->len - attrlen_offset - 4);
 	write_bytes_to_xdr_buf(xdr->buf, attrlen_offset, &attrlen, 4);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/nfsd/vfs.h linux-libre-5.1.10-gnu/fs/nfsd/vfs.h
--- linux-libre-5.1.9-gnu/fs/nfsd/vfs.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/nfsd/vfs.h	2019-06-15 05:53:06.000000000 -0400
@@ -120,8 +120,11 @@ void		nfsd_put_raparams(struct file *fil
 
 static inline int fh_want_write(struct svc_fh *fh)
 {
-	int ret = mnt_want_write(fh->fh_export->ex_path.mnt);
+	int ret;
 
+	if (fh->fh_want_write)
+		return 0;
+	ret = mnt_want_write(fh->fh_export->ex_path.mnt);
 	if (!ret)
 		fh->fh_want_write = true;
 	return ret;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/fs/overlayfs/file.c linux-libre-5.1.10-gnu/fs/overlayfs/file.c
--- linux-libre-5.1.9-gnu/fs/overlayfs/file.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/fs/overlayfs/file.c	2019-06-15 05:53:06.000000000 -0400
@@ -11,6 +11,7 @@
 #include <linux/mount.h>
 #include <linux/xattr.h>
 #include <linux/uio.h>
+#include <linux/uaccess.h>
 #include "overlayfs.h"
 
 static char ovl_whatisit(struct inode *inode, struct inode *realinode)
@@ -29,10 +30,11 @@ static struct file *ovl_open_realfile(co
 	struct inode *inode = file_inode(file);
 	struct file *realfile;
 	const struct cred *old_cred;
+	int flags = file->f_flags | O_NOATIME | FMODE_NONOTIFY;
 
 	old_cred = ovl_override_creds(inode->i_sb);
-	realfile = open_with_fake_path(&file->f_path, file->f_flags | O_NOATIME,
-				       realinode, current_cred());
+	realfile = open_with_fake_path(&file->f_path, flags, realinode,
+				       current_cred());
 	revert_creds(old_cred);
 
 	pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n",
@@ -50,7 +52,7 @@ static int ovl_change_flags(struct file
 	int err;
 
 	/* No atime modificaton on underlying */
-	flags |= O_NOATIME;
+	flags |= O_NOATIME | FMODE_NONOTIFY;
 
 	/* If some flag changed that cannot be changed then something's amiss */
 	if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK))
@@ -144,11 +146,47 @@ static int ovl_release(struct inode *ino
 
 static loff_t ovl_llseek(struct file *file, loff_t offset, int whence)
 {
-	struct inode *realinode = ovl_inode_real(file_inode(file));
+	struct inode *inode = file_inode(file);
+	struct fd real;
+	const struct cred *old_cred;
+	ssize_t ret;
 
-	return generic_file_llseek_size(file, offset, whence,
-					realinode->i_sb->s_maxbytes,
-					i_size_read(realinode));
+	/*
+	 * The two special cases below do not need to involve real fs,
+	 * so we can optimizing concurrent callers.
+	 */
+	if (offset == 0) {
+		if (whence == SEEK_CUR)
+			return file->f_pos;
+
+		if (whence == SEEK_SET)
+			return vfs_setpos(file, 0, 0);
+	}
+
+	ret = ovl_real_fdget(file, &real);
+	if (ret)
+		return ret;
+
+	/*
+	 * Overlay file f_pos is the master copy that is preserved
+	 * through copy up and modified on read/write, but only real
+	 * fs knows how to SEEK_HOLE/SEEK_DATA and real fs may impose
+	 * limitations that are more strict than ->s_maxbytes for specific
+	 * files, so we use the real file to perform seeks.
+	 */
+	inode_lock(inode);
+	real.file->f_pos = file->f_pos;
+
+	old_cred = ovl_override_creds(inode->i_sb);
+	ret = vfs_llseek(real.file, offset, whence);
+	revert_creds(old_cred);
+
+	file->f_pos = real.file->f_pos;
+	inode_unlock(inode);
+
+	fdput(real);
+
+	return ret;
 }
 
 static void ovl_file_accessed(struct file *file)
@@ -371,10 +409,68 @@ static long ovl_real_ioctl(struct file *
 	return ret;
 }
 
-static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+static unsigned int ovl_get_inode_flags(struct inode *inode)
+{
+	unsigned int flags = READ_ONCE(inode->i_flags);
+	unsigned int ovl_iflags = 0;
+
+	if (flags & S_SYNC)
+		ovl_iflags |= FS_SYNC_FL;
+	if (flags & S_APPEND)
+		ovl_iflags |= FS_APPEND_FL;
+	if (flags & S_IMMUTABLE)
+		ovl_iflags |= FS_IMMUTABLE_FL;
+	if (flags & S_NOATIME)
+		ovl_iflags |= FS_NOATIME_FL;
+
+	return ovl_iflags;
+}
+
+static long ovl_ioctl_set_flags(struct file *file, unsigned long arg)
 {
 	long ret;
 	struct inode *inode = file_inode(file);
+	unsigned int flags;
+	unsigned int old_flags;
+
+	if (!inode_owner_or_capable(inode))
+		return -EACCES;
+
+	if (get_user(flags, (int __user *) arg))
+		return -EFAULT;
+
+	ret = mnt_want_write_file(file);
+	if (ret)
+		return ret;
+
+	inode_lock(inode);
+
+	/* Check the capability before cred override */
+	ret = -EPERM;
+	old_flags = ovl_get_inode_flags(inode);
+	if (((flags ^ old_flags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) &&
+	    !capable(CAP_LINUX_IMMUTABLE))
+		goto unlock;
+
+	ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY);
+	if (ret)
+		goto unlock;
+
+	ret = ovl_real_ioctl(file, FS_IOC_SETFLAGS, arg);
+
+	ovl_copyflags(ovl_inode_real(inode), inode);
+unlock:
+	inode_unlock(inode);
+
+	mnt_drop_write_file(file);
+
+	return ret;
+
+}
+
+static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+	long ret;
 
 	switch (cmd) {
 	case FS_IOC_GETFLAGS:
@@ -382,23 +478,7 @@ static long ovl_ioctl(struct file *file,
 		break;
 
 	case FS_IOC_SETFLAGS:
-		if (!inode_owner_or_capable(inode))
-			return -EACCES;
-
-		ret = mnt_want_write_file(file);
-		if (ret)
-			return ret;
-
-		ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY);
-		if (!ret) {
-			ret = ovl_real_ioctl(file, cmd, arg);
-
-			inode_lock(inode);
-			ovl_copyflags(ovl_inode_real(inode), inode);
-			inode_unlock(inode);
-		}
-
-		mnt_drop_write_file(file);
+		ret = ovl_ioctl_set_flags(file, arg);
 		break;
 
 	default:
diff -druNp --no-dereference linux-libre-5.1.9-gnu/include/linux/pwm.h linux-libre-5.1.10-gnu/include/linux/pwm.h
--- linux-libre-5.1.9-gnu/include/linux/pwm.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/include/linux/pwm.h	2019-06-15 05:53:06.000000000 -0400
@@ -596,7 +596,6 @@ static inline void pwm_remove_table(stru
 #ifdef CONFIG_PWM_SYSFS
 void pwmchip_sysfs_export(struct pwm_chip *chip);
 void pwmchip_sysfs_unexport(struct pwm_chip *chip);
-void pwmchip_sysfs_unexport_children(struct pwm_chip *chip);
 #else
 static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
 {
@@ -605,10 +604,6 @@ static inline void pwmchip_sysfs_export(
 static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip)
 {
 }
-
-static inline void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
-{
-}
 #endif /* CONFIG_PWM_SYSFS */
 
 #endif /* __LINUX_PWM_H */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/include/media/v4l2-ctrls.h linux-libre-5.1.10-gnu/include/media/v4l2-ctrls.h
--- linux-libre-5.1.9-gnu/include/media/v4l2-ctrls.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/include/media/v4l2-ctrls.h	2019-06-15 05:53:06.000000000 -0400
@@ -1127,7 +1127,7 @@ __poll_t v4l2_ctrl_poll(struct file *fil
  * applying control values in a request is only applicable to memory-to-memory
  * devices.
  */
-void v4l2_ctrl_request_setup(struct media_request *req,
+int v4l2_ctrl_request_setup(struct media_request *req,
 			     struct v4l2_ctrl_handler *parent);
 
 /**
diff -druNp --no-dereference linux-libre-5.1.9-gnu/include/net/bluetooth/hci_core.h linux-libre-5.1.10-gnu/include/net/bluetooth/hci_core.h
--- linux-libre-5.1.9-gnu/include/net/bluetooth/hci_core.h	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/include/net/bluetooth/hci_core.h	2019-06-15 05:53:06.000000000 -0400
@@ -190,9 +190,6 @@ struct adv_info {
 
 #define HCI_MAX_SHORT_NAME_LENGTH	10
 
-/* Min encryption key size to match with SMP */
-#define HCI_MIN_ENC_KEY_SIZE		7
-
 /* Default LE RPA expiry time, 15 minutes */
 #define HCI_DEFAULT_RPA_TIMEOUT		(15 * 60)
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/init/initramfs.c linux-libre-5.1.10-gnu/init/initramfs.c
--- linux-libre-5.1.9-gnu/init/initramfs.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/init/initramfs.c	2019-06-15 05:53:06.000000000 -0400
@@ -612,13 +612,12 @@ static int __init populate_rootfs(void)
 		printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n");
 		err = unpack_to_rootfs((char *)initrd_start,
 			initrd_end - initrd_start);
-		if (!err) {
-			free_initrd();
+		if (!err)
 			goto done;
-		} else {
-			clean_rootfs();
-			unpack_to_rootfs(__initramfs_start, __initramfs_size);
-		}
+
+		clean_rootfs();
+		unpack_to_rootfs(__initramfs_start, __initramfs_size);
+
 		printk(KERN_INFO "rootfs image is not initramfs (%s)"
 				"; looks like an initrd\n", err);
 		fd = ksys_open("/initrd.image",
@@ -632,7 +631,6 @@ static int __init populate_rootfs(void)
 				       written, initrd_end - initrd_start);
 
 			ksys_close(fd);
-			free_initrd();
 		}
 	done:
 		/* empty statement */;
@@ -642,9 +640,9 @@ static int __init populate_rootfs(void)
 			initrd_end - initrd_start);
 		if (err)
 			printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err);
-		free_initrd();
 #endif
 	}
+	free_initrd();
 	flush_delayed_fput();
 	return 0;
 }
diff -druNp --no-dereference linux-libre-5.1.9-gnu/ipc/mqueue.c linux-libre-5.1.10-gnu/ipc/mqueue.c
--- linux-libre-5.1.9-gnu/ipc/mqueue.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/ipc/mqueue.c	2019-06-15 05:53:06.000000000 -0400
@@ -436,7 +436,8 @@ static void mqueue_evict_inode(struct in
 	struct user_struct *user;
 	unsigned long mq_bytes, mq_treesize;
 	struct ipc_namespace *ipc_ns;
-	struct msg_msg *msg;
+	struct msg_msg *msg, *nmsg;
+	LIST_HEAD(tmp_msg);
 
 	clear_inode(inode);
 
@@ -447,10 +448,15 @@ static void mqueue_evict_inode(struct in
 	info = MQUEUE_I(inode);
 	spin_lock(&info->lock);
 	while ((msg = msg_get(info)) != NULL)
-		free_msg(msg);
+		list_add_tail(&msg->m_list, &tmp_msg);
 	kfree(info->node_cache);
 	spin_unlock(&info->lock);
 
+	list_for_each_entry_safe(msg, nmsg, &tmp_msg, m_list) {
+		list_del(&msg->m_list);
+		free_msg(msg);
+	}
+
 	/* Total amount of bytes accounted for the mqueue */
 	mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
 		min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
diff -druNp --no-dereference linux-libre-5.1.9-gnu/ipc/msgutil.c linux-libre-5.1.10-gnu/ipc/msgutil.c
--- linux-libre-5.1.9-gnu/ipc/msgutil.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/ipc/msgutil.c	2019-06-15 05:53:06.000000000 -0400
@@ -18,6 +18,7 @@
 #include <linux/utsname.h>
 #include <linux/proc_ns.h>
 #include <linux/uaccess.h>
+#include <linux/sched.h>
 
 #include "util.h"
 
@@ -64,6 +65,9 @@ static struct msg_msg *alloc_msg(size_t
 	pseg = &msg->next;
 	while (len > 0) {
 		struct msg_msgseg *seg;
+
+		cond_resched();
+
 		alen = min(len, DATALEN_SEG);
 		seg = kmalloc(sizeof(*seg) + alen, GFP_KERNEL_ACCOUNT);
 		if (seg == NULL)
@@ -176,6 +180,8 @@ void free_msg(struct msg_msg *msg)
 	kfree(msg);
 	while (seg != NULL) {
 		struct msg_msgseg *tmp = seg->next;
+
+		cond_resched();
 		kfree(seg);
 		seg = tmp;
 	}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/kernel/bpf/verifier.c linux-libre-5.1.10-gnu/kernel/bpf/verifier.c
--- linux-libre-5.1.9-gnu/kernel/bpf/verifier.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/kernel/bpf/verifier.c	2019-06-15 05:53:06.000000000 -0400
@@ -7296,7 +7296,7 @@ static int convert_ctx_accesses(struct b
 									insn->dst_reg,
 									shift);
 				insn_buf[cnt++] = BPF_ALU64_IMM(BPF_AND, insn->dst_reg,
-								(1 << size * 8) - 1);
+								(1ULL << size * 8) - 1);
 			}
 		}
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/kernel/sys.c linux-libre-5.1.10-gnu/kernel/sys.c
--- linux-libre-5.1.9-gnu/kernel/sys.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/kernel/sys.c	2019-06-15 05:53:06.000000000 -0400
@@ -1924,7 +1924,7 @@ static int validate_prctl_map(struct prc
 	((unsigned long)prctl_map->__m1 __op				\
 	 (unsigned long)prctl_map->__m2) ? 0 : -EINVAL
 	error  = __prctl_check_order(start_code, <, end_code);
-	error |= __prctl_check_order(start_data, <, end_data);
+	error |= __prctl_check_order(start_data,<=, end_data);
 	error |= __prctl_check_order(start_brk, <=, brk);
 	error |= __prctl_check_order(arg_start, <=, arg_end);
 	error |= __prctl_check_order(env_start, <=, env_end);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/kernel/sysctl.c linux-libre-5.1.10-gnu/kernel/sysctl.c
--- linux-libre-5.1.9-gnu/kernel/sysctl.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/kernel/sysctl.c	2019-06-15 05:53:06.000000000 -0400
@@ -2874,8 +2874,10 @@ static int __do_proc_doulongvec_minmax(v
 			if (neg)
 				continue;
 			val = convmul * val / convdiv;
-			if ((min && val < *min) || (max && val > *max))
-				continue;
+			if ((min && val < *min) || (max && val > *max)) {
+				err = -EINVAL;
+				break;
+			}
 			*i = val;
 		} else {
 			val = convdiv * (*i) / convmul;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/kernel/time/ntp.c linux-libre-5.1.10-gnu/kernel/time/ntp.c
--- linux-libre-5.1.9-gnu/kernel/time/ntp.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/kernel/time/ntp.c	2019-06-15 05:53:06.000000000 -0400
@@ -690,7 +690,7 @@ static inline void process_adjtimex_mode
 		time_constant = max(time_constant, 0l);
 	}
 
-	if (txc->modes & ADJ_TAI && txc->constant > 0)
+	if (txc->modes & ADJ_TAI && txc->constant >= 0)
 		*time_tai = txc->constant;
 
 	if (txc->modes & ADJ_OFFSET)
diff -druNp --no-dereference linux-libre-5.1.9-gnu/Makefile linux-libre-5.1.10-gnu/Makefile
--- linux-libre-5.1.9-gnu/Makefile	2019-06-11 14:29:30.000000000 -0400
+++ linux-libre-5.1.10-gnu/Makefile	2019-06-15 16:53:14.000000000 -0400
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 5
 PATCHLEVEL = 1
-SUBLEVEL = 9
+SUBLEVEL = 10
 EXTRAVERSION = -gnu
 NAME = Shy Crocodile
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/cma.c linux-libre-5.1.10-gnu/mm/cma.c
--- linux-libre-5.1.9-gnu/mm/cma.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/cma.c	2019-06-15 05:53:06.000000000 -0400
@@ -106,8 +106,10 @@ static int __init cma_activate_area(stru
 
 	cma->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
 
-	if (!cma->bitmap)
+	if (!cma->bitmap) {
+		cma->count = 0;
 		return -ENOMEM;
+	}
 
 	WARN_ON_ONCE(!pfn_valid(pfn));
 	zone = page_zone(pfn_to_page(pfn));
@@ -367,23 +369,26 @@ err:
 #ifdef CONFIG_CMA_DEBUG
 static void cma_debug_show_areas(struct cma *cma)
 {
-	unsigned long next_zero_bit, next_set_bit;
+	unsigned long next_zero_bit, next_set_bit, nr_zero;
 	unsigned long start = 0;
-	unsigned int nr_zero, nr_total = 0;
+	unsigned long nr_part, nr_total = 0;
+	unsigned long nbits = cma_bitmap_maxno(cma);
 
 	mutex_lock(&cma->lock);
 	pr_info("number of available pages: ");
 	for (;;) {
-		next_zero_bit = find_next_zero_bit(cma->bitmap, cma->count, start);
-		if (next_zero_bit >= cma->count)
+		next_zero_bit = find_next_zero_bit(cma->bitmap, nbits, start);
+		if (next_zero_bit >= nbits)
 			break;
-		next_set_bit = find_next_bit(cma->bitmap, cma->count, next_zero_bit);
+		next_set_bit = find_next_bit(cma->bitmap, nbits, next_zero_bit);
 		nr_zero = next_set_bit - next_zero_bit;
-		pr_cont("%s%u@%lu", nr_total ? "+" : "", nr_zero, next_zero_bit);
-		nr_total += nr_zero;
+		nr_part = nr_zero << cma->order_per_bit;
+		pr_cont("%s%lu@%lu", nr_total ? "+" : "", nr_part,
+			next_zero_bit);
+		nr_total += nr_part;
 		start = next_zero_bit + nr_zero;
 	}
-	pr_cont("=> %u free of %lu total pages\n", nr_total, cma->count);
+	pr_cont("=> %lu free of %lu total pages\n", nr_total, cma->count);
 	mutex_unlock(&cma->lock);
 }
 #else
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/cma_debug.c linux-libre-5.1.10-gnu/mm/cma_debug.c
--- linux-libre-5.1.9-gnu/mm/cma_debug.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/cma_debug.c	2019-06-15 05:53:06.000000000 -0400
@@ -56,7 +56,7 @@ static int cma_maxchunk_get(void *data,
 	mutex_lock(&cma->lock);
 	for (;;) {
 		start = find_next_zero_bit(cma->bitmap, bitmap_maxno, end);
-		if (start >= cma->count)
+		if (start >= bitmap_maxno)
 			break;
 		end = find_next_bit(cma->bitmap, bitmap_maxno, start);
 		maxchunk = max(end - start, maxchunk);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/compaction.c linux-libre-5.1.10-gnu/mm/compaction.c
--- linux-libre-5.1.9-gnu/mm/compaction.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/compaction.c	2019-06-15 05:53:06.000000000 -0400
@@ -1164,7 +1164,9 @@ static bool suitable_migration_target(st
 static inline unsigned int
 freelist_scan_limit(struct compact_control *cc)
 {
-	return (COMPACT_CLUSTER_MAX >> cc->fast_search_fail) + 1;
+	unsigned short shift = BITS_PER_LONG - 1;
+
+	return (COMPACT_CLUSTER_MAX >> min(shift, cc->fast_search_fail)) + 1;
 }
 
 /*
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/hugetlb.c linux-libre-5.1.10-gnu/mm/hugetlb.c
--- linux-libre-5.1.9-gnu/mm/hugetlb.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/hugetlb.c	2019-06-15 05:53:06.000000000 -0400
@@ -1258,12 +1258,23 @@ void free_huge_page(struct page *page)
 	ClearPagePrivate(page);
 
 	/*
-	 * A return code of zero implies that the subpool will be under its
-	 * minimum size if the reservation is not restored after page is free.
-	 * Therefore, force restore_reserve operation.
+	 * If PagePrivate() was set on page, page allocation consumed a
+	 * reservation.  If the page was associated with a subpool, there
+	 * would have been a page reserved in the subpool before allocation
+	 * via hugepage_subpool_get_pages().  Since we are 'restoring' the
+	 * reservtion, do not call hugepage_subpool_put_pages() as this will
+	 * remove the reserved page from the subpool.
 	 */
-	if (hugepage_subpool_put_pages(spool, 1) == 0)
-		restore_reserve = true;
+	if (!restore_reserve) {
+		/*
+		 * A return code of zero implies that the subpool will be
+		 * under its minimum size if the reservation is not restored
+		 * after page is free.  Therefore, force restore_reserve
+		 * operation.
+		 */
+		if (hugepage_subpool_put_pages(spool, 1) == 0)
+			restore_reserve = true;
+	}
 
 	spin_lock(&hugetlb_lock);
 	clear_page_huge_active(page);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/Kconfig linux-libre-5.1.10-gnu/mm/Kconfig
--- linux-libre-5.1.9-gnu/mm/Kconfig	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/Kconfig	2019-06-15 05:53:06.000000000 -0400
@@ -694,12 +694,12 @@ config DEV_PAGEMAP_OPS
 
 config HMM
 	bool
+	select MMU_NOTIFIER
 	select MIGRATE_VMA_HELPER
 
 config HMM_MIRROR
 	bool "HMM mirror CPU page table into a device page table"
 	depends on ARCH_HAS_HMM
-	select MMU_NOTIFIER
 	select HMM
 	help
 	  Select HMM_MIRROR if you want to mirror range of the CPU page table of a
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/memory_hotplug.c linux-libre-5.1.10-gnu/mm/memory_hotplug.c
--- linux-libre-5.1.9-gnu/mm/memory_hotplug.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/memory_hotplug.c	2019-06-15 05:53:06.000000000 -0400
@@ -561,20 +561,6 @@ int __remove_pages(struct zone *zone, un
 	if (is_dev_zone(zone)) {
 		if (altmap)
 			map_offset = vmem_altmap_offset(altmap);
-	} else {
-		resource_size_t start, size;
-
-		start = phys_start_pfn << PAGE_SHIFT;
-		size = nr_pages * PAGE_SIZE;
-
-		ret = release_mem_region_adjustable(&iomem_resource, start,
-					size);
-		if (ret) {
-			resource_size_t endres = start + size - 1;
-
-			pr_warn("Unable to release resource <%pa-%pa> (%d)\n",
-					&start, &endres, ret);
-		}
 	}
 
 	clear_zone_contiguous(zone);
@@ -714,7 +700,7 @@ static void node_states_check_changes_on
 	if (zone_idx(zone) <= ZONE_NORMAL && !node_state(nid, N_NORMAL_MEMORY))
 		arg->status_change_nid_normal = nid;
 #ifdef CONFIG_HIGHMEM
-	if (zone_idx(zone) <= N_HIGH_MEMORY && !node_state(nid, N_HIGH_MEMORY))
+	if (zone_idx(zone) <= ZONE_HIGHMEM && !node_state(nid, N_HIGH_MEMORY))
 		arg->status_change_nid_high = nid;
 #endif
 }
@@ -1843,6 +1829,26 @@ void try_offline_node(int nid)
 }
 EXPORT_SYMBOL(try_offline_node);
 
+static void __release_memory_resource(resource_size_t start,
+				      resource_size_t size)
+{
+	int ret;
+
+	/*
+	 * When removing memory in the same granularity as it was added,
+	 * this function never fails. It might only fail if resources
+	 * have to be adjusted or split. We'll ignore the error, as
+	 * removing of memory cannot fail.
+	 */
+	ret = release_mem_region_adjustable(&iomem_resource, start, size);
+	if (ret) {
+		resource_size_t endres = start + size - 1;
+
+		pr_warn("Unable to release resource <%pa-%pa> (%d)\n",
+			&start, &endres, ret);
+	}
+}
+
 /**
  * remove_memory
  * @nid: the node ID
@@ -1877,6 +1883,7 @@ void __ref __remove_memory(int nid, u64
 	memblock_remove(start, size);
 
 	arch_remove_memory(nid, start, size, NULL);
+	__release_memory_resource(start, size);
 
 	try_offline_node(nid);
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/mprotect.c linux-libre-5.1.10-gnu/mm/mprotect.c
--- linux-libre-5.1.9-gnu/mm/mprotect.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/mprotect.c	2019-06-15 05:53:06.000000000 -0400
@@ -39,7 +39,6 @@ static unsigned long change_pte_range(st
 		unsigned long addr, unsigned long end, pgprot_t newprot,
 		int dirty_accountable, int prot_numa)
 {
-	struct mm_struct *mm = vma->vm_mm;
 	pte_t *pte, oldpte;
 	spinlock_t *ptl;
 	unsigned long pages = 0;
@@ -136,7 +135,7 @@ static unsigned long change_pte_range(st
 				newpte = swp_entry_to_pte(entry);
 				if (pte_swp_soft_dirty(oldpte))
 					newpte = pte_swp_mksoft_dirty(newpte);
-				set_pte_at(mm, addr, pte, newpte);
+				set_pte_at(vma->vm_mm, addr, pte, newpte);
 
 				pages++;
 			}
@@ -150,7 +149,7 @@ static unsigned long change_pte_range(st
 				 */
 				make_device_private_entry_read(&entry);
 				newpte = swp_entry_to_pte(entry);
-				set_pte_at(mm, addr, pte, newpte);
+				set_pte_at(vma->vm_mm, addr, pte, newpte);
 
 				pages++;
 			}
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/page_alloc.c linux-libre-5.1.10-gnu/mm/page_alloc.c
--- linux-libre-5.1.9-gnu/mm/page_alloc.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/page_alloc.c	2019-06-15 05:53:06.000000000 -0400
@@ -6244,13 +6244,15 @@ static unsigned long __init zone_spanned
 					unsigned long *zone_end_pfn,
 					unsigned long *ignored)
 {
+	unsigned long zone_low = arch_zone_lowest_possible_pfn[zone_type];
+	unsigned long zone_high = arch_zone_highest_possible_pfn[zone_type];
 	/* When hotadd a new node from cpu_up(), the node should be empty */
 	if (!node_start_pfn && !node_end_pfn)
 		return 0;
 
 	/* Get the start and end of the zone */
-	*zone_start_pfn = arch_zone_lowest_possible_pfn[zone_type];
-	*zone_end_pfn = arch_zone_highest_possible_pfn[zone_type];
+	*zone_start_pfn = clamp(node_start_pfn, zone_low, zone_high);
+	*zone_end_pfn = clamp(node_end_pfn, zone_low, zone_high);
 	adjust_zone_range_for_zone_movable(nid, zone_type,
 				node_start_pfn, node_end_pfn,
 				zone_start_pfn, zone_end_pfn);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/percpu.c linux-libre-5.1.10-gnu/mm/percpu.c
--- linux-libre-5.1.9-gnu/mm/percpu.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/percpu.c	2019-06-15 05:53:06.000000000 -0400
@@ -988,7 +988,8 @@ static int pcpu_alloc_area(struct pcpu_c
 	/*
 	 * Search to find a fit.
 	 */
-	end = start + alloc_bits + PCPU_BITMAP_BLOCK_BITS;
+	end = min_t(int, start + alloc_bits + PCPU_BITMAP_BLOCK_BITS,
+		    pcpu_chunk_map_bits(chunk));
 	bit_off = bitmap_find_next_zero_area(chunk->alloc_map, end, start,
 					     alloc_bits, align_mask);
 	if (bit_off >= end)
@@ -1738,6 +1739,7 @@ void free_percpu(void __percpu *ptr)
 	struct pcpu_chunk *chunk;
 	unsigned long flags;
 	int off;
+	bool need_balance = false;
 
 	if (!ptr)
 		return;
@@ -1759,7 +1761,7 @@ void free_percpu(void __percpu *ptr)
 
 		list_for_each_entry(pos, &pcpu_slot[pcpu_nr_slots - 1], list)
 			if (pos != chunk) {
-				pcpu_schedule_balance_work();
+				need_balance = true;
 				break;
 			}
 	}
@@ -1767,6 +1769,9 @@ void free_percpu(void __percpu *ptr)
 	trace_percpu_free_percpu(chunk->base_addr, off, ptr);
 
 	spin_unlock_irqrestore(&pcpu_lock, flags);
+
+	if (need_balance)
+		pcpu_schedule_balance_work();
 }
 EXPORT_SYMBOL_GPL(free_percpu);
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/rmap.c linux-libre-5.1.10-gnu/mm/rmap.c
--- linux-libre-5.1.9-gnu/mm/rmap.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/rmap.c	2019-06-15 05:53:06.000000000 -0400
@@ -928,7 +928,7 @@ static bool page_mkclean_one(struct page
 				continue;
 
 			flush_cache_page(vma, address, page_to_pfn(page));
-			entry = pmdp_huge_clear_flush(vma, address, pmd);
+			entry = pmdp_invalidate(vma, address, pmd);
 			entry = pmd_wrprotect(entry);
 			entry = pmd_mkclean(entry);
 			set_pmd_at(vma->vm_mm, address, pmd, entry);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/mm/slab.c linux-libre-5.1.10-gnu/mm/slab.c
--- linux-libre-5.1.9-gnu/mm/slab.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/mm/slab.c	2019-06-15 05:53:06.000000000 -0400
@@ -4328,8 +4328,12 @@ static int leaks_show(struct seq_file *m
 	 * whole processing.
 	 */
 	do {
-		set_store_user_clean(cachep);
 		drain_cpu_caches(cachep);
+		/*
+		 * drain_cpu_caches() could make kmemleak_object and
+		 * debug_objects_cache dirty, so reset afterwards.
+		 */
+		set_store_user_clean(cachep);
 
 		x[1] = 0;
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/net/batman-adv/distributed-arp-table.c linux-libre-5.1.10-gnu/net/batman-adv/distributed-arp-table.c
--- linux-libre-5.1.9-gnu/net/batman-adv/distributed-arp-table.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/net/batman-adv/distributed-arp-table.c	2019-06-15 05:53:06.000000000 -0400
@@ -667,7 +667,7 @@ batadv_dat_select_candidates(struct bata
 }
 
 /**
- * batadv_dat_send_data() - send a payload to the selected candidates
+ * batadv_dat_forward_data() - copy and send payload to the selected candidates
  * @bat_priv: the bat priv with all the soft interface information
  * @skb: payload to send
  * @ip: the DHT key
@@ -680,9 +680,9 @@ batadv_dat_select_candidates(struct bata
  * Return: true if the packet is sent to at least one candidate, false
  * otherwise.
  */
-static bool batadv_dat_send_data(struct batadv_priv *bat_priv,
-				 struct sk_buff *skb, __be32 ip,
-				 unsigned short vid, int packet_subtype)
+static bool batadv_dat_forward_data(struct batadv_priv *bat_priv,
+				    struct sk_buff *skb, __be32 ip,
+				    unsigned short vid, int packet_subtype)
 {
 	int i;
 	bool ret = false;
@@ -1277,8 +1277,8 @@ bool batadv_dat_snoop_outgoing_arp_reque
 		ret = true;
 	} else {
 		/* Send the request to the DHT */
-		ret = batadv_dat_send_data(bat_priv, skb, ip_dst, vid,
-					   BATADV_P_DAT_DHT_GET);
+		ret = batadv_dat_forward_data(bat_priv, skb, ip_dst, vid,
+					      BATADV_P_DAT_DHT_GET);
 	}
 out:
 	if (dat_entry)
@@ -1392,8 +1392,10 @@ void batadv_dat_snoop_outgoing_arp_reply
 	/* Send the ARP reply to the candidates for both the IP addresses that
 	 * the node obtained from the ARP reply
 	 */
-	batadv_dat_send_data(bat_priv, skb, ip_src, vid, BATADV_P_DAT_DHT_PUT);
-	batadv_dat_send_data(bat_priv, skb, ip_dst, vid, BATADV_P_DAT_DHT_PUT);
+	batadv_dat_forward_data(bat_priv, skb, ip_src, vid,
+				BATADV_P_DAT_DHT_PUT);
+	batadv_dat_forward_data(bat_priv, skb, ip_dst, vid,
+				BATADV_P_DAT_DHT_PUT);
 }
 
 /**
@@ -1710,8 +1712,10 @@ static void batadv_dat_put_dhcp(struct b
 	batadv_dat_entry_add(bat_priv, yiaddr, chaddr, vid);
 	batadv_dat_entry_add(bat_priv, ip_dst, hw_dst, vid);
 
-	batadv_dat_send_data(bat_priv, skb, yiaddr, vid, BATADV_P_DAT_DHT_PUT);
-	batadv_dat_send_data(bat_priv, skb, ip_dst, vid, BATADV_P_DAT_DHT_PUT);
+	batadv_dat_forward_data(bat_priv, skb, yiaddr, vid,
+				BATADV_P_DAT_DHT_PUT);
+	batadv_dat_forward_data(bat_priv, skb, ip_dst, vid,
+				BATADV_P_DAT_DHT_PUT);
 
 	consume_skb(skb);
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/net/bluetooth/hci_conn.c linux-libre-5.1.10-gnu/net/bluetooth/hci_conn.c
--- linux-libre-5.1.9-gnu/net/bluetooth/hci_conn.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/net/bluetooth/hci_conn.c	2019-06-15 05:53:06.000000000 -0400
@@ -1276,14 +1276,6 @@ int hci_conn_check_link_mode(struct hci_
 	    !test_bit(HCI_CONN_ENCRYPT, &conn->flags))
 		return 0;
 
-	/* The minimum encryption key size needs to be enforced by the
-	 * host stack before establishing any L2CAP connections. The
-	 * specification in theory allows a minimum of 1, but to align
-	 * BR/EDR and LE transports, a minimum of 7 is chosen.
-	 */
-	if (conn->enc_key_size < HCI_MIN_ENC_KEY_SIZE)
-		return 0;
-
 	return 1;
 }
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/net/netfilter/nf_conntrack_h323_asn1.c linux-libre-5.1.10-gnu/net/netfilter/nf_conntrack_h323_asn1.c
--- linux-libre-5.1.9-gnu/net/netfilter/nf_conntrack_h323_asn1.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/net/netfilter/nf_conntrack_h323_asn1.c	2019-06-15 05:53:06.000000000 -0400
@@ -172,7 +172,7 @@ static int nf_h323_error_boundary(struct
 	if (bits % BITS_PER_BYTE > 0)
 		bytes++;
 
-	if (*bs->cur + bytes > *bs->end)
+	if (bs->cur + bytes > bs->end)
 		return 1;
 
 	return 0;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/net/netfilter/nf_flow_table_core.c linux-libre-5.1.10-gnu/net/netfilter/nf_flow_table_core.c
--- linux-libre-5.1.9-gnu/net/netfilter/nf_flow_table_core.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/net/netfilter/nf_flow_table_core.c	2019-06-15 05:53:06.000000000 -0400
@@ -185,14 +185,25 @@ static const struct rhashtable_params nf
 
 int flow_offload_add(struct nf_flowtable *flow_table, struct flow_offload *flow)
 {
-	flow->timeout = (u32)jiffies;
+	int err;
 
-	rhashtable_insert_fast(&flow_table->rhashtable,
-			       &flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].node,
-			       nf_flow_offload_rhash_params);
-	rhashtable_insert_fast(&flow_table->rhashtable,
-			       &flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].node,
-			       nf_flow_offload_rhash_params);
+	err = rhashtable_insert_fast(&flow_table->rhashtable,
+				     &flow->tuplehash[0].node,
+				     nf_flow_offload_rhash_params);
+	if (err < 0)
+		return err;
+
+	err = rhashtable_insert_fast(&flow_table->rhashtable,
+				     &flow->tuplehash[1].node,
+				     nf_flow_offload_rhash_params);
+	if (err < 0) {
+		rhashtable_remove_fast(&flow_table->rhashtable,
+				       &flow->tuplehash[0].node,
+				       nf_flow_offload_rhash_params);
+		return err;
+	}
+
+	flow->timeout = (u32)jiffies;
 	return 0;
 }
 EXPORT_SYMBOL_GPL(flow_offload_add);
diff -druNp --no-dereference linux-libre-5.1.9-gnu/net/netfilter/nf_flow_table_ip.c linux-libre-5.1.10-gnu/net/netfilter/nf_flow_table_ip.c
--- linux-libre-5.1.9-gnu/net/netfilter/nf_flow_table_ip.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/net/netfilter/nf_flow_table_ip.c	2019-06-15 05:53:06.000000000 -0400
@@ -181,6 +181,9 @@ static int nf_flow_tuple_ip(struct sk_bu
 	    iph->protocol != IPPROTO_UDP)
 		return -1;
 
+	if (iph->ttl <= 1)
+		return -1;
+
 	thoff = iph->ihl * 4;
 	if (!pskb_may_pull(skb, thoff + sizeof(*ports)))
 		return -1;
@@ -411,6 +414,9 @@ static int nf_flow_tuple_ipv6(struct sk_
 	    ip6h->nexthdr != IPPROTO_UDP)
 		return -1;
 
+	if (ip6h->hop_limit <= 1)
+		return -1;
+
 	thoff = sizeof(*ip6h);
 	if (!pskb_may_pull(skb, thoff + sizeof(*ports)))
 		return -1;
diff -druNp --no-dereference linux-libre-5.1.9-gnu/net/netfilter/nf_tables_api.c linux-libre-5.1.10-gnu/net/netfilter/nf_tables_api.c
--- linux-libre-5.1.9-gnu/net/netfilter/nf_tables_api.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/net/netfilter/nf_tables_api.c	2019-06-15 05:53:06.000000000 -0400
@@ -1190,6 +1190,9 @@ static int nft_dump_stats(struct sk_buff
 	u64 pkts, bytes;
 	int cpu;
 
+	if (!stats)
+		return 0;
+
 	memset(&total, 0, sizeof(total));
 	for_each_possible_cpu(cpu) {
 		cpu_stats = per_cpu_ptr(stats, cpu);
@@ -1247,6 +1250,7 @@ static int nf_tables_fill_chain_info(str
 	if (nft_is_base_chain(chain)) {
 		const struct nft_base_chain *basechain = nft_base_chain(chain);
 		const struct nf_hook_ops *ops = &basechain->ops;
+		struct nft_stats __percpu *stats;
 		struct nlattr *nest;
 
 		nest = nla_nest_start(skb, NFTA_CHAIN_HOOK);
@@ -1268,8 +1272,9 @@ static int nf_tables_fill_chain_info(str
 		if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name))
 			goto nla_put_failure;
 
-		if (rcu_access_pointer(basechain->stats) &&
-		    nft_dump_stats(skb, rcu_dereference(basechain->stats)))
+		stats = rcu_dereference_check(basechain->stats,
+					      lockdep_commit_lock_is_held(net));
+		if (nft_dump_stats(skb, stats))
 			goto nla_put_failure;
 	}
 
diff -druNp --no-dereference linux-libre-5.1.9-gnu/net/netfilter/nft_flow_offload.c linux-libre-5.1.10-gnu/net/netfilter/nft_flow_offload.c
--- linux-libre-5.1.9-gnu/net/netfilter/nft_flow_offload.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/net/netfilter/nft_flow_offload.c	2019-06-15 05:53:06.000000000 -0400
@@ -113,6 +113,7 @@ static void nft_flow_offload_eval(const
 	if (ret < 0)
 		goto err_flow_add;
 
+	dst_release(route.tuple[!dir].dst);
 	return;
 
 err_flow_add:
diff -druNp --no-dereference linux-libre-5.1.9-gnu/sound/core/seq/seq_ports.c linux-libre-5.1.10-gnu/sound/core/seq/seq_ports.c
--- linux-libre-5.1.9-gnu/sound/core/seq/seq_ports.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/sound/core/seq/seq_ports.c	2019-06-15 05:53:06.000000000 -0400
@@ -550,10 +550,10 @@ static void delete_and_unsubscribe_port(
 		list_del_init(list);
 	grp->exclusive = 0;
 	write_unlock_irq(&grp->list_lock);
-	up_write(&grp->list_mutex);
 
 	if (!empty)
 		unsubscribe_port(client, port, grp, &subs->info, ack);
+	up_write(&grp->list_mutex);
 }
 
 /* connect two ports */
diff -druNp --no-dereference linux-libre-5.1.9-gnu/sound/pci/hda/hda_intel.c linux-libre-5.1.10-gnu/sound/pci/hda/hda_intel.c
--- linux-libre-5.1.9-gnu/sound/pci/hda/hda_intel.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/sound/pci/hda/hda_intel.c	2019-06-15 05:53:06.000000000 -0400
@@ -1788,9 +1788,6 @@ static int azx_first_init(struct azx *ch
 			chip->msi = 0;
 	}
 
-	if (azx_acquire_irq(chip, 0) < 0)
-		return -EBUSY;
-
 	pci_set_master(pci);
 	synchronize_irq(bus->irq);
 
@@ -1904,6 +1901,9 @@ static int azx_first_init(struct azx *ch
 		return -ENODEV;
 	}
 
+	if (azx_acquire_irq(chip, 0) < 0)
+		return -EBUSY;
+
 	strcpy(card->driver, "HDA-Intel");
 	strlcpy(card->shortname, driver_short_names[chip->driver_type],
 		sizeof(card->shortname));
diff -druNp --no-dereference linux-libre-5.1.9-gnu/tools/objtool/check.c linux-libre-5.1.10-gnu/tools/objtool/check.c
--- linux-libre-5.1.9-gnu/tools/objtool/check.c	2019-06-11 06:19:23.000000000 -0400
+++ linux-libre-5.1.10-gnu/tools/objtool/check.c	2019-06-15 05:53:06.000000000 -0400
@@ -28,6 +28,8 @@
 #include <linux/hashtable.h>
 #include <linux/kernel.h>
 
+#define FAKE_JUMP_OFFSET -1
+
 struct alternative {
 	struct list_head list;
 	struct instruction *insn;
@@ -501,7 +503,7 @@ static int add_jump_destinations(struct
 		    insn->type != INSN_JUMP_UNCONDITIONAL)
 			continue;
 
-		if (insn->ignore)
+		if (insn->ignore || insn->offset == FAKE_JUMP_OFFSET)
 			continue;
 
 		rela = find_rela_by_dest_range(insn->sec, insn->offset,
@@ -670,10 +672,10 @@ static int handle_group_alt(struct objto
 		clear_insn_state(&fake_jump->state);
 
 		fake_jump->sec = special_alt->new_sec;
-		fake_jump->offset = -1;
+		fake_jump->offset = FAKE_JUMP_OFFSET;
 		fake_jump->type = INSN_JUMP_UNCONDITIONAL;
 		fake_jump->jump_dest = list_next_entry(last_orig_insn, list);
-		fake_jump->ignore = true;
+		fake_jump->func = orig_insn->func;
 	}
 
 	if (!special_alt->new_len) {
