diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/am335x-pepper.dts linux-libre-4.4.123-gnu/arch/arm/boot/dts/am335x-pepper.dts
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/am335x-pepper.dts	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/am335x-pepper.dts	2018-03-22 04:23:32.000000000 -0400
@@ -139,7 +139,7 @@
 &audio_codec {
 	status = "okay";
 
-	gpio-reset = <&gpio1 16 GPIO_ACTIVE_LOW>;
+	reset-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
 	AVDD-supply = <&ldo3_reg>;
 	IOVDD-supply = <&ldo3_reg>;
 	DRVDD-supply = <&ldo3_reg>;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/exynos4412-trats2.dts linux-libre-4.4.123-gnu/arch/arm/boot/dts/exynos4412-trats2.dts
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/exynos4412-trats2.dts	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/exynos4412-trats2.dts	2018-03-22 04:23:32.000000000 -0400
@@ -359,7 +359,7 @@
 		reg = <0>;
 		vdd3-supply = <&lcd_vdd3_reg>;
 		vci-supply = <&ldo25_reg>;
-		reset-gpios = <&gpy4 5 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpf2 1 GPIO_ACTIVE_HIGH>;
 		power-on-delay= <50>;
 		reset-delay = <100>;
 		init-delay = <100>;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/logicpd-torpedo-som.dtsi linux-libre-4.4.123-gnu/arch/arm/boot/dts/logicpd-torpedo-som.dtsi
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/logicpd-torpedo-som.dtsi	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/logicpd-torpedo-som.dtsi	2018-03-22 04:23:32.000000000 -0400
@@ -90,6 +90,8 @@
 };
 
 &i2c1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&i2c1_pins>;
 	clock-frequency = <2600000>;
 
 	twl: twl@48 {
@@ -137,6 +139,12 @@
 			OMAP3_CORE1_IOPAD(0x218e, PIN_OUTPUT | MUX_MODE4)	/* mcbsp1_fsr.gpio_157 */
 		>;
 	};
+	i2c1_pins: pinmux_i2c1_pins {
+		pinctrl-single,pins = <
+			OMAP3_CORE1_IOPAD(0x21ba, PIN_INPUT | MUX_MODE0)        /* i2c1_scl.i2c1_scl */
+			OMAP3_CORE1_IOPAD(0x21bc, PIN_INPUT | MUX_MODE0)        /* i2c1_sda.i2c1_sda */
+		>;
+	};
 };
 
 &omap3_pmx_core2 {
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/moxart.dtsi linux-libre-4.4.123-gnu/arch/arm/boot/dts/moxart.dtsi
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/moxart.dtsi	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/moxart.dtsi	2018-03-22 04:23:32.000000000 -0400
@@ -6,6 +6,7 @@
  */
 
 /include/ "skeleton.dtsi"
+#include <dt-bindings/interrupt-controller/irq.h>
 
 / {
 	compatible = "moxa,moxart";
@@ -36,8 +37,8 @@
 		ranges;
 
 		intc: interrupt-controller@98800000 {
-			compatible = "moxa,moxart-ic";
-			reg = <0x98800000 0x38>;
+			compatible = "moxa,moxart-ic", "faraday,ftintc010";
+			reg = <0x98800000 0x100>;
 			interrupt-controller;
 			#interrupt-cells = <2>;
 			interrupt-mask = <0x00080000>;
@@ -59,7 +60,7 @@
 		timer: timer@98400000 {
 			compatible = "moxa,moxart-timer";
 			reg = <0x98400000 0x42>;
-			interrupts = <19 1>;
+			interrupts = <19 IRQ_TYPE_EDGE_FALLING>;
 			clocks = <&clk_apb>;
 		};
 
@@ -80,7 +81,7 @@
 		dma: dma@90500000 {
 			compatible = "moxa,moxart-dma";
 			reg = <0x90500080 0x40>;
-			interrupts = <24 0>;
+			interrupts = <24 IRQ_TYPE_LEVEL_HIGH>;
 			#dma-cells = <1>;
 		};
 
@@ -93,7 +94,7 @@
 		sdhci: sdhci@98e00000 {
 			compatible = "moxa,moxart-sdhci";
 			reg = <0x98e00000 0x5C>;
-			interrupts = <5 0>;
+			interrupts = <5 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&clk_apb>;
 			dmas =  <&dma 5>,
 				<&dma 5>;
@@ -120,7 +121,7 @@
 		mac0: mac@90900000 {
 			compatible = "moxa,moxart-mac";
 			reg = <0x90900000 0x90>;
-			interrupts = <25 0>;
+			interrupts = <25 IRQ_TYPE_LEVEL_HIGH>;
 			phy-handle = <&ethphy0>;
 			phy-mode = "mii";
 			status = "disabled";
@@ -129,7 +130,7 @@
 		mac1: mac@92000000 {
 			compatible = "moxa,moxart-mac";
 			reg = <0x92000000 0x90>;
-			interrupts = <27 0>;
+			interrupts = <27 IRQ_TYPE_LEVEL_HIGH>;
 			phy-handle = <&ethphy1>;
 			phy-mode = "mii";
 			status = "disabled";
@@ -138,7 +139,7 @@
 		uart0: uart@98200000 {
 			compatible = "ns16550a";
 			reg = <0x98200000 0x20>;
-			interrupts = <31 8>;
+			interrupts = <31 IRQ_TYPE_LEVEL_HIGH>;
 			reg-shift = <2>;
 			reg-io-width = <4>;
 			clock-frequency = <14745600>;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/moxart-uc7112lx.dts linux-libre-4.4.123-gnu/arch/arm/boot/dts/moxart-uc7112lx.dts
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/moxart-uc7112lx.dts	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/moxart-uc7112lx.dts	2018-03-22 04:23:32.000000000 -0400
@@ -6,7 +6,7 @@
  */
 
 /dts-v1/;
-/include/ "moxart.dtsi"
+#include "moxart.dtsi"
 
 / {
 	model = "MOXA UC-7112-LX";
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/omap3-n900.dts linux-libre-4.4.123-gnu/arch/arm/boot/dts/omap3-n900.dts
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/omap3-n900.dts	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/omap3-n900.dts	2018-03-22 04:23:32.000000000 -0400
@@ -488,7 +488,7 @@
 	tlv320aic3x: tlv320aic3x@18 {
 		compatible = "ti,tlv320aic3x";
 		reg = <0x18>;
-		gpio-reset = <&gpio2 28 GPIO_ACTIVE_HIGH>; /* 60 */
+		reset-gpios = <&gpio2 28 GPIO_ACTIVE_LOW>; /* 60 */
 		ai3x-gpio-func = <
 			0 /* AIC3X_GPIO1_FUNC_DISABLED */
 			5 /* AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT */
@@ -505,7 +505,7 @@
 	tlv320aic3x_aux: tlv320aic3x@19 {
 		compatible = "ti,tlv320aic3x";
 		reg = <0x19>;
-		gpio-reset = <&gpio2 28 GPIO_ACTIVE_HIGH>; /* 60 */
+		reset-gpios = <&gpio2 28 GPIO_ACTIVE_LOW>; /* 60 */
 
 		AVDD-supply = <&vmmc2>;
 		DRVDD-supply = <&vmmc2>;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/r8a7790.dtsi linux-libre-4.4.123-gnu/arch/arm/boot/dts/r8a7790.dtsi
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/r8a7790.dtsi	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/r8a7790.dtsi	2018-03-22 04:23:32.000000000 -0400
@@ -1360,8 +1360,11 @@
 			compatible = "renesas,r8a7790-mstp-clocks", "renesas,cpg-mstp-clocks";
 			reg = <0 0xe6150998 0 4>, <0 0xe61509a8 0 4>;
 			clocks = <&p_clk>,
-				<&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
-				<&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
+				<&mstp10_clks R8A7790_CLK_SSI_ALL>, <&mstp10_clks R8A7790_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7790_CLK_SSI_ALL>, <&mstp10_clks R8A7790_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7790_CLK_SSI_ALL>, <&mstp10_clks R8A7790_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7790_CLK_SSI_ALL>, <&mstp10_clks R8A7790_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7790_CLK_SSI_ALL>, <&mstp10_clks R8A7790_CLK_SSI_ALL>,
 				<&p_clk>,
 				<&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>,
 				<&mstp10_clks R8A7790_CLK_SCU_ALL>, <&mstp10_clks R8A7790_CLK_SCU_ALL>,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/r8a7791.dtsi linux-libre-4.4.123-gnu/arch/arm/boot/dts/r8a7791.dtsi
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/r8a7791.dtsi	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/r8a7791.dtsi	2018-03-22 04:23:32.000000000 -0400
@@ -1374,8 +1374,11 @@
 			compatible = "renesas,r8a7791-mstp-clocks", "renesas,cpg-mstp-clocks";
 			reg = <0 0xe6150998 0 4>, <0 0xe61509a8 0 4>;
 			clocks = <&p_clk>,
-				<&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
-				<&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>, <&p_clk>,
+				<&mstp10_clks R8A7791_CLK_SSI_ALL>, <&mstp10_clks R8A7791_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7791_CLK_SSI_ALL>, <&mstp10_clks R8A7791_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7791_CLK_SSI_ALL>, <&mstp10_clks R8A7791_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7791_CLK_SSI_ALL>, <&mstp10_clks R8A7791_CLK_SSI_ALL>,
+				<&mstp10_clks R8A7791_CLK_SSI_ALL>, <&mstp10_clks R8A7791_CLK_SSI_ALL>,
 				<&p_clk>,
 				<&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>,
 				<&mstp10_clks R8A7791_CLK_SCU_ALL>, <&mstp10_clks R8A7791_CLK_SCU_ALL>,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts linux-libre-4.4.123-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts
--- linux-libre-4.4.122-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts	2018-03-22 04:23:32.000000000 -0400
@@ -280,7 +280,7 @@
 	x2_clk: x2-clock {
 		compatible = "fixed-clock";
 		#clock-cells = <0>;
-		clock-frequency = <148500000>;
+		clock-frequency = <74250000>;
 	};
 
 	x13_clk: x13-clock {
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/mips/kernel/mips-r2-to-r6-emul.c linux-libre-4.4.123-gnu/arch/mips/kernel/mips-r2-to-r6-emul.c
--- linux-libre-4.4.122-gnu/arch/mips/kernel/mips-r2-to-r6-emul.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/mips/kernel/mips-r2-to-r6-emul.c	2018-03-22 04:23:32.000000000 -0400
@@ -1097,10 +1097,20 @@ repeat:
 		}
 		break;
 
-	case beql_op:
-	case bnel_op:
 	case blezl_op:
 	case bgtzl_op:
+		/*
+		 * For BLEZL and BGTZL, rt field must be set to 0. If this
+		 * is not the case, this may be an encoding of a MIPS R6
+		 * instruction, so return to CPU execution if this occurs
+		 */
+		if (MIPSInst_RT(inst)) {
+			err = SIGILL;
+			break;
+		}
+		/* fall through */
+	case beql_op:
+	case bnel_op:
 		if (delay_slot(regs)) {
 			err = SIGILL;
 			break;
@@ -2330,6 +2340,8 @@ static int mipsr2_stats_clear_show(struc
 	__this_cpu_write((mipsr2bremustats).bgezl, 0);
 	__this_cpu_write((mipsr2bremustats).bltzll, 0);
 	__this_cpu_write((mipsr2bremustats).bgezll, 0);
+	__this_cpu_write((mipsr2bremustats).bltzall, 0);
+	__this_cpu_write((mipsr2bremustats).bgezall, 0);
 	__this_cpu_write((mipsr2bremustats).bltzal, 0);
 	__this_cpu_write((mipsr2bremustats).bgezal, 0);
 	__this_cpu_write((mipsr2bremustats).beql, 0);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/mips/net/bpf_jit_asm.S linux-libre-4.4.123-gnu/arch/mips/net/bpf_jit_asm.S
--- linux-libre-4.4.122-gnu/arch/mips/net/bpf_jit_asm.S	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/mips/net/bpf_jit_asm.S	2018-03-22 04:23:32.000000000 -0400
@@ -90,18 +90,14 @@ FEXPORT(sk_load_half_positive)
 	is_offset_in_header(2, half)
 	/* Offset within header boundaries */
 	PTR_ADDU t1, $r_skb_data, offset
-	.set	reorder
-	lh	$r_A, 0(t1)
-	.set	noreorder
+	lhu	$r_A, 0(t1)
 #ifdef CONFIG_CPU_LITTLE_ENDIAN
 # if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
-	wsbh	t0, $r_A
-	seh	$r_A, t0
+	wsbh	$r_A, $r_A
 # else
-	sll	t0, $r_A, 24
-	andi	t1, $r_A, 0xff00
-	sra	t0, t0, 16
-	srl	t1, t1, 8
+	sll	t0, $r_A, 8
+	srl	t1, $r_A, 8
+	andi	t0, t0, 0xff00
 	or	$r_A, t0, t1
 # endif
 #endif
@@ -115,7 +111,7 @@ FEXPORT(sk_load_byte_positive)
 	is_offset_in_header(1, byte)
 	/* Offset within header boundaries */
 	PTR_ADDU t1, $r_skb_data, offset
-	lb	$r_A, 0(t1)
+	lbu	$r_A, 0(t1)
 	jr	$r_ra
 	 move	$r_ret, zero
 	END(sk_load_byte)
@@ -139,6 +135,11 @@ FEXPORT(sk_load_byte_positive)
  * (void *to) is returned in r_s0
  *
  */
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+#define DS_OFFSET(SIZE) (4 * SZREG)
+#else
+#define DS_OFFSET(SIZE) ((4 * SZREG) + (4 - SIZE))
+#endif
 #define bpf_slow_path_common(SIZE)				\
 	/* Quick check. Are we within reasonable boundaries? */ \
 	LONG_ADDIU	$r_s1, $r_skb_len, -SIZE;		\
@@ -150,7 +151,7 @@ FEXPORT(sk_load_byte_positive)
 	PTR_LA		t0, skb_copy_bits;			\
 	PTR_S		$r_ra, (5 * SZREG)($r_sp);		\
 	/* Assign low slot to a2 */				\
-	move		a2, $r_sp;				\
+	PTR_ADDIU	a2, $r_sp, DS_OFFSET(SIZE);		\
 	jalr		t0;					\
 	/* Reset our destination slot (DS but it's ok) */	\
 	 INT_S		zero, (4 * SZREG)($r_sp);		\
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/mips/net/bpf_jit.c linux-libre-4.4.123-gnu/arch/mips/net/bpf_jit.c
--- linux-libre-4.4.122-gnu/arch/mips/net/bpf_jit.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/mips/net/bpf_jit.c	2018-03-22 04:23:32.000000000 -0400
@@ -527,7 +527,8 @@ static void save_bpf_jit_regs(struct jit
 	u32 sflags, tmp_flags;
 
 	/* Adjust the stack pointer */
-	emit_stack_offset(-align_sp(offset), ctx);
+	if (offset)
+		emit_stack_offset(-align_sp(offset), ctx);
 
 	tmp_flags = sflags = ctx->flags >> SEEN_SREG_SFT;
 	/* sflags is essentially a bitmap */
@@ -579,7 +580,8 @@ static void restore_bpf_jit_regs(struct
 		emit_load_stack_reg(r_ra, r_sp, real_off, ctx);
 
 	/* Restore the sp and discard the scrach memory */
-	emit_stack_offset(align_sp(offset), ctx);
+	if (offset)
+		emit_stack_offset(align_sp(offset), ctx);
 }
 
 static unsigned int get_stack_depth(struct jit_ctx *ctx)
@@ -626,8 +628,14 @@ static void build_prologue(struct jit_ct
 	if (ctx->flags & SEEN_X)
 		emit_jit_reg_move(r_X, r_zero, ctx);
 
-	/* Do not leak kernel data to userspace */
-	if (bpf_needs_clear_a(&ctx->skf->insns[0]))
+	/*
+	 * Do not leak kernel data to userspace, we only need to clear
+	 * r_A if it is ever used.  In fact if it is never used, we
+	 * will not save/restore it, so clearing it in this case would
+	 * corrupt the state of the caller.
+	 */
+	if (bpf_needs_clear_a(&ctx->skf->insns[0]) &&
+	    (ctx->flags & SEEN_A))
 		emit_jit_reg_move(r_A, r_zero, ctx);
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/powerpc/mm/fault.c linux-libre-4.4.123-gnu/arch/powerpc/mm/fault.c
--- linux-libre-4.4.122-gnu/arch/powerpc/mm/fault.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/powerpc/mm/fault.c	2018-03-22 04:23:32.000000000 -0400
@@ -294,7 +294,7 @@ int __kprobes do_page_fault(struct pt_re
 	 * can result in fault, which will cause a deadlock when called with
 	 * mmap_sem held
 	 */
-	if (user_mode(regs))
+	if (!is_exec && user_mode(regs))
 		store_update_sp = store_updates_sp(regs);
 
 	if (user_mode(regs))
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/x86/kernel/kprobes/core.c linux-libre-4.4.123-gnu/arch/x86/kernel/kprobes/core.c
--- linux-libre-4.4.122-gnu/arch/x86/kernel/kprobes/core.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/x86/kernel/kprobes/core.c	2018-03-22 04:23:32.000000000 -0400
@@ -196,6 +196,8 @@ retry:
 		return (opcode != 0x62 && opcode != 0x67);
 	case 0x70:
 		return 0; /* can't boost conditional jump */
+	case 0x90:
+		return opcode != 0x9a;	/* can't boost call far */
 	case 0xc0:
 		/* can't boost software-interruptions */
 		return (0xc1 < opcode && opcode < 0xcc) || opcode == 0xcf;
@@ -404,6 +406,8 @@ static int arch_copy_kprobe(struct kprob
 {
 	int ret;
 
+	set_memory_rw((unsigned long)p->ainsn.insn & PAGE_MASK, 1);
+
 	/* Copy an instruction with recovering if other optprobe modifies it.*/
 	ret = __copy_instruction(p->ainsn.insn, p->addr);
 	if (!ret)
@@ -418,6 +422,8 @@ static int arch_copy_kprobe(struct kprob
 	else
 		p->ainsn.boostable = -1;
 
+	set_memory_ro((unsigned long)p->ainsn.insn & PAGE_MASK, 1);
+
 	/* Check whether the instruction modifies Interrupt Flag or not */
 	p->ainsn.if_modifier = is_IF_modifier(p->ainsn.insn);
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/x86/kernel/kprobes/opt.c linux-libre-4.4.123-gnu/arch/x86/kernel/kprobes/opt.c
--- linux-libre-4.4.122-gnu/arch/x86/kernel/kprobes/opt.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/x86/kernel/kprobes/opt.c	2018-03-22 04:23:32.000000000 -0400
@@ -370,6 +370,7 @@ int arch_prepare_optimized_kprobe(struct
 	}
 
 	buf = (u8 *)op->optinsn.insn;
+	set_memory_rw((unsigned long)buf & PAGE_MASK, 1);
 
 	/* Copy instructions into the out-of-line buffer */
 	ret = copy_optimized_instructions(buf + TMPL_END_IDX, op->kp.addr);
@@ -392,6 +393,8 @@ int arch_prepare_optimized_kprobe(struct
 	synthesize_reljump(buf + TMPL_END_IDX + op->optinsn.size,
 			   (u8 *)op->kp.addr + op->optinsn.size);
 
+	set_memory_ro((unsigned long)buf & PAGE_MASK, 1);
+
 	flush_icache_range((unsigned long) buf,
 			   (unsigned long) buf + TMPL_END_IDX +
 			   op->optinsn.size + RELATIVEJUMP_SIZE);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/x86/kernel/vm86_32.c linux-libre-4.4.123-gnu/arch/x86/kernel/vm86_32.c
--- linux-libre-4.4.122-gnu/arch/x86/kernel/vm86_32.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/x86/kernel/vm86_32.c	2018-03-22 04:23:32.000000000 -0400
@@ -715,7 +715,8 @@ void handle_vm86_fault(struct kernel_vm8
 	return;
 
 check_vip:
-	if (VEFLAGS & X86_EFLAGS_VIP) {
+	if ((VEFLAGS & (X86_EFLAGS_VIP | X86_EFLAGS_VIF)) ==
+	    (X86_EFLAGS_VIP | X86_EFLAGS_VIF)) {
 		save_v86_state(regs, VM86_STI);
 		return;
 	}
diff -druNp --no-dereference linux-libre-4.4.122-gnu/arch/x86/mm/fault.c linux-libre-4.4.123-gnu/arch/x86/mm/fault.c
--- linux-libre-4.4.122-gnu/arch/x86/mm/fault.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/arch/x86/mm/fault.c	2018-03-22 04:23:32.000000000 -0400
@@ -287,7 +287,7 @@ static noinline int vmalloc_fault(unsign
 	if (!pmd_k)
 		return -1;
 
-	if (pmd_huge(*pmd_k))
+	if (pmd_large(*pmd_k))
 		return 0;
 
 	pte_k = pte_offset_kernel(pmd_k, address);
@@ -407,7 +407,7 @@ static noinline int vmalloc_fault(unsign
 	if (pud_none(*pud) || pud_pfn(*pud) != pud_pfn(*pud_ref))
 		BUG();
 
-	if (pud_huge(*pud))
+	if (pud_large(*pud))
 		return 0;
 
 	pmd = pmd_offset(pud, address);
@@ -418,7 +418,7 @@ static noinline int vmalloc_fault(unsign
 	if (pmd_none(*pmd) || pmd_pfn(*pmd) != pmd_pfn(*pmd_ref))
 		BUG();
 
-	if (pmd_huge(*pmd))
+	if (pmd_large(*pmd))
 		return 0;
 
 	pte_ref = pte_offset_kernel(pmd_ref, address);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/block/blk-cgroup.c linux-libre-4.4.123-gnu/block/blk-cgroup.c
--- linux-libre-4.4.122-gnu/block/blk-cgroup.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/block/blk-cgroup.c	2018-03-22 04:23:32.000000000 -0400
@@ -1078,10 +1078,8 @@ int blkcg_init_queue(struct request_queu
 	if (preloaded)
 		radix_tree_preload_end();
 
-	if (IS_ERR(blkg)) {
-		blkg_free(new_blkg);
+	if (IS_ERR(blkg))
 		return PTR_ERR(blkg);
-	}
 
 	q->root_blkg = blkg;
 	q->root_rl.blkg = blkg;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/block/blk-throttle.c linux-libre-4.4.123-gnu/block/blk-throttle.c
--- linux-libre-4.4.122-gnu/block/blk-throttle.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/block/blk-throttle.c	2018-03-22 04:23:32.000000000 -0400
@@ -505,6 +505,17 @@ static void throtl_dequeue_tg(struct thr
 static void throtl_schedule_pending_timer(struct throtl_service_queue *sq,
 					  unsigned long expires)
 {
+	unsigned long max_expire = jiffies + 8 * throtl_slice;
+
+	/*
+	 * Since we are adjusting the throttle limit dynamically, the sleep
+	 * time calculated according to previous limit might be invalid. It's
+	 * possible the cgroup sleep time is very long and no other cgroups
+	 * have IO running so notify the limit changes. Make sure the cgroup
+	 * doesn't sleep too long to avoid the missed notification.
+	 */
+	if (time_after(expires, max_expire))
+		expires = max_expire;
 	mod_timer(&sq->pending_timer, expires);
 	throtl_log(sq, "schedule timer. delay=%lu jiffies=%lu",
 		   expires - jiffies, jiffies);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/char/agp/intel-gtt.c linux-libre-4.4.123-gnu/drivers/char/agp/intel-gtt.c
--- linux-libre-4.4.122-gnu/drivers/char/agp/intel-gtt.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/char/agp/intel-gtt.c	2018-03-22 04:23:32.000000000 -0400
@@ -859,6 +859,8 @@ void intel_gtt_insert_sg_entries(struct
 		}
 	}
 	wmb();
+	if (intel_private.driver->chipset_flush)
+		intel_private.driver->chipset_flush();
 }
 EXPORT_SYMBOL(intel_gtt_insert_sg_entries);
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/clk/qcom/gcc-msm8916.c linux-libre-4.4.123-gnu/drivers/clk/qcom/gcc-msm8916.c
--- linux-libre-4.4.122-gnu/drivers/clk/qcom/gcc-msm8916.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/clk/qcom/gcc-msm8916.c	2018-03-22 04:23:32.000000000 -0400
@@ -1437,6 +1437,7 @@ static const struct freq_tbl ftbl_codec_
 
 static struct clk_rcg2 codec_digcodec_clk_src = {
 	.cmd_rcgr = 0x1c09c,
+	.mnd_width = 8,
 	.hid_width = 5,
 	.parent_map = gcc_xo_gpll1_emclk_sleep_map,
 	.freq_tbl = ftbl_codec_clk,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/cpufreq/cpufreq.c linux-libre-4.4.123-gnu/drivers/cpufreq/cpufreq.c
--- linux-libre-4.4.122-gnu/drivers/cpufreq/cpufreq.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/cpufreq/cpufreq.c	2018-03-22 04:23:32.000000000 -0400
@@ -551,6 +551,8 @@ static int cpufreq_parse_governor(char *
 			*governor = t;
 			err = 0;
 		}
+		if (t && !try_module_get(t->owner))
+			t = NULL;
 
 		mutex_unlock(&cpufreq_governor_mutex);
 	}
@@ -669,6 +671,10 @@ static ssize_t store_scaling_governor(st
 		return -EINVAL;
 
 	ret = cpufreq_set_policy(policy, &new_policy);
+
+	if (new_policy.governor)
+		module_put(new_policy.governor->owner);
+
 	return ret ? ret : count;
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/dma/imx-sdma.c linux-libre-4.4.123-gnu/drivers/dma/imx-sdma.c
--- linux-libre-4.4.122-gnu/drivers/dma/imx-sdma.c	2018-03-19 03:28:25.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/dma/imx-sdma.c	2018-03-22 15:59:52.000000000 -0400
@@ -911,6 +911,21 @@ static int sdma_disable_channel(struct d
 	return 0;
 }
 
+static int sdma_disable_channel_with_delay(struct dma_chan *chan)
+{
+	sdma_disable_channel(chan);
+
+	/*
+	 * According to NXP R&D team a delay of one BD SDMA cost time
+	 * (maximum is 1ms) should be added after disable of the channel
+	 * bit, to ensure SDMA core has really been stopped after SDMA
+	 * clients call .device_terminate_all.
+	 */
+	mdelay(1);
+
+	return 0;
+}
+
 static void sdma_set_watermarklevel_for_p2p(struct sdma_channel *sdmac)
 {
 	struct sdma_engine *sdma = sdmac->sdma;
@@ -1793,7 +1808,7 @@ static int sdma_probe(struct platform_de
 	sdma->dma_device.device_prep_slave_sg = sdma_prep_slave_sg;
 	sdma->dma_device.device_prep_dma_cyclic = sdma_prep_dma_cyclic;
 	sdma->dma_device.device_config = sdma_config;
-	sdma->dma_device.device_terminate_all = sdma_disable_channel;
+	sdma->dma_device.device_terminate_all = sdma_disable_channel_with_delay;
 	sdma->dma_device.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
 	sdma->dma_device.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
 	sdma->dma_device.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c linux-libre-4.4.123-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c	2018-03-22 04:23:32.000000000 -0400
@@ -69,25 +69,18 @@ void amdgpu_connector_hotplug(struct drm
 		/* don't do anything if sink is not display port, i.e.,
 		 * passive dp->(dvi|hdmi) adaptor
 		 */
-		if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
-			int saved_dpms = connector->dpms;
-			/* Only turn off the display if it's physically disconnected */
-			if (!amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd)) {
-				drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
-			} else if (amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {
-				/* Don't try to start link training before we
-				 * have the dpcd */
-				if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
-					return;
+		if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT &&
+		    amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd) &&
+		    amdgpu_atombios_dp_needs_link_train(amdgpu_connector)) {
+			/* Don't start link training before we have the DPCD */
+			if (amdgpu_atombios_dp_get_dpcd(amdgpu_connector))
+				return;
 
-				/* set it to OFF so that drm_helper_connector_dpms()
-				 * won't return immediately since the current state
-				 * is ON at this point.
-				 */
-				connector->dpms = DRM_MODE_DPMS_OFF;
-				drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
-			}
-			connector->dpms = saved_dpms;
+			/* Turn the connector off and back on immediately, which
+			 * will trigger link training
+			 */
+			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
+			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
 		}
 	}
 }
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c linux-libre-4.4.123-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c	2018-03-22 04:23:32.000000000 -0400
@@ -560,6 +560,12 @@ amdgpu_user_framebuffer_create(struct dr
 		return ERR_PTR(-ENOENT);
 	}
 
+	/* Handle is imported dma-buf, so cannot be migrated to VRAM for scanout */
+	if (obj->import_attach) {
+		DRM_DEBUG_KMS("Cannot create framebuffer from imported dma_buf\n");
+		return ERR_PTR(-EINVAL);
+	}
+
 	amdgpu_fb = kzalloc(sizeof(*amdgpu_fb), GFP_KERNEL);
 	if (amdgpu_fb == NULL) {
 		drm_gem_object_unreference_unlocked(obj);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/amd/amdkfd/kfd_topology.c linux-libre-4.4.123-gnu/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/amd/amdkfd/kfd_topology.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/amd/amdkfd/kfd_topology.c	2018-03-22 04:23:32.000000000 -0400
@@ -519,11 +519,17 @@ static ssize_t sysprops_show(struct kobj
 	return ret;
 }
 
+static void kfd_topology_kobj_release(struct kobject *kobj)
+{
+	kfree(kobj);
+}
+
 static const struct sysfs_ops sysprops_ops = {
 	.show = sysprops_show,
 };
 
 static struct kobj_type sysprops_type = {
+	.release = kfd_topology_kobj_release,
 	.sysfs_ops = &sysprops_ops,
 };
 
@@ -559,6 +565,7 @@ static const struct sysfs_ops iolink_ops
 };
 
 static struct kobj_type iolink_type = {
+	.release = kfd_topology_kobj_release,
 	.sysfs_ops = &iolink_ops,
 };
 
@@ -586,6 +593,7 @@ static const struct sysfs_ops mem_ops =
 };
 
 static struct kobj_type mem_type = {
+	.release = kfd_topology_kobj_release,
 	.sysfs_ops = &mem_ops,
 };
 
@@ -625,6 +633,7 @@ static const struct sysfs_ops cache_ops
 };
 
 static struct kobj_type cache_type = {
+	.release = kfd_topology_kobj_release,
 	.sysfs_ops = &cache_ops,
 };
 
@@ -747,6 +756,7 @@ static const struct sysfs_ops node_ops =
 };
 
 static struct kobj_type node_type = {
+	.release = kfd_topology_kobj_release,
 	.sysfs_ops = &node_ops,
 };
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/drm_edid.c linux-libre-4.4.123-gnu/drivers/gpu/drm/drm_edid.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/drm_edid.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/drm_edid.c	2018-03-22 04:23:32.000000000 -0400
@@ -3219,8 +3219,7 @@ monitor_name(struct detailed_timing *t,
  * @edid: EDID to parse
  *
  * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
- * Conn_Type, HDCP and Port_ID ELD fields are left for the graphics driver to
- * fill in.
+ * HDCP and Port_ID ELD fields are left for the graphics driver to fill in.
  */
 void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
 {
@@ -3293,6 +3292,12 @@ void drm_edid_to_eld(struct drm_connecto
 	}
 	eld[5] |= sad_count << 4;
 
+	if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
+	    connector->connector_type == DRM_MODE_CONNECTOR_eDP)
+		eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_DP;
+	else
+		eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_CONN_TYPE_HDMI;
+
 	eld[DRM_ELD_BASELINE_ELD_LEN] =
 		DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/drm_irq.c linux-libre-4.4.123-gnu/drivers/gpu/drm/drm_irq.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/drm_irq.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/drm_irq.c	2018-03-22 04:23:32.000000000 -0400
@@ -1271,9 +1271,9 @@ void drm_vblank_put(struct drm_device *d
 	if (atomic_dec_and_test(&vblank->refcount)) {
 		if (drm_vblank_offdelay == 0)
 			return;
-		else if (dev->vblank_disable_immediate || drm_vblank_offdelay < 0)
+		else if (drm_vblank_offdelay < 0)
 			vblank_disable_fn((unsigned long)vblank);
-		else
+		else if (!dev->vblank_disable_immediate)
 			mod_timer(&vblank->disable_timer,
 				  jiffies + ((drm_vblank_offdelay * HZ)/1000));
 	}
@@ -1902,6 +1902,16 @@ bool drm_handle_vblank(struct drm_device
 	wake_up(&vblank->queue);
 	drm_handle_vblank_events(dev, pipe);
 
+	/* With instant-off, we defer disabling the interrupt until after
+	 * we finish processing the following vblank. The disable has to
+	 * be last (after drm_handle_vblank_events) so that the timestamp
+	 * is always accurate.
+	 */
+	if (dev->vblank_disable_immediate &&
+	    drm_vblank_offdelay > 0 &&
+	    !atomic_read(&vblank->refcount))
+		vblank_disable_fn((unsigned long)vblank);
+
 	spin_unlock_irqrestore(&dev->event_lock, irqflags);
 
 	return true;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/qxl/qxl_fb.c linux-libre-4.4.123-gnu/drivers/gpu/drm/qxl/qxl_fb.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/qxl/qxl_fb.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/qxl/qxl_fb.c	2018-03-22 04:23:32.000000000 -0400
@@ -494,9 +494,11 @@ static const struct drm_fb_helper_funcs
 
 int qxl_fbdev_init(struct qxl_device *qdev)
 {
+	int ret = 0;
+
+#ifdef CONFIG_DRM_FBDEV_EMULATION
 	struct qxl_fbdev *qfbdev;
 	int bpp_sel = 32; /* TODO: parameter from somewhere? */
-	int ret;
 
 	qfbdev = kzalloc(sizeof(struct qxl_fbdev), GFP_KERNEL);
 	if (!qfbdev)
@@ -531,6 +533,8 @@ fini:
 	drm_fb_helper_fini(&qfbdev->helper);
 free:
 	kfree(qfbdev);
+#endif
+
 	return ret;
 }
 
@@ -546,6 +550,9 @@ void qxl_fbdev_fini(struct qxl_device *q
 
 void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state)
 {
+	if (!qdev->mode_info.qfbdev)
+		return;
+
 	drm_fb_helper_set_suspend(&qdev->mode_info.qfbdev->helper, state);
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/radeon/radeon_display.c linux-libre-4.4.123-gnu/drivers/gpu/drm/radeon/radeon_display.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/radeon/radeon_display.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/radeon/radeon_display.c	2018-03-22 04:23:32.000000000 -0400
@@ -1374,6 +1374,12 @@ radeon_user_framebuffer_create(struct dr
 		return ERR_PTR(-ENOENT);
 	}
 
+	/* Handle is imported dma-buf, so cannot be migrated to VRAM for scanout */
+	if (obj->import_attach) {
+		DRM_DEBUG_KMS("Cannot create framebuffer from imported dma_buf\n");
+		return ERR_PTR(-EINVAL);
+	}
+
 	radeon_fb = kzalloc(sizeof(*radeon_fb), GFP_KERNEL);
 	if (radeon_fb == NULL) {
 		drm_gem_object_unreference_unlocked(obj);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c linux-libre-4.4.123-gnu/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
--- linux-libre-4.4.122-gnu/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c	2018-03-22 04:23:32.000000000 -0400
@@ -433,7 +433,7 @@ static int vmw_fb_kms_detach(struct vmw_
 		set.y = 0;
 		set.mode = NULL;
 		set.fb = NULL;
-		set.num_connectors = 1;
+		set.num_connectors = 0;
 		set.connectors = &par->con;
 		ret = drm_mode_set_config_internal(&set);
 		if (ret) {
@@ -821,7 +821,9 @@ int vmw_fb_off(struct vmw_private *vmw_p
 	flush_delayed_work(&par->local_work);
 
 	mutex_lock(&par->bo_mutex);
+	drm_modeset_lock_all(vmw_priv->dev);
 	(void) vmw_fb_kms_detach(par, true, false);
+	drm_modeset_unlock_all(vmw_priv->dev);
 	mutex_unlock(&par->bo_mutex);
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/hid/hid-elo.c linux-libre-4.4.123-gnu/drivers/hid/hid-elo.c
--- linux-libre-4.4.122-gnu/drivers/hid/hid-elo.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/hid/hid-elo.c	2018-03-22 04:23:32.000000000 -0400
@@ -42,6 +42,12 @@ static int elo_input_configured(struct h
 {
 	struct input_dev *input = hidinput->input;
 
+	/*
+	 * ELO devices have one Button usage in GenDesk field, which makes
+	 * hid-input map it to BTN_LEFT; that confuses userspace, which then
+	 * considers the device to be a mouse/touchpad instead of touchscreen.
+	 */
+	clear_bit(BTN_LEFT, input->keybit);
 	set_bit(BTN_TOUCH, input->keybit);
 	set_bit(ABS_PRESSURE, input->absbit);
 	input_set_abs_params(input, ABS_PRESSURE, 0, 256, 0, 0);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/hid/hid-input.c linux-libre-4.4.123-gnu/drivers/hid/hid-input.c
--- linux-libre-4.4.122-gnu/drivers/hid/hid-input.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/hid/hid-input.c	2018-03-22 04:23:32.000000000 -0400
@@ -1128,18 +1128,26 @@ void hidinput_hid_event(struct hid_devic
 
 	/*
 	 * Ignore out-of-range values as per HID specification,
-	 * section 5.10 and 6.2.25.
+	 * section 5.10 and 6.2.25, when NULL state bit is present.
+	 * When it's not, clamp the value to match Microsoft's input
+	 * driver as mentioned in "Required HID usages for digitizers":
+	 * https://msdn.microsoft.com/en-us/library/windows/hardware/dn672278(v=vs.85).asp
 	 *
 	 * The logical_minimum < logical_maximum check is done so that we
 	 * don't unintentionally discard values sent by devices which
 	 * don't specify logical min and max.
 	 */
 	if ((field->flags & HID_MAIN_ITEM_VARIABLE) &&
-	    (field->logical_minimum < field->logical_maximum) &&
-	    (value < field->logical_minimum ||
-	     value > field->logical_maximum)) {
-		dbg_hid("Ignoring out-of-range value %x\n", value);
-		return;
+	    (field->logical_minimum < field->logical_maximum)) {
+		if (field->flags & HID_MAIN_ITEM_NULL_STATE &&
+		    (value < field->logical_minimum ||
+		     value > field->logical_maximum)) {
+			dbg_hid("Ignoring out-of-range value %x\n", value);
+			return;
+		}
+		value = clamp(value,
+			      field->logical_minimum,
+			      field->logical_maximum);
 	}
 
 	/*
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/hwmon/pmbus/adm1275.c linux-libre-4.4.123-gnu/drivers/hwmon/pmbus/adm1275.c
--- linux-libre-4.4.122-gnu/drivers/hwmon/pmbus/adm1275.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/hwmon/pmbus/adm1275.c	2018-03-22 04:23:32.000000000 -0400
@@ -95,8 +95,8 @@ static const struct coefficients adm1075
 	[0] = { 27169, 0, -1 },		/* voltage */
 	[1] = { 806, 20475, -1 },	/* current, irange25 */
 	[2] = { 404, 20475, -1 },	/* current, irange50 */
-	[3] = { 0, -1, 8549 },		/* power, irange25 */
-	[4] = { 0, -1, 4279 },		/* power, irange50 */
+	[3] = { 8549, 0, -1 },		/* power, irange25 */
+	[4] = { 4279, 0, -1 },		/* power, irange50 */
 };
 
 static const struct coefficients adm1275_coefficients[] = {
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/hwtracing/coresight/of_coresight.c linux-libre-4.4.123-gnu/drivers/hwtracing/coresight/of_coresight.c
--- linux-libre-4.4.122-gnu/drivers/hwtracing/coresight/of_coresight.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/hwtracing/coresight/of_coresight.c	2018-03-22 04:23:32.000000000 -0400
@@ -150,7 +150,7 @@ struct coresight_platform_data *of_get_c
 				continue;
 
 			/* The local out port number */
-			pdata->outports[i] = endpoint.id;
+			pdata->outports[i] = endpoint.port;
 
 			/*
 			 * Get a handle on the remote port and parent
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/input/keyboard/qt1070.c linux-libre-4.4.123-gnu/drivers/input/keyboard/qt1070.c
--- linux-libre-4.4.122-gnu/drivers/input/keyboard/qt1070.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/input/keyboard/qt1070.c	2018-03-22 04:23:32.000000000 -0400
@@ -274,9 +274,18 @@ static const struct i2c_device_id qt1070
 };
 MODULE_DEVICE_TABLE(i2c, qt1070_id);
 
+#ifdef CONFIG_OF
+static const struct of_device_id qt1070_of_match[] = {
+	{ .compatible = "qt1070", },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, qt1070_of_match);
+#endif
+
 static struct i2c_driver qt1070_driver = {
 	.driver	= {
 		.name	= "qt1070",
+		.of_match_table = of_match_ptr(qt1070_of_match),
 		.pm	= &qt1070_pm_ops,
 	},
 	.id_table	= qt1070_id,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/input/touchscreen/tsc2007.c linux-libre-4.4.123-gnu/drivers/input/touchscreen/tsc2007.c
--- linux-libre-4.4.122-gnu/drivers/input/touchscreen/tsc2007.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/input/touchscreen/tsc2007.c	2018-03-22 04:23:32.000000000 -0400
@@ -455,6 +455,14 @@ static int tsc2007_probe(struct i2c_clie
 
 	tsc2007_stop(ts);
 
+	/* power down the chip (TSC2007_SETUP does not ACK on I2C) */
+	err = tsc2007_xfer(ts, PWRDOWN);
+	if (err < 0) {
+		dev_err(&client->dev,
+			"Failed to setup chip: %d\n", err);
+		return err;	/* usually, chip does not respond */
+	}
+
 	err = input_register_device(input_dev);
 	if (err) {
 		dev_err(&client->dev,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/iommu/iova.c linux-libre-4.4.123-gnu/drivers/iommu/iova.c
--- linux-libre-4.4.122-gnu/drivers/iommu/iova.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/iommu/iova.c	2018-03-22 04:23:32.000000000 -0400
@@ -126,7 +126,7 @@ static int __alloc_and_insert_iova_range
 				break;	/* found a free slot */
 		}
 adjust_limit_pfn:
-		limit_pfn = curr_iova->pfn_lo - 1;
+		limit_pfn = curr_iova->pfn_lo ? (curr_iova->pfn_lo - 1) : 0;
 move_left:
 		prev = curr;
 		curr = rb_prev(curr);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/irqchip/irq-gic-v3-its.c linux-libre-4.4.123-gnu/drivers/irqchip/irq-gic-v3-its.c
--- linux-libre-4.4.122-gnu/drivers/irqchip/irq-gic-v3-its.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/irqchip/irq-gic-v3-its.c	2018-03-22 04:23:32.000000000 -0400
@@ -663,7 +663,7 @@ static struct irq_chip its_irq_chip = {
  * This gives us (((1UL << id_bits) - 8192) >> 5) possible allocations.
  */
 #define IRQS_PER_CHUNK_SHIFT	5
-#define IRQS_PER_CHUNK		(1 << IRQS_PER_CHUNK_SHIFT)
+#define IRQS_PER_CHUNK		(1UL << IRQS_PER_CHUNK_SHIFT)
 
 static unsigned long *lpi_bitmap;
 static u32 lpi_chunks;
@@ -1168,11 +1168,10 @@ static struct its_device *its_create_dev
 
 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
 	/*
-	 * At least one bit of EventID is being used, hence a minimum
-	 * of two entries. No, the architecture doesn't let you
-	 * express an ITT with a single entry.
+	 * We allocate at least one chunk worth of LPIs bet device,
+	 * and thus that many ITEs. The device may require less though.
 	 */
-	nr_ites = max(2UL, roundup_pow_of_two(nvecs));
+	nr_ites = max(IRQS_PER_CHUNK, roundup_pow_of_two(nvecs));
 	sz = nr_ites * its->ite_size;
 	sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1;
 	itt = kzalloc(sz, GFP_KERNEL);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/md/raid5.c linux-libre-4.4.123-gnu/drivers/md/raid5.c
--- linux-libre-4.4.122-gnu/drivers/md/raid5.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/md/raid5.c	2018-03-22 04:23:32.000000000 -0400
@@ -3372,9 +3372,20 @@ static int fetch_block(struct stripe_hea
 		BUG_ON(test_bit(R5_Wantcompute, &dev->flags));
 		BUG_ON(test_bit(R5_Wantread, &dev->flags));
 		BUG_ON(sh->batch_head);
+
+		/*
+		 * In the raid6 case if the only non-uptodate disk is P
+		 * then we already trusted P to compute the other failed
+		 * drives. It is safe to compute rather than re-read P.
+		 * In other cases we only compute blocks from failed
+		 * devices, otherwise check/repair might fail to detect
+		 * a real inconsistency.
+		 */
+
 		if ((s->uptodate == disks - 1) &&
+		    ((sh->qd_idx >= 0 && sh->pd_idx == disk_idx) ||
 		    (s->failed && (disk_idx == s->failed_num[0] ||
-				   disk_idx == s->failed_num[1]))) {
+				   disk_idx == s->failed_num[1])))) {
 			/* have disk failed, and we're requested to fetch it;
 			 * do compute it
 			 */
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/media/i2c/soc_camera/ov6650.c linux-libre-4.4.123-gnu/drivers/media/i2c/soc_camera/ov6650.c
--- linux-libre-4.4.122-gnu/drivers/media/i2c/soc_camera/ov6650.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/media/i2c/soc_camera/ov6650.c	2018-03-22 04:23:32.000000000 -0400
@@ -1033,7 +1033,7 @@ static int ov6650_probe(struct i2c_clien
 	priv->code	  = MEDIA_BUS_FMT_YUYV8_2X8;
 	priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-	priv->clk = v4l2_clk_get(&client->dev, "mclk");
+	priv->clk = v4l2_clk_get(&client->dev, NULL);
 	if (IS_ERR(priv->clk)) {
 		ret = PTR_ERR(priv->clk);
 		goto eclkget;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/media/pci/solo6x10/solo6x10-v4l2.c linux-libre-4.4.123-gnu/drivers/media/pci/solo6x10/solo6x10-v4l2.c
--- linux-libre-4.4.122-gnu/drivers/media/pci/solo6x10/solo6x10-v4l2.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/media/pci/solo6x10/solo6x10-v4l2.c	2018-03-22 04:23:32.000000000 -0400
@@ -342,6 +342,17 @@ static void solo_stop_streaming(struct v
 	struct solo_dev *solo_dev = vb2_get_drv_priv(q);
 
 	solo_stop_thread(solo_dev);
+
+	spin_lock(&solo_dev->slock);
+	while (!list_empty(&solo_dev->vidq_active)) {
+		struct solo_vb2_buf *buf = list_entry(
+				solo_dev->vidq_active.next,
+				struct solo_vb2_buf, list);
+
+		list_del(&buf->list);
+		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
+	}
+	spin_unlock(&solo_dev->slock);
 	INIT_LIST_HEAD(&solo_dev->vidq_active);
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/media/usb/cpia2/cpia2_v4l.c linux-libre-4.4.123-gnu/drivers/media/usb/cpia2/cpia2_v4l.c
--- linux-libre-4.4.122-gnu/drivers/media/usb/cpia2/cpia2_v4l.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/media/usb/cpia2/cpia2_v4l.c	2018-03-22 04:23:32.000000000 -0400
@@ -812,7 +812,7 @@ static int cpia2_querybuf(struct file *f
 	struct camera_data *cam = video_drvdata(file);
 
 	if(buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
-	   buf->index > cam->num_frames)
+	   buf->index >= cam->num_frames)
 		return -EINVAL;
 
 	buf->m.offset = cam->buffers[buf->index].data - cam->frame_buffer;
@@ -863,7 +863,7 @@ static int cpia2_qbuf(struct file *file,
 
 	if(buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
 	   buf->memory != V4L2_MEMORY_MMAP ||
-	   buf->index > cam->num_frames)
+	   buf->index >= cam->num_frames)
 		return -EINVAL;
 
 	DBG("QBUF #%d\n", buf->index);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/misc/enclosure.c linux-libre-4.4.123-gnu/drivers/misc/enclosure.c
--- linux-libre-4.4.122-gnu/drivers/misc/enclosure.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/misc/enclosure.c	2018-03-22 04:23:32.000000000 -0400
@@ -148,7 +148,7 @@ enclosure_register(struct device *dev, c
 	for (i = 0; i < components; i++) {
 		edev->component[i].number = -1;
 		edev->component[i].slot = -1;
-		edev->component[i].power_status = 1;
+		edev->component[i].power_status = -1;
 	}
 
 	mutex_lock(&container_list_lock);
@@ -600,6 +600,11 @@ static ssize_t get_component_power_statu
 
 	if (edev->cb->get_power_status)
 		edev->cb->get_power_status(edev, ecomp);
+
+	/* If still uninitialized, the callback failed or does not exist. */
+	if (ecomp->power_status == -1)
+		return (edev->cb->get_power_status) ? -EIO : -ENOTTY;
+
 	return snprintf(buf, 40, "%s\n", ecomp->power_status ? "on" : "off");
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/mtd/nand/nand_base.c linux-libre-4.4.123-gnu/drivers/mtd/nand/nand_base.c
--- linux-libre-4.4.122-gnu/drivers/mtd/nand/nand_base.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/mtd/nand/nand_base.c	2018-03-22 04:23:32.000000000 -0400
@@ -626,7 +626,8 @@ static void nand_command(struct mtd_info
 		chip->cmd_ctrl(mtd, readcmd, ctrl);
 		ctrl &= ~NAND_CTRL_CHANGE;
 	}
-	chip->cmd_ctrl(mtd, command, ctrl);
+	if (command != NAND_CMD_NONE)
+		chip->cmd_ctrl(mtd, command, ctrl);
 
 	/* Address cycle, when necessary */
 	ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
@@ -655,6 +656,7 @@ static void nand_command(struct mtd_info
 	 */
 	switch (command) {
 
+	case NAND_CMD_NONE:
 	case NAND_CMD_PAGEPROG:
 	case NAND_CMD_ERASE1:
 	case NAND_CMD_ERASE2:
@@ -717,7 +719,9 @@ static void nand_command_lp(struct mtd_i
 	}
 
 	/* Command latch cycle */
-	chip->cmd_ctrl(mtd, command, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
+	if (command != NAND_CMD_NONE)
+		chip->cmd_ctrl(mtd, command,
+			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
 
 	if (column != -1 || page_addr != -1) {
 		int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
@@ -750,6 +754,7 @@ static void nand_command_lp(struct mtd_i
 	 */
 	switch (command) {
 
+	case NAND_CMD_NONE:
 	case NAND_CMD_CACHEDPROG:
 	case NAND_CMD_PAGEPROG:
 	case NAND_CMD_ERASE1:
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/bonding/bond_main.c linux-libre-4.4.123-gnu/drivers/net/bonding/bond_main.c
--- linux-libre-4.4.122-gnu/drivers/net/bonding/bond_main.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/bonding/bond_main.c	2018-03-22 04:23:32.000000000 -0400
@@ -3276,12 +3276,17 @@ static void bond_fold_stats(struct rtnl_
 	for (i = 0; i < sizeof(*_res) / sizeof(u64); i++) {
 		u64 nv = new[i];
 		u64 ov = old[i];
+		s64 delta = nv - ov;
 
 		/* detects if this particular field is 32bit only */
 		if (((nv | ov) >> 32) == 0)
-			res[i] += (u32)nv - (u32)ov;
-		else
-			res[i] += nv - ov;
+			delta = (s64)(s32)((u32)nv - (u32)ov);
+
+		/* filter anomalies, some drivers reset their stats
+		 * at down/up events.
+		 */
+		if (delta > 0)
+			res[i] += delta;
 	}
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c linux-libre-4.4.123-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
--- linux-libre-4.4.122-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c	2018-03-22 04:23:32.000000000 -0400
@@ -604,6 +604,7 @@ static void xgene_enet_cle_bypass(struct
 	xgene_enet_rd_csr(pdata, CLE_BYPASS_REG0_0_ADDR, &cb);
 	cb |= CFG_CLE_BYPASS_EN0;
 	CFG_CLE_IP_PROTOCOL0_SET(&cb, 3);
+	CFG_CLE_IP_HDR_LEN_SET(&cb, 0);
 	xgene_enet_wr_csr(pdata, CLE_BYPASS_REG0_0_ADDR, cb);
 
 	xgene_enet_rd_csr(pdata, CLE_BYPASS_REG1_0_ADDR, &cb);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h linux-libre-4.4.123-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
--- linux-libre-4.4.122-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h	2018-03-22 04:23:32.000000000 -0400
@@ -147,6 +147,7 @@ enum xgene_enet_rm {
 #define CFG_RXCLK_MUXSEL0_SET(dst, val)	xgene_set_bits(dst, val, 26, 3)
 
 #define CFG_CLE_IP_PROTOCOL0_SET(dst, val)	xgene_set_bits(dst, val, 16, 2)
+#define CFG_CLE_IP_HDR_LEN_SET(dst, val)	xgene_set_bits(dst, val, 8, 5)
 #define CFG_CLE_DSTQID0_SET(dst, val)		xgene_set_bits(dst, val, 0, 12)
 #define CFG_CLE_FPSEL0_SET(dst, val)		xgene_set_bits(dst, val, 16, 4)
 #define CFG_MACMODE_SET(dst, val)		xgene_set_bits(dst, val, 18, 2)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/ethernet/faraday/ftgmac100.c linux-libre-4.4.123-gnu/drivers/net/ethernet/faraday/ftgmac100.c
--- linux-libre-4.4.122-gnu/drivers/net/ethernet/faraday/ftgmac100.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/ethernet/faraday/ftgmac100.c	2018-03-22 04:23:32.000000000 -0400
@@ -28,6 +28,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
+#include <linux/of.h>
 #include <linux/phy.h>
 #include <linux/platform_device.h>
 #include <net/ip.h>
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c linux-libre-4.4.123-gnu/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
--- linux-libre-4.4.122-gnu/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c	2018-03-22 04:23:32.000000000 -0400
@@ -983,7 +983,7 @@ static void fm10k_self_test(struct net_d
 
 	memset(data, 0, sizeof(*data) * FM10K_TEST_LEN);
 
-	if (FM10K_REMOVED(hw)) {
+	if (FM10K_REMOVED(hw->hw_addr)) {
 		netif_err(interface, drv, dev,
 			  "Interface removed - test blocked\n");
 		eth_test->flags |= ETH_TEST_FL_FAILED;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c linux-libre-4.4.123-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
--- linux-libre-4.4.122-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c	2018-03-22 04:23:32.000000000 -0400
@@ -1073,6 +1073,11 @@ static int i40e_get_eeprom_len(struct ne
 	struct i40e_hw *hw = &np->vsi->back->hw;
 	u32 val;
 
+#define X722_EEPROM_SCOPE_LIMIT 0x5B9FFF
+	if (hw->mac.type == I40E_MAC_X722) {
+		val = X722_EEPROM_SCOPE_LIMIT + 1;
+		return val;
+	}
 	val = (rd32(hw, I40E_GLPCI_LBARCTRL)
 		& I40E_GLPCI_LBARCTRL_FL_SIZE_MASK)
 		>> I40E_GLPCI_LBARCTRL_FL_SIZE_SHIFT;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/ethernet/intel/i40e/i40e_nvm.c linux-libre-4.4.123-gnu/drivers/net/ethernet/intel/i40e/i40e_nvm.c
--- linux-libre-4.4.122-gnu/drivers/net/ethernet/intel/i40e/i40e_nvm.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/ethernet/intel/i40e/i40e_nvm.c	2018-03-22 04:23:32.000000000 -0400
@@ -292,14 +292,14 @@ i40e_status i40e_read_nvm_word(struct i4
 {
 	enum i40e_status_code ret_code = 0;
 
-	if (hw->flags & I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE) {
-		ret_code = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
-		if (!ret_code) {
+	ret_code = i40e_acquire_nvm(hw, I40E_RESOURCE_READ);
+	if (!ret_code) {
+		if (hw->flags & I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE) {
 			ret_code = i40e_read_nvm_word_aq(hw, offset, data);
-			i40e_release_nvm(hw);
+		} else {
+			ret_code = i40e_read_nvm_word_srctl(hw, offset, data);
 		}
-	} else {
-		ret_code = i40e_read_nvm_word_srctl(hw, offset, data);
+		i40e_release_nvm(hw);
 	}
 	return ret_code;
 }
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/ipvlan/ipvlan_core.c linux-libre-4.4.123-gnu/drivers/net/ipvlan/ipvlan_core.c
--- linux-libre-4.4.122-gnu/drivers/net/ipvlan/ipvlan_core.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/ipvlan/ipvlan_core.c	2018-03-22 04:23:32.000000000 -0400
@@ -282,6 +282,10 @@ static int ipvlan_rcv_frame(struct ipvl_
 		if (dev_forward_skb(ipvlan->dev, skb) == NET_RX_SUCCESS)
 			success = true;
 	} else {
+		if (!ether_addr_equal_64bits(eth_hdr(skb)->h_dest,
+					     ipvlan->phy_dev->dev_addr))
+			skb->pkt_type = PACKET_OTHERHOST;
+
 		ret = RX_HANDLER_ANOTHER;
 		success = true;
 	}
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/veth.c linux-libre-4.4.123-gnu/drivers/net/veth.c
--- linux-libre-4.4.122-gnu/drivers/net/veth.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/veth.c	2018-03-22 04:23:32.000000000 -0400
@@ -399,6 +399,9 @@ static int veth_newlink(struct net *src_
 	if (ifmp && (dev->ifindex != 0))
 		peer->ifindex = ifmp->ifi_index;
 
+	peer->gso_max_size = dev->gso_max_size;
+	peer->gso_max_segs = dev->gso_max_segs;
+
 	err = register_netdevice(peer);
 	put_net(net);
 	net = NULL;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/vxlan.c linux-libre-4.4.123-gnu/drivers/net/vxlan.c
--- linux-libre-4.4.122-gnu/drivers/net/vxlan.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/vxlan.c	2018-03-22 04:23:32.000000000 -0400
@@ -2834,6 +2834,11 @@ static int vxlan_dev_configure(struct ne
 		needed_headroom = lowerdev->hard_header_len;
 	}
 
+	if (lowerdev) {
+		dev->gso_max_size = lowerdev->gso_max_size;
+		dev->gso_max_segs = lowerdev->gso_max_segs;
+	}
+
 	if (conf->mtu) {
 		err = __vxlan_change_mtu(dev, lowerdev, dst, conf->mtu, false);
 		if (err)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/wireless/ath/ath10k/debug.c linux-libre-4.4.123-gnu/drivers/net/wireless/ath/ath10k/debug.c
--- linux-libre-4.4.122-gnu/drivers/net/wireless/ath/ath10k/debug.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/wireless/ath/ath10k/debug.c	2018-03-22 04:23:32.000000000 -0400
@@ -1892,6 +1892,15 @@ static ssize_t ath10k_write_simulate_rad
 					   size_t count, loff_t *ppos)
 {
 	struct ath10k *ar = file->private_data;
+	struct ath10k_vif *arvif;
+
+	/* Just check for for the first vif alone, as all the vifs will be
+	 * sharing the same channel and if the channel is disabled, all the
+	 * vifs will share the same 'is_started' state.
+	 */
+	arvif = list_first_entry(&ar->arvifs, typeof(*arvif), list);
+	if (!arvif->is_started)
+		return -EINVAL;
 
 	ieee80211_radar_detected(ar->hw);
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/wireless/ath/ath10k/mac.c linux-libre-4.4.123-gnu/drivers/net/wireless/ath/ath10k/mac.c
--- linux-libre-4.4.122-gnu/drivers/net/wireless/ath/ath10k/mac.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/wireless/ath/ath10k/mac.c	2018-03-22 04:23:32.000000000 -0400
@@ -5497,6 +5497,16 @@ static int ath10k_sta_state(struct ieee8
 			   "mac vdev %d peer delete %pM (sta gone)\n",
 			   arvif->vdev_id, sta->addr);
 
+		if (sta->tdls) {
+			ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id,
+							  sta,
+							  WMI_TDLS_PEER_STATE_TEARDOWN);
+			if (ret)
+				ath10k_warn(ar, "failed to update tdls peer state for %pM state %d: %i\n",
+					    sta->addr,
+					    WMI_TDLS_PEER_STATE_TEARDOWN, ret);
+		}
+
 		ret = ath10k_peer_delete(ar, arvif->vdev_id, sta->addr);
 		if (ret)
 			ath10k_warn(ar, "failed to delete peer %pM for vdev %d: %i\n",
@@ -6427,7 +6437,7 @@ ath10k_mac_update_rx_channel(struct ath1
 	lockdep_assert_held(&ar->data_lock);
 
 	WARN_ON(ctx && vifs);
-	WARN_ON(vifs && n_vifs != 1);
+	WARN_ON(vifs && !n_vifs);
 
 	/* FIXME: Sort of an optimization and a workaround. Peers and vifs are
 	 * on a linked list now. Doing a lookup peer -> vif -> chanctx for each
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/wireless/ath/ath10k/wmi.h linux-libre-4.4.123-gnu/drivers/net/wireless/ath/ath10k/wmi.h
--- linux-libre-4.4.122-gnu/drivers/net/wireless/ath/ath10k/wmi.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/wireless/ath/ath10k/wmi.h	2018-03-22 04:23:32.000000000 -0400
@@ -4826,7 +4826,8 @@ enum wmi_10_4_vdev_param {
 #define WMI_VDEV_PARAM_TXBF_MU_TX_BFER BIT(3)
 
 #define WMI_TXBF_STS_CAP_OFFSET_LSB	4
-#define WMI_TXBF_STS_CAP_OFFSET_MASK	0xf0
+#define WMI_TXBF_STS_CAP_OFFSET_MASK	0x70
+#define WMI_TXBF_CONF_IMPLICIT_BF       BIT(7)
 #define WMI_BF_SOUND_DIM_OFFSET_LSB	8
 #define WMI_BF_SOUND_DIM_OFFSET_MASK	0xf00
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/wireless/ath/wil6210/main.c linux-libre-4.4.123-gnu/drivers/net/wireless/ath/wil6210/main.c
--- linux-libre-4.4.122-gnu/drivers/net/wireless/ath/wil6210/main.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/wireless/ath/wil6210/main.c	2018-03-22 04:23:32.000000000 -0400
@@ -125,9 +125,15 @@ void wil_memcpy_fromio_32(void *dst, con
 	u32 *d = dst;
 	const volatile u32 __iomem *s = src;
 
-	/* size_t is unsigned, if (count%4 != 0) it will wrap */
-	for (count += 4; count > 4; count -= 4)
+	for (; count >= 4; count -= 4)
 		*d++ = __raw_readl(s++);
+
+	if (unlikely(count)) {
+		/* count can be 1..3 */
+		u32 tmp = __raw_readl(s);
+
+		memcpy(d, &tmp, count);
+	}
 }
 
 void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
@@ -136,8 +142,16 @@ void wil_memcpy_toio_32(volatile void __
 	volatile u32 __iomem *d = dst;
 	const u32 *s = src;
 
-	for (count += 4; count > 4; count -= 4)
+	for (; count >= 4; count -= 4)
 		__raw_writel(*s++, d++);
+
+	if (unlikely(count)) {
+		/* count can be 1..3 */
+		u32 tmp = 0;
+
+		memcpy(&tmp, s, count);
+		__raw_writel(tmp, d);
+	}
 }
 
 static void wil_disconnect_cid(struct wil6210_priv *wil, int cid,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/net/wireless/mac80211_hwsim.c linux-libre-4.4.123-gnu/drivers/net/wireless/mac80211_hwsim.c
--- linux-libre-4.4.122-gnu/drivers/net/wireless/mac80211_hwsim.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/net/wireless/mac80211_hwsim.c	2018-03-22 04:23:32.000000000 -0400
@@ -699,16 +699,21 @@ static int hwsim_fops_ps_write(void *dat
 	    val != PS_MANUAL_POLL)
 		return -EINVAL;
 
-	old_ps = data->ps;
-	data->ps = val;
-
-	local_bh_disable();
 	if (val == PS_MANUAL_POLL) {
+		if (data->ps != PS_ENABLED)
+			return -EINVAL;
+		local_bh_disable();
 		ieee80211_iterate_active_interfaces_atomic(
 			data->hw, IEEE80211_IFACE_ITER_NORMAL,
 			hwsim_send_ps_poll, data);
-		data->ps_poll_pending = true;
-	} else if (old_ps == PS_DISABLED && val != PS_DISABLED) {
+		local_bh_enable();
+		return 0;
+	}
+	old_ps = data->ps;
+	data->ps = val;
+
+	local_bh_disable();
+	if (old_ps == PS_DISABLED && val != PS_DISABLED) {
 		ieee80211_iterate_active_interfaces_atomic(
 			data->hw, IEEE80211_IFACE_ITER_NORMAL,
 			hwsim_send_nullfunc_ps, data);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/nfc/nfcmrvl/fw_dnld.c linux-libre-4.4.123-gnu/drivers/nfc/nfcmrvl/fw_dnld.c
--- linux-libre-4.4.122-gnu/drivers/nfc/nfcmrvl/fw_dnld.c	2018-03-19 03:40:00.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/nfc/nfcmrvl/fw_dnld.c	2018-03-22 16:11:02.000000000 -0400
@@ -17,7 +17,7 @@
  */
 
 #include <linux/module.h>
-#include <linux/unaligned/access_ok.h>
+#include <asm/unaligned.h>
 #include <linux/firmware.h>
 #include <linux/nfc.h>
 #include <net/nfc/nci.h>
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/nfc/nfcmrvl/spi.c linux-libre-4.4.123-gnu/drivers/nfc/nfcmrvl/spi.c
--- linux-libre-4.4.122-gnu/drivers/nfc/nfcmrvl/spi.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/nfc/nfcmrvl/spi.c	2018-03-22 04:23:32.000000000 -0400
@@ -96,10 +96,9 @@ static int nfcmrvl_spi_nci_send(struct n
 	/* Send the SPI packet */
 	err = nci_spi_send(drv_data->nci_spi, &drv_data->handshake_completion,
 			   skb);
-	if (err != 0) {
+	if (err)
 		nfc_err(priv->dev, "spi_send failed %d", err);
-		kfree_skb(skb);
-	}
+
 	return err;
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/of/device.c linux-libre-4.4.123-gnu/drivers/of/device.c
--- linux-libre-4.4.122-gnu/drivers/of/device.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/of/device.c	2018-03-22 04:23:32.000000000 -0400
@@ -223,7 +223,7 @@ ssize_t of_device_get_modalias(struct de
 			str[i] = '_';
 	}
 
-	return tsize;
+	return repend;
 }
 EXPORT_SYMBOL_GPL(of_device_get_modalias);
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/pci/pci-driver.c linux-libre-4.4.123-gnu/drivers/pci/pci-driver.c
--- linux-libre-4.4.122-gnu/drivers/pci/pci-driver.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/pci/pci-driver.c	2018-03-22 04:23:32.000000000 -0400
@@ -463,8 +463,6 @@ static void pci_device_shutdown(struct d
 
 	if (drv && drv->shutdown)
 		drv->shutdown(pci_dev);
-	pci_msi_shutdown(pci_dev);
-	pci_msix_shutdown(pci_dev);
 
 #ifdef CONFIG_KEXEC_CORE
 	/*
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/perf/arm_pmu.c linux-libre-4.4.123-gnu/drivers/perf/arm_pmu.c
--- linux-libre-4.4.122-gnu/drivers/perf/arm_pmu.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/perf/arm_pmu.c	2018-03-22 04:23:32.000000000 -0400
@@ -321,10 +321,16 @@ validate_group(struct perf_event *event)
 	return 0;
 }
 
+static struct arm_pmu_platdata *armpmu_get_platdata(struct arm_pmu *armpmu)
+{
+	struct platform_device *pdev = armpmu->plat_device;
+
+	return pdev ? dev_get_platdata(&pdev->dev) : NULL;
+}
+
 static irqreturn_t armpmu_dispatch_irq(int irq, void *dev)
 {
 	struct arm_pmu *armpmu;
-	struct platform_device *plat_device;
 	struct arm_pmu_platdata *plat;
 	int ret;
 	u64 start_clock, finish_clock;
@@ -336,8 +342,8 @@ static irqreturn_t armpmu_dispatch_irq(i
 	 * dereference.
 	 */
 	armpmu = *(void **)dev;
-	plat_device = armpmu->plat_device;
-	plat = dev_get_platdata(&plat_device->dev);
+
+	plat = armpmu_get_platdata(armpmu);
 
 	start_clock = sched_clock();
 	if (plat && plat->handle_irq)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/pwm/pwm-tegra.c linux-libre-4.4.123-gnu/drivers/pwm/pwm-tegra.c
--- linux-libre-4.4.122-gnu/drivers/pwm/pwm-tegra.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/pwm/pwm-tegra.c	2018-03-22 04:23:32.000000000 -0400
@@ -69,6 +69,7 @@ static int tegra_pwm_config(struct pwm_c
 	struct tegra_pwm_chip *pc = to_tegra_pwm_chip(chip);
 	unsigned long long c;
 	unsigned long rate, hz;
+	unsigned long long ns100 = NSEC_PER_SEC;
 	u32 val = 0;
 	int err;
 
@@ -87,9 +88,11 @@ static int tegra_pwm_config(struct pwm_c
 	 * cycles at the PWM clock rate will take period_ns nanoseconds.
 	 */
 	rate = clk_get_rate(pc->clk) >> PWM_DUTY_WIDTH;
-	hz = NSEC_PER_SEC / period_ns;
 
-	rate = (rate + (hz / 2)) / hz;
+	/* Consider precision in PWM_SCALE_WIDTH rate calculation */
+	ns100 *= 100;
+	hz = DIV_ROUND_CLOSEST_ULL(ns100, period_ns);
+	rate = DIV_ROUND_CLOSEST(rate * 100, hz);
 
 	/*
 	 * Since the actual PWM divider is the register's frequency divider
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/scsi/ipr.c linux-libre-4.4.123-gnu/drivers/scsi/ipr.c
--- linux-libre-4.4.122-gnu/drivers/scsi/ipr.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/scsi/ipr.c	2018-03-22 04:23:32.000000000 -0400
@@ -835,8 +835,10 @@ static void ipr_sata_eh_done(struct ipr_
 
 	qc->err_mask |= AC_ERR_OTHER;
 	sata_port->ioasa.status |= ATA_BUSY;
-	list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 	ata_qc_complete(qc);
+	if (ipr_cmd->eh_comp)
+		complete(ipr_cmd->eh_comp);
+	list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 }
 
 /**
@@ -5864,8 +5866,10 @@ static void ipr_erp_done(struct ipr_cmnd
 		res->in_erp = 0;
 	}
 	scsi_dma_unmap(ipr_cmd->scsi_cmd);
-	list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 	scsi_cmd->scsi_done(scsi_cmd);
+	if (ipr_cmd->eh_comp)
+		complete(ipr_cmd->eh_comp);
+	list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 }
 
 /**
@@ -6255,8 +6259,10 @@ static void ipr_erp_start(struct ipr_ioa
 	}
 
 	scsi_dma_unmap(ipr_cmd->scsi_cmd);
-	list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 	scsi_cmd->scsi_done(scsi_cmd);
+	if (ipr_cmd->eh_comp)
+		complete(ipr_cmd->eh_comp);
+	list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 }
 
 /**
@@ -6282,8 +6288,10 @@ static void ipr_scsi_done(struct ipr_cmn
 		scsi_dma_unmap(scsi_cmd);
 
 		spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags);
-		list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 		scsi_cmd->scsi_done(scsi_cmd);
+		if (ipr_cmd->eh_comp)
+			complete(ipr_cmd->eh_comp);
+		list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
 		spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags);
 	} else {
 		spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/scsi/scsi_devinfo.c linux-libre-4.4.123-gnu/drivers/scsi/scsi_devinfo.c
--- linux-libre-4.4.122-gnu/drivers/scsi/scsi_devinfo.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/scsi/scsi_devinfo.c	2018-03-22 04:23:32.000000000 -0400
@@ -180,7 +180,7 @@ static struct {
 	{"HITACHI", "6586-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
 	{"HITACHI", "6588-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
 	{"HP", "A6189A", NULL, BLIST_SPARSELUN | BLIST_LARGELUN},	/* HP VA7400 */
-	{"HP", "OPEN-", "*", BLIST_REPORTLUN2}, /* HP XP Arrays */
+	{"HP", "OPEN-", "*", BLIST_REPORTLUN2 | BLIST_TRY_VPD_PAGES}, /* HP XP Arrays */
 	{"HP", "NetRAID-4M", NULL, BLIST_FORCELUN},
 	{"HP", "HSV100", NULL, BLIST_REPORTLUN2 | BLIST_NOSTARTONADD},
 	{"HP", "C1557A", NULL, BLIST_FORCELUN},
@@ -589,17 +589,12 @@ int scsi_get_device_flags_keyed(struct s
 				int key)
 {
 	struct scsi_dev_info_list *devinfo;
-	int err;
 
 	devinfo = scsi_dev_info_list_find(vendor, model, key);
 	if (!IS_ERR(devinfo))
 		return devinfo->flags;
 
-	err = PTR_ERR(devinfo);
-	if (err != -ENOENT)
-		return err;
-
-	/* nothing found, return nothing */
+	/* key or device not found: return nothing */
 	if (key != SCSI_DEVINFO_GLOBAL)
 		return 0;
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/scsi/scsi_dh.c linux-libre-4.4.123-gnu/drivers/scsi/scsi_dh.c
--- linux-libre-4.4.122-gnu/drivers/scsi/scsi_dh.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/scsi/scsi_dh.c	2018-03-22 04:23:32.000000000 -0400
@@ -56,10 +56,13 @@ static const struct scsi_dh_blist scsi_d
 	{"IBM", "1815",			"rdac", },
 	{"IBM", "1818",			"rdac", },
 	{"IBM", "3526",			"rdac", },
+	{"IBM", "3542",			"rdac", },
+	{"IBM", "3552",			"rdac", },
 	{"SGI", "TP9",			"rdac", },
 	{"SGI", "IS",			"rdac", },
-	{"STK", "OPENstorage D280",	"rdac", },
+	{"STK", "OPENstorage",		"rdac", },
 	{"STK", "FLEXLINE 380",		"rdac", },
+	{"STK", "BladeCtlr",		"rdac", },
 	{"SUN", "CSM",			"rdac", },
 	{"SUN", "LCSM100",		"rdac", },
 	{"SUN", "STK6580_6780",		"rdac", },
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/scsi/ses.c linux-libre-4.4.123-gnu/drivers/scsi/ses.c
--- linux-libre-4.4.122-gnu/drivers/scsi/ses.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/scsi/ses.c	2018-03-22 04:23:32.000000000 -0400
@@ -546,7 +546,6 @@ static void ses_enclosure_data_process(s
 					ecomp = &edev->component[components++];
 
 				if (!IS_ERR(ecomp)) {
-					ses_get_power_status(edev, ecomp);
 					if (addl_desc_ptr)
 						ses_process_descriptor(
 							ecomp,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/scsi/sg.c linux-libre-4.4.123-gnu/drivers/scsi/sg.c
--- linux-libre-4.4.122-gnu/drivers/scsi/sg.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/scsi/sg.c	2018-03-22 04:23:32.000000000 -0400
@@ -535,6 +535,7 @@ sg_read(struct file *filp, char __user *
 	} else
 		count = (old_hdr->result == 0) ? 0 : -EIO;
 	sg_finish_rem_req(srp);
+	sg_remove_request(sfp, srp);
 	retval = count;
 free_old_hdr:
 	kfree(old_hdr);
@@ -575,6 +576,7 @@ sg_new_read(Sg_fd * sfp, char __user *bu
 	}
 err_out:
 	err2 = sg_finish_rem_req(srp);
+	sg_remove_request(sfp, srp);
 	return err ? : err2 ? : count;
 }
 
@@ -674,18 +676,14 @@ sg_write(struct file *filp, const char _
 	 * is a non-zero input_size, so emit a warning.
 	 */
 	if (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV) {
-		static char cmd[TASK_COMM_LEN];
-		if (strcmp(current->comm, cmd)) {
-			printk_ratelimited(KERN_WARNING
-					   "sg_write: data in/out %d/%d bytes "
-					   "for SCSI command 0x%x-- guessing "
-					   "data in;\n   program %s not setting "
-					   "count and/or reply_len properly\n",
-					   old_hdr.reply_len - (int)SZ_SG_HEADER,
-					   input_size, (unsigned int) cmnd[0],
-					   current->comm);
-			strcpy(cmd, current->comm);
-		}
+		printk_ratelimited(KERN_WARNING
+				   "sg_write: data in/out %d/%d bytes "
+				   "for SCSI command 0x%x-- guessing "
+				   "data in;\n   program %s not setting "
+				   "count and/or reply_len properly\n",
+				   old_hdr.reply_len - (int)SZ_SG_HEADER,
+				   input_size, (unsigned int) cmnd[0],
+				   current->comm);
 	}
 	k = sg_common_write(sfp, srp, cmnd, sfp->timeout, blocking);
 	return (k < 0) ? k : count;
@@ -784,11 +782,15 @@ sg_common_write(Sg_fd * sfp, Sg_request
 			"sg_common_write:  scsi opcode=0x%02x, cmd_size=%d\n",
 			(int) cmnd[0], (int) hp->cmd_len));
 
+	if (hp->dxfer_len >= SZ_256M)
+		return -EINVAL;
+
 	k = sg_start_req(srp, cmnd);
 	if (k) {
 		SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp,
 			"sg_common_write: start_req err=%d\n", k));
 		sg_finish_rem_req(srp);
+		sg_remove_request(sfp, srp);
 		return k;	/* probably out of space --> ENOMEM */
 	}
 	if (atomic_read(&sdp->detaching)) {
@@ -801,6 +803,7 @@ sg_common_write(Sg_fd * sfp, Sg_request
 		}
 
 		sg_finish_rem_req(srp);
+		sg_remove_request(sfp, srp);
 		return -ENODEV;
 	}
 
@@ -1290,6 +1293,7 @@ sg_rq_end_io_usercontext(struct work_str
 	struct sg_fd *sfp = srp->parentfp;
 
 	sg_finish_rem_req(srp);
+	sg_remove_request(sfp, srp);
 	kref_put(&sfp->f_ref, sg_remove_sfp);
 }
 
@@ -1834,8 +1838,6 @@ sg_finish_rem_req(Sg_request *srp)
 	else
 		sg_remove_scat(sfp, req_schp);
 
-	sg_remove_request(sfp, srp);
-
 	return ret;
 }
 
@@ -2182,12 +2184,17 @@ sg_remove_sfp_usercontext(struct work_st
 	struct sg_fd *sfp = container_of(work, struct sg_fd, ew.work);
 	struct sg_device *sdp = sfp->parentdp;
 	Sg_request *srp;
+	unsigned long iflags;
 
 	/* Cleanup any responses which were never read(). */
+	write_lock_irqsave(&sfp->rq_list_lock, iflags);
 	while (!list_empty(&sfp->rq_list)) {
 		srp = list_first_entry(&sfp->rq_list, Sg_request, entry);
 		sg_finish_rem_req(srp);
+		list_del(&srp->entry);
+		srp->parentfp = NULL;
 	}
+	write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
 
 	if (sfp->reserve.bufflen > 0) {
 		SCSI_LOG_TIMEOUT(6, sg_printk(KERN_INFO, sdp,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/spi/spi-omap2-mcspi.c linux-libre-4.4.123-gnu/drivers/spi/spi-omap2-mcspi.c
--- linux-libre-4.4.122-gnu/drivers/spi/spi-omap2-mcspi.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/spi/spi-omap2-mcspi.c	2018-03-22 04:23:32.000000000 -0400
@@ -457,6 +457,8 @@ omap2_mcspi_rx_dma(struct spi_device *sp
 	int			elements = 0;
 	int			word_len, element_count;
 	struct omap2_mcspi_cs	*cs = spi->controller_state;
+	void __iomem		*chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
+
 	mcspi = spi_master_get_devdata(spi->master);
 	mcspi_dma = &mcspi->dma_channels[spi->chip_select];
 	count = xfer->len;
@@ -517,8 +519,8 @@ omap2_mcspi_rx_dma(struct spi_device *sp
 	if (l & OMAP2_MCSPI_CHCONF_TURBO) {
 		elements--;
 
-		if (likely(mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHSTAT0)
-				   & OMAP2_MCSPI_CHSTAT_RXS)) {
+		if (!mcspi_wait_for_reg_bit(chstat_reg,
+					    OMAP2_MCSPI_CHSTAT_RXS)) {
 			u32 w;
 
 			w = mcspi_read_cs_reg(spi, OMAP2_MCSPI_RX0);
@@ -536,8 +538,7 @@ omap2_mcspi_rx_dma(struct spi_device *sp
 			return count;
 		}
 	}
-	if (likely(mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHSTAT0)
-				& OMAP2_MCSPI_CHSTAT_RXS)) {
+	if (!mcspi_wait_for_reg_bit(chstat_reg, OMAP2_MCSPI_CHSTAT_RXS)) {
 		u32 w;
 
 		w = mcspi_read_cs_reg(spi, OMAP2_MCSPI_RX0);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/spi/spi-sun6i.c linux-libre-4.4.123-gnu/drivers/spi/spi-sun6i.c
--- linux-libre-4.4.122-gnu/drivers/spi/spi-sun6i.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/spi/spi-sun6i.c	2018-03-22 04:23:32.000000000 -0400
@@ -457,7 +457,7 @@ err_free_master:
 
 static int sun6i_spi_remove(struct platform_device *pdev)
 {
-	pm_runtime_disable(&pdev->dev);
+	pm_runtime_force_suspend(&pdev->dev);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/staging/speakup/kobjects.c linux-libre-4.4.123-gnu/drivers/staging/speakup/kobjects.c
--- linux-libre-4.4.122-gnu/drivers/staging/speakup/kobjects.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/staging/speakup/kobjects.c	2018-03-22 04:23:32.000000000 -0400
@@ -831,7 +831,9 @@ static ssize_t message_show(struct kobje
 	struct msg_group_t *group = spk_find_msg_group(attr->attr.name);
 	unsigned long flags;
 
-	BUG_ON(!group);
+	if (WARN_ON(!group))
+		return -EINVAL;
+
 	spin_lock_irqsave(&speakup_info.spinlock, flags);
 	retval = message_show_helper(buf, group->start, group->end);
 	spin_unlock_irqrestore(&speakup_info.spinlock, flags);
@@ -843,7 +845,9 @@ static ssize_t message_store(struct kobj
 {
 	struct msg_group_t *group = spk_find_msg_group(attr->attr.name);
 
-	BUG_ON(!group);
+	if (WARN_ON(!group))
+		return -EINVAL;
+
 	return message_store_helper(buf, count, group);
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/staging/wilc1000/host_interface.c linux-libre-4.4.123-gnu/drivers/staging/wilc1000/host_interface.c
--- linux-libre-4.4.122-gnu/drivers/staging/wilc1000/host_interface.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/staging/wilc1000/host_interface.c	2018-03-22 04:23:32.000000000 -0400
@@ -2179,6 +2179,8 @@ static s32 Handle_Get_InActiveTime(struc
 	wid.type = WID_STR;
 	wid.size = ETH_ALEN;
 	wid.val = kmalloc(wid.size, GFP_KERNEL);
+	if (!wid.val)
+		return -ENOMEM;
 
 	stamac = wid.val;
 	memcpy(stamac, strHostIfStaInactiveT->mac, ETH_ALEN);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/usb/dwc2/hcd.c linux-libre-4.4.123-gnu/drivers/usb/dwc2/hcd.c
--- linux-libre-4.4.122-gnu/drivers/usb/dwc2/hcd.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/usb/dwc2/hcd.c	2018-03-22 04:23:32.000000000 -0400
@@ -1385,6 +1385,7 @@ static void dwc2_conn_id_status_change(s
 		dwc2_core_init(hsotg, false, -1);
 		dwc2_enable_global_interrupts(hsotg);
 		spin_lock_irqsave(&hsotg->lock, flags);
+		dwc2_hsotg_disconnect(hsotg);
 		dwc2_hsotg_core_init_disconnected(hsotg, false);
 		spin_unlock_irqrestore(&hsotg->lock, flags);
 		dwc2_hsotg_core_connect(hsotg);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/usb/gadget/udc/bdc/bdc_core.c linux-libre-4.4.123-gnu/drivers/usb/gadget/udc/bdc/bdc_core.c
--- linux-libre-4.4.122-gnu/drivers/usb/gadget/udc/bdc/bdc_core.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/usb/gadget/udc/bdc/bdc_core.c	2018-03-22 04:23:32.000000000 -0400
@@ -475,7 +475,7 @@ static int bdc_probe(struct platform_dev
 	bdc->dev = dev;
 	dev_dbg(bdc->dev, "bdc->regs: %p irq=%d\n", bdc->regs, bdc->irq);
 
-	temp = bdc_readl(bdc->regs, BDC_BDCSC);
+	temp = bdc_readl(bdc->regs, BDC_BDCCAP1);
 	if ((temp & BDC_P64) &&
 			!dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))) {
 		dev_dbg(bdc->dev, "Using 64-bit address\n");
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/usb/gadget/udc/bdc/bdc_pci.c linux-libre-4.4.123-gnu/drivers/usb/gadget/udc/bdc/bdc_pci.c
--- linux-libre-4.4.122-gnu/drivers/usb/gadget/udc/bdc/bdc_pci.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/usb/gadget/udc/bdc/bdc_pci.c	2018-03-22 04:23:32.000000000 -0400
@@ -82,6 +82,7 @@ static int bdc_pci_probe(struct pci_dev
 	if (ret) {
 		dev_err(&pci->dev,
 			"couldn't add resources to bdc device\n");
+		platform_device_put(bdc);
 		return ret;
 	}
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/usb/gadget/udc/dummy_hcd.c linux-libre-4.4.123-gnu/drivers/usb/gadget/udc/dummy_hcd.c
--- linux-libre-4.4.122-gnu/drivers/usb/gadget/udc/dummy_hcd.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/usb/gadget/udc/dummy_hcd.c	2018-03-22 04:23:32.000000000 -0400
@@ -2105,16 +2105,13 @@ static int dummy_hub_control(
 			}
 			break;
 		case USB_PORT_FEAT_POWER:
-			if (hcd->speed == HCD_USB3) {
-				if (dum_hcd->port_status & USB_PORT_STAT_POWER)
-					dev_dbg(dummy_dev(dum_hcd),
-						"power-off\n");
-			} else
-				if (dum_hcd->port_status &
-							USB_SS_PORT_STAT_POWER)
-					dev_dbg(dummy_dev(dum_hcd),
-						"power-off\n");
-			/* FALLS THROUGH */
+			dev_dbg(dummy_dev(dum_hcd), "power-off\n");
+			if (hcd->speed == HCD_USB3)
+				dum_hcd->port_status &= ~USB_SS_PORT_STAT_POWER;
+			else
+				dum_hcd->port_status &= ~USB_PORT_STAT_POWER;
+			set_link_state(dum_hcd);
+			break;
 		default:
 			dum_hcd->port_status &= ~(1 << wValue);
 			set_link_state(dum_hcd);
@@ -2285,14 +2282,13 @@ static int dummy_hub_control(
 				if ((dum_hcd->port_status &
 				     USB_SS_PORT_STAT_POWER) != 0) {
 					dum_hcd->port_status |= (1 << wValue);
-					set_link_state(dum_hcd);
 				}
 			} else
 				if ((dum_hcd->port_status &
 				     USB_PORT_STAT_POWER) != 0) {
 					dum_hcd->port_status |= (1 << wValue);
-					set_link_state(dum_hcd);
 				}
+			set_link_state(dum_hcd);
 		}
 		break;
 	case GetPortErrorCount:
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/video/fbdev/amba-clcd.c linux-libre-4.4.123-gnu/drivers/video/fbdev/amba-clcd.c
--- linux-libre-4.4.122-gnu/drivers/video/fbdev/amba-clcd.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/video/fbdev/amba-clcd.c	2018-03-22 04:23:32.000000000 -0400
@@ -759,8 +759,8 @@ static int clcdfb_of_dma_setup(struct cl
 	if (err)
 		return err;
 
-	framesize = fb->panel->mode.xres * fb->panel->mode.yres *
-			fb->panel->bpp / 8;
+	framesize = PAGE_ALIGN(fb->panel->mode.xres * fb->panel->mode.yres *
+			fb->panel->bpp / 8);
 	fb->fb.screen_base = dma_alloc_coherent(&fb->dev->dev, framesize,
 			&dma, GFP_KERNEL);
 	if (!fb->fb.screen_base)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/drivers/video/hdmi.c linux-libre-4.4.123-gnu/drivers/video/hdmi.c
--- linux-libre-4.4.122-gnu/drivers/video/hdmi.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/drivers/video/hdmi.c	2018-03-22 04:23:32.000000000 -0400
@@ -321,6 +321,17 @@ int hdmi_vendor_infoframe_init(struct hd
 }
 EXPORT_SYMBOL(hdmi_vendor_infoframe_init);
 
+static int hdmi_vendor_infoframe_length(const struct hdmi_vendor_infoframe *frame)
+{
+	/* for side by side (half) we also need to provide 3D_Ext_Data */
+	if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
+		return 6;
+	else if (frame->vic != 0 || frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
+		return 5;
+	else
+		return 4;
+}
+
 /**
  * hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary buffer
  * @frame: HDMI infoframe
@@ -341,19 +352,11 @@ ssize_t hdmi_vendor_infoframe_pack(struc
 	u8 *ptr = buffer;
 	size_t length;
 
-	/* empty info frame */
-	if (frame->vic == 0 && frame->s3d_struct == HDMI_3D_STRUCTURE_INVALID)
-		return -EINVAL;
-
 	/* only one of those can be supplied */
 	if (frame->vic != 0 && frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
 		return -EINVAL;
 
-	/* for side by side (half) we also need to provide 3D_Ext_Data */
-	if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
-		frame->length = 6;
-	else
-		frame->length = 5;
+	frame->length = hdmi_vendor_infoframe_length(frame);
 
 	length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
 
@@ -372,14 +375,16 @@ ssize_t hdmi_vendor_infoframe_pack(struc
 	ptr[5] = 0x0c;
 	ptr[6] = 0x00;
 
-	if (frame->vic) {
-		ptr[7] = 0x1 << 5;	/* video format */
-		ptr[8] = frame->vic;
-	} else {
+	if (frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID) {
 		ptr[7] = 0x2 << 5;	/* video format */
 		ptr[8] = (frame->s3d_struct & 0xf) << 4;
 		if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
 			ptr[9] = (frame->s3d_ext_data & 0xf) << 4;
+	} else if (frame->vic) {
+		ptr[7] = 0x1 << 5;	/* video format */
+		ptr[8] = frame->vic;
+	} else {
+		ptr[7] = 0x0 << 5;	/* video format */
 	}
 
 	hdmi_infoframe_set_checksum(buffer, length);
@@ -1161,7 +1166,7 @@ hdmi_vendor_any_infoframe_unpack(union h
 
 	if (ptr[0] != HDMI_INFOFRAME_TYPE_VENDOR ||
 	    ptr[1] != 1 ||
-	    (ptr[2] != 5 && ptr[2] != 6))
+	    (ptr[2] != 4 && ptr[2] != 5 && ptr[2] != 6))
 		return -EINVAL;
 
 	length = ptr[2];
@@ -1189,16 +1194,22 @@ hdmi_vendor_any_infoframe_unpack(union h
 
 	hvf->length = length;
 
-	if (hdmi_video_format == 0x1) {
-		hvf->vic = ptr[4];
-	} else if (hdmi_video_format == 0x2) {
+	if (hdmi_video_format == 0x2) {
+		if (length != 5 && length != 6)
+			return -EINVAL;
 		hvf->s3d_struct = ptr[4] >> 4;
 		if (hvf->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF) {
-			if (length == 6)
-				hvf->s3d_ext_data = ptr[5] >> 4;
-			else
+			if (length != 6)
 				return -EINVAL;
+			hvf->s3d_ext_data = ptr[5] >> 4;
 		}
+	} else if (hdmi_video_format == 0x1) {
+		if (length != 5)
+			return -EINVAL;
+		hvf->vic = ptr[4];
+	} else {
+		if (length != 4)
+			return -EINVAL;
 	}
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/aio.c linux-libre-4.4.123-gnu/fs/aio.c
--- linux-libre-4.4.122-gnu/fs/aio.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/aio.c	2018-03-22 04:23:32.000000000 -0400
@@ -68,9 +68,9 @@ struct aio_ring {
 #define AIO_RING_PAGES	8
 
 struct kioctx_table {
-	struct rcu_head	rcu;
-	unsigned	nr;
-	struct kioctx	*table[];
+	struct rcu_head		rcu;
+	unsigned		nr;
+	struct kioctx __rcu	*table[];
 };
 
 struct kioctx_cpu {
@@ -115,7 +115,8 @@ struct kioctx {
 	struct page		**ring_pages;
 	long			nr_pages;
 
-	struct work_struct	free_work;
+	struct rcu_head		free_rcu;
+	struct work_struct	free_work;	/* see free_ioctx() */
 
 	/*
 	 * signals when all in-flight requests are done
@@ -326,7 +327,7 @@ static int aio_ring_mremap(struct vm_are
 	for (i = 0; i < table->nr; i++) {
 		struct kioctx *ctx;
 
-		ctx = table->table[i];
+		ctx = rcu_dereference(table->table[i]);
 		if (ctx && ctx->aio_ring_file == file) {
 			if (!atomic_read(&ctx->dead)) {
 				ctx->user_id = ctx->mmap_base = vma->vm_start;
@@ -573,6 +574,12 @@ static int kiocb_cancel(struct aio_kiocb
 	return cancel(&kiocb->common);
 }
 
+/*
+ * free_ioctx() should be RCU delayed to synchronize against the RCU
+ * protected lookup_ioctx() and also needs process context to call
+ * aio_free_ring(), so the double bouncing through kioctx->free_rcu and
+ * ->free_work.
+ */
 static void free_ioctx(struct work_struct *work)
 {
 	struct kioctx *ctx = container_of(work, struct kioctx, free_work);
@@ -586,6 +593,14 @@ static void free_ioctx(struct work_struc
 	kmem_cache_free(kioctx_cachep, ctx);
 }
 
+static void free_ioctx_rcufn(struct rcu_head *head)
+{
+	struct kioctx *ctx = container_of(head, struct kioctx, free_rcu);
+
+	INIT_WORK(&ctx->free_work, free_ioctx);
+	schedule_work(&ctx->free_work);
+}
+
 static void free_ioctx_reqs(struct percpu_ref *ref)
 {
 	struct kioctx *ctx = container_of(ref, struct kioctx, reqs);
@@ -594,8 +609,8 @@ static void free_ioctx_reqs(struct percp
 	if (ctx->rq_wait && atomic_dec_and_test(&ctx->rq_wait->count))
 		complete(&ctx->rq_wait->comp);
 
-	INIT_WORK(&ctx->free_work, free_ioctx);
-	schedule_work(&ctx->free_work);
+	/* Synchronize against RCU protected table->table[] dereferences */
+	call_rcu(&ctx->free_rcu, free_ioctx_rcufn);
 }
 
 /*
@@ -636,9 +651,9 @@ static int ioctx_add_table(struct kioctx
 	while (1) {
 		if (table)
 			for (i = 0; i < table->nr; i++)
-				if (!table->table[i]) {
+				if (!rcu_access_pointer(table->table[i])) {
 					ctx->id = i;
-					table->table[i] = ctx;
+					rcu_assign_pointer(table->table[i], ctx);
 					spin_unlock(&mm->ioctx_lock);
 
 					/* While kioctx setup is in progress,
@@ -813,11 +828,11 @@ static int kill_ioctx(struct mm_struct *
 	}
 
 	table = rcu_dereference_raw(mm->ioctx_table);
-	WARN_ON(ctx != table->table[ctx->id]);
-	table->table[ctx->id] = NULL;
+	WARN_ON(ctx != rcu_access_pointer(table->table[ctx->id]));
+	RCU_INIT_POINTER(table->table[ctx->id], NULL);
 	spin_unlock(&mm->ioctx_lock);
 
-	/* percpu_ref_kill() will do the necessary call_rcu() */
+	/* free_ioctx_reqs() will do the necessary RCU synchronization */
 	wake_up_all(&ctx->wait);
 
 	/*
@@ -859,7 +874,8 @@ void exit_aio(struct mm_struct *mm)
 
 	skipped = 0;
 	for (i = 0; i < table->nr; ++i) {
-		struct kioctx *ctx = table->table[i];
+		struct kioctx *ctx =
+			rcu_dereference_protected(table->table[i], true);
 
 		if (!ctx) {
 			skipped++;
@@ -1048,7 +1064,7 @@ static struct kioctx *lookup_ioctx(unsig
 	if (!table || id >= table->nr)
 		goto out;
 
-	ctx = table->table[id];
+	ctx = rcu_dereference(table->table[id]);
 	if (ctx && ctx->user_id == ctx_id) {
 		percpu_ref_get(&ctx->users);
 		ret = ctx;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/btrfs/volumes.c linux-libre-4.4.123-gnu/fs/btrfs/volumes.c
--- linux-libre-4.4.122-gnu/fs/btrfs/volumes.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/btrfs/volumes.c	2018-03-22 04:23:32.000000000 -0400
@@ -568,6 +568,7 @@ void btrfs_free_stale_device(struct btrf
 				btrfs_sysfs_remove_fsid(fs_devs);
 				list_del(&fs_devs->list);
 				free_fs_devices(fs_devs);
+				break;
 			} else {
 				fs_devs->num_devices--;
 				list_del(&dev->dev_list);
@@ -4638,10 +4639,13 @@ static int __btrfs_alloc_chunk(struct bt
 	if (devs_max && ndevs > devs_max)
 		ndevs = devs_max;
 	/*
-	 * the primary goal is to maximize the number of stripes, so use as many
-	 * devices as possible, even if the stripes are not maximum sized.
+	 * The primary goal is to maximize the number of stripes, so use as
+	 * many devices as possible, even if the stripes are not maximum sized.
+	 *
+	 * The DUP profile stores more than one stripe per device, the
+	 * max_avail is the total size so we have to adjust.
 	 */
-	stripe_size = devices_info[ndevs-1].max_avail;
+	stripe_size = div_u64(devices_info[ndevs - 1].max_avail, dev_stripes);
 	num_stripes = ndevs * dev_stripes;
 
 	/*
@@ -4681,8 +4685,6 @@ static int __btrfs_alloc_chunk(struct bt
 			stripe_size = devices_info[ndevs-1].max_avail;
 	}
 
-	stripe_size = div_u64(stripe_size, dev_stripes);
-
 	/* align to BTRFS_STRIPE_LEN */
 	stripe_size = div_u64(stripe_size, raid_stripe_len);
 	stripe_size *= raid_stripe_len;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/dcache.c linux-libre-4.4.123-gnu/fs/dcache.c
--- linux-libre-4.4.122-gnu/fs/dcache.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/dcache.c	2018-03-22 04:23:32.000000000 -0400
@@ -634,11 +634,16 @@ again:
 		spin_unlock(&parent->d_lock);
 		goto again;
 	}
-	rcu_read_unlock();
-	if (parent != dentry)
+	if (parent != dentry) {
 		spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
-	else
+		if (unlikely(dentry->d_lockref.count < 0)) {
+			spin_unlock(&parent->d_lock);
+			parent = NULL;
+		}
+	} else {
 		parent = NULL;
+	}
+	rcu_read_unlock();
 	return parent;
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/f2fs/gc.c linux-libre-4.4.123-gnu/fs/f2fs/gc.c
--- linux-libre-4.4.122-gnu/fs/f2fs/gc.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/f2fs/gc.c	2018-03-22 04:23:32.000000000 -0400
@@ -522,8 +522,10 @@ static bool is_alive(struct f2fs_sb_info
 	get_node_info(sbi, nid, dni);
 
 	if (sum->version != dni->version) {
-		f2fs_put_page(node_page, 1);
-		return false;
+		f2fs_msg(sbi->sb, KERN_WARNING,
+				"%s: valid data with mismatched node version.",
+				__func__);
+		set_sbi_flag(sbi, SBI_NEED_FSCK);
 	}
 
 	*nofs = ofs_of_node(node_page);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/namei.c linux-libre-4.4.123-gnu/fs/namei.c
--- linux-libre-4.4.122-gnu/fs/namei.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/namei.c	2018-03-22 04:23:32.000000000 -0400
@@ -570,9 +570,10 @@ static int __nd_alloc_stack(struct namei
 static bool path_connected(const struct path *path)
 {
 	struct vfsmount *mnt = path->mnt;
+	struct super_block *sb = mnt->mnt_sb;
 
-	/* Only bind mounts can have disconnected paths */
-	if (mnt->mnt_root == mnt->mnt_sb->s_root)
+	/* Bind mounts and multi-root filesystems can have disconnected paths */
+	if (!(sb->s_iflags & SB_I_MULTIROOT) && (mnt->mnt_root == sb->s_root))
 		return true;
 
 	return is_subdir(path->dentry, mnt->mnt_root);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/nfs/super.c linux-libre-4.4.123-gnu/fs/nfs/super.c
--- linux-libre-4.4.122-gnu/fs/nfs/super.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/nfs/super.c	2018-03-22 04:23:32.000000000 -0400
@@ -2581,6 +2581,8 @@ struct dentry *nfs_fs_mount_common(struc
 		/* initial superblock/root creation */
 		mount_info->fill_super(s, mount_info);
 		nfs_get_cache_cookie(s, mount_info->parsed, mount_info->cloned);
+		if (!(server->flags & NFS_MOUNT_UNSHARED))
+			s->s_iflags |= SB_I_MULTIROOT;
 	}
 
 	mntroot = nfs_get_root(s, mount_info->mntfh, dev_name);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/reiserfs/journal.c linux-libre-4.4.123-gnu/fs/reiserfs/journal.c
--- linux-libre-4.4.122-gnu/fs/reiserfs/journal.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/reiserfs/journal.c	2018-03-22 04:23:32.000000000 -0400
@@ -1961,7 +1961,7 @@ static int do_journal_release(struct rei
 	 * will be requeued because superblock is being shutdown and doesn't
 	 * have MS_ACTIVE set.
 	 */
-	cancel_delayed_work_sync(&REISERFS_SB(sb)->old_work);
+	reiserfs_cancel_old_flush(sb);
 	/* wait for all commits to finish */
 	cancel_delayed_work_sync(&SB_JOURNAL(sb)->j_work);
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/reiserfs/reiserfs.h linux-libre-4.4.123-gnu/fs/reiserfs/reiserfs.h
--- linux-libre-4.4.122-gnu/fs/reiserfs/reiserfs.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/reiserfs/reiserfs.h	2018-03-22 04:23:32.000000000 -0400
@@ -2948,6 +2948,7 @@ int reiserfs_allocate_list_bitmaps(struc
 				   struct reiserfs_list_bitmap *, unsigned int);
 
 void reiserfs_schedule_old_flush(struct super_block *s);
+void reiserfs_cancel_old_flush(struct super_block *s);
 void add_save_link(struct reiserfs_transaction_handle *th,
 		   struct inode *inode, int truncate);
 int remove_save_link(struct inode *inode, int truncate);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/fs/reiserfs/super.c linux-libre-4.4.123-gnu/fs/reiserfs/super.c
--- linux-libre-4.4.122-gnu/fs/reiserfs/super.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/fs/reiserfs/super.c	2018-03-22 04:23:32.000000000 -0400
@@ -90,7 +90,9 @@ static void flush_old_commits(struct wor
 	s = sbi->s_journal->j_work_sb;
 
 	spin_lock(&sbi->old_work_lock);
-	sbi->work_queued = 0;
+	/* Avoid clobbering the cancel state... */
+	if (sbi->work_queued == 1)
+		sbi->work_queued = 0;
 	spin_unlock(&sbi->old_work_lock);
 
 	reiserfs_sync_fs(s, 1);
@@ -117,21 +119,22 @@ void reiserfs_schedule_old_flush(struct
 	spin_unlock(&sbi->old_work_lock);
 }
 
-static void cancel_old_flush(struct super_block *s)
+void reiserfs_cancel_old_flush(struct super_block *s)
 {
 	struct reiserfs_sb_info *sbi = REISERFS_SB(s);
 
-	cancel_delayed_work_sync(&REISERFS_SB(s)->old_work);
 	spin_lock(&sbi->old_work_lock);
-	sbi->work_queued = 0;
+	/* Make sure no new flushes will be queued */
+	sbi->work_queued = 2;
 	spin_unlock(&sbi->old_work_lock);
+	cancel_delayed_work_sync(&REISERFS_SB(s)->old_work);
 }
 
 static int reiserfs_freeze(struct super_block *s)
 {
 	struct reiserfs_transaction_handle th;
 
-	cancel_old_flush(s);
+	reiserfs_cancel_old_flush(s);
 
 	reiserfs_write_lock(s);
 	if (!(s->s_flags & MS_RDONLY)) {
@@ -152,7 +155,13 @@ static int reiserfs_freeze(struct super_
 
 static int reiserfs_unfreeze(struct super_block *s)
 {
+	struct reiserfs_sb_info *sbi = REISERFS_SB(s);
+
 	reiserfs_allow_writes(s);
+	spin_lock(&sbi->old_work_lock);
+	/* Allow old_work to run again */
+	sbi->work_queued = 0;
+	spin_unlock(&sbi->old_work_lock);
 	return 0;
 }
 
@@ -2187,7 +2196,7 @@ error_unlocked:
 	if (sbi->commit_wq)
 		destroy_workqueue(sbi->commit_wq);
 
-	cancel_delayed_work_sync(&REISERFS_SB(s)->old_work);
+	reiserfs_cancel_old_flush(s);
 
 	reiserfs_free_bitmap_cache(s);
 	if (SB_BUFFER_WITH_SB(s))
diff -druNp --no-dereference linux-libre-4.4.122-gnu/include/linux/fs.h linux-libre-4.4.123-gnu/include/linux/fs.h
--- linux-libre-4.4.122-gnu/include/linux/fs.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/include/linux/fs.h	2018-03-22 04:23:32.000000000 -0400
@@ -1295,6 +1295,7 @@ struct mm_struct;
 /* sb->s_iflags */
 #define SB_I_CGROUPWB	0x00000001	/* cgroup-aware writeback enabled */
 #define SB_I_NOEXEC	0x00000002	/* Ignore executables on this fs */
+#define SB_I_MULTIROOT	0x00000008	/* Multiple roots to the dentry tree */
 
 /* Possible states of 'frozen' field */
 enum {
diff -druNp --no-dereference linux-libre-4.4.122-gnu/include/linux/pagemap.h linux-libre-4.4.123-gnu/include/linux/pagemap.h
--- linux-libre-4.4.122-gnu/include/linux/pagemap.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/include/linux/pagemap.h	2018-03-22 04:23:32.000000000 -0400
@@ -153,7 +153,7 @@ static inline int page_cache_get_specula
 
 #ifdef CONFIG_TINY_RCU
 # ifdef CONFIG_PREEMPT_COUNT
-	VM_BUG_ON(!in_atomic());
+	VM_BUG_ON(!in_atomic() && !irqs_disabled());
 # endif
 	/*
 	 * Preempt must be disabled here - we rely on rcu_read_lock doing
@@ -191,7 +191,7 @@ static inline int page_cache_add_specula
 
 #if !defined(CONFIG_SMP) && defined(CONFIG_TREE_RCU)
 # ifdef CONFIG_PREEMPT_COUNT
-	VM_BUG_ON(!in_atomic());
+	VM_BUG_ON(!in_atomic() && !irqs_disabled());
 # endif
 	VM_BUG_ON_PAGE(page_count(page) == 0, page);
 	atomic_add(count, &page->_count);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/include/linux/platform_data/isl9305.h linux-libre-4.4.123-gnu/include/linux/platform_data/isl9305.h
--- linux-libre-4.4.122-gnu/include/linux/platform_data/isl9305.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/include/linux/platform_data/isl9305.h	2018-03-22 04:23:32.000000000 -0400
@@ -24,7 +24,7 @@
 struct regulator_init_data;
 
 struct isl9305_pdata {
-	struct regulator_init_data *init_data[ISL9305_MAX_REGULATOR];
+	struct regulator_init_data *init_data[ISL9305_MAX_REGULATOR + 1];
 };
 
 #endif
diff -druNp --no-dereference linux-libre-4.4.122-gnu/include/net/tcp.h linux-libre-4.4.123-gnu/include/net/tcp.h
--- linux-libre-4.4.122-gnu/include/net/tcp.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/include/net/tcp.h	2018-03-22 04:23:32.000000000 -0400
@@ -1199,9 +1199,11 @@ void tcp_select_initial_window(int __spa
 
 static inline int tcp_win_from_space(int space)
 {
-	return sysctl_tcp_adv_win_scale<=0 ?
-		(space>>(-sysctl_tcp_adv_win_scale)) :
-		space - (space>>sysctl_tcp_adv_win_scale);
+	int tcp_adv_win_scale = sysctl_tcp_adv_win_scale;
+
+	return tcp_adv_win_scale <= 0 ?
+		(space>>(-tcp_adv_win_scale)) :
+		space - (space>>tcp_adv_win_scale);
 }
 
 /* Note: caller must be prepared to deal with negative returns */
diff -druNp --no-dereference linux-libre-4.4.122-gnu/kernel/bpf/verifier.c linux-libre-4.4.123-gnu/kernel/bpf/verifier.c
--- linux-libre-4.4.122-gnu/kernel/bpf/verifier.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/kernel/bpf/verifier.c	2018-03-22 04:23:32.000000000 -0400
@@ -1135,7 +1135,8 @@ static int check_alu_op(struct verifier_
 				regs[insn->dst_reg].type = UNKNOWN_VALUE;
 				regs[insn->dst_reg].map_ptr = NULL;
 			}
-		} else {
+		} else if (BPF_CLASS(insn->code) == BPF_ALU64 ||
+			   insn->imm >= 0) {
 			/* case: R = imm
 			 * remember the value we stored into this reg
 			 */
diff -druNp --no-dereference linux-libre-4.4.122-gnu/kernel/printk/braille.c linux-libre-4.4.123-gnu/kernel/printk/braille.c
--- linux-libre-4.4.122-gnu/kernel/printk/braille.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/kernel/printk/braille.c	2018-03-22 04:23:32.000000000 -0400
@@ -2,12 +2,13 @@
 
 #include <linux/kernel.h>
 #include <linux/console.h>
+#include <linux/errno.h>
 #include <linux/string.h>
 
 #include "console_cmdline.h"
 #include "braille.h"
 
-char *_braille_console_setup(char **str, char **brl_options)
+int _braille_console_setup(char **str, char **brl_options)
 {
 	if (!strncmp(*str, "brl,", 4)) {
 		*brl_options = "";
@@ -15,14 +16,14 @@ char *_braille_console_setup(char **str,
 	} else if (!strncmp(*str, "brl=", 4)) {
 		*brl_options = *str + 4;
 		*str = strchr(*brl_options, ',');
-		if (!*str)
+		if (!*str) {
 			pr_err("need port name after brl=\n");
-		else
-			*((*str)++) = 0;
-	} else
-		return NULL;
+			return -EINVAL;
+		}
+		*((*str)++) = 0;
+	}
 
-	return *str;
+	return 0;
 }
 
 int
diff -druNp --no-dereference linux-libre-4.4.122-gnu/kernel/printk/braille.h linux-libre-4.4.123-gnu/kernel/printk/braille.h
--- linux-libre-4.4.122-gnu/kernel/printk/braille.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/kernel/printk/braille.h	2018-03-22 04:23:32.000000000 -0400
@@ -9,7 +9,14 @@ braille_set_options(struct console_cmdli
 	c->brl_options = brl_options;
 }
 
-char *
+/*
+ * Setup console according to braille options.
+ * Return -EINVAL on syntax error, 0 on success (or no braille option was
+ * actually given).
+ * Modifies str to point to the serial options
+ * Sets brl_options to the parsed braille options.
+ */
+int
 _braille_console_setup(char **str, char **brl_options);
 
 int
@@ -25,10 +32,10 @@ braille_set_options(struct console_cmdli
 {
 }
 
-static inline char *
+static inline int
 _braille_console_setup(char **str, char **brl_options)
 {
-	return NULL;
+	return 0;
 }
 
 static inline int
diff -druNp --no-dereference linux-libre-4.4.122-gnu/kernel/sched/core.c linux-libre-4.4.123-gnu/kernel/sched/core.c
--- linux-libre-4.4.122-gnu/kernel/sched/core.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/kernel/sched/core.c	2018-03-22 04:23:32.000000000 -0400
@@ -601,7 +601,8 @@ void resched_cpu(int cpu)
 	unsigned long flags;
 
 	raw_spin_lock_irqsave(&rq->lock, flags);
-	resched_curr(rq);
+	if (cpu_online(cpu) || cpu == smp_processor_id())
+		resched_curr(rq);
 	raw_spin_unlock_irqrestore(&rq->lock, flags);
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/kernel/sched/rt.c linux-libre-4.4.123-gnu/kernel/sched/rt.c
--- linux-libre-4.4.122-gnu/kernel/sched/rt.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/kernel/sched/rt.c	2018-03-22 04:23:32.000000000 -0400
@@ -2144,7 +2144,7 @@ static void switched_to_rt(struct rq *rq
 		if (p->nr_cpus_allowed > 1 && rq->rt.overloaded)
 			queue_push_tasks(rq);
 #endif /* CONFIG_SMP */
-		if (p->prio < rq->curr->prio)
+		if (p->prio < rq->curr->prio && cpu_online(cpu_of(rq)))
 			resched_curr(rq);
 	}
 }
diff -druNp --no-dereference linux-libre-4.4.122-gnu/kernel/time/sched_clock.c linux-libre-4.4.123-gnu/kernel/time/sched_clock.c
--- linux-libre-4.4.122-gnu/kernel/time/sched_clock.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/kernel/time/sched_clock.c	2018-03-22 04:23:32.000000000 -0400
@@ -205,6 +205,11 @@ sched_clock_register(u64 (*read)(void),
 
 	update_clock_read_data(&rd);
 
+	if (sched_clock_timer.function != NULL) {
+		/* update timeout for clock wrap */
+		hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL);
+	}
+
 	r = rate;
 	if (r >= 4000000) {
 		r /= 1000000;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/kernel/time/timer_list.c linux-libre-4.4.123-gnu/kernel/time/timer_list.c
--- linux-libre-4.4.122-gnu/kernel/time/timer_list.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/kernel/time/timer_list.c	2018-03-22 04:23:32.000000000 -0400
@@ -16,6 +16,7 @@
 #include <linux/sched.h>
 #include <linux/seq_file.h>
 #include <linux/kallsyms.h>
+#include <linux/nmi.h>
 
 #include <asm/uaccess.h>
 
@@ -96,6 +97,9 @@ print_active_timers(struct seq_file *m,
 
 next_one:
 	i = 0;
+
+	touch_nmi_watchdog();
+
 	raw_spin_lock_irqsave(&base->cpu_base->lock, flags);
 
 	curr = timerqueue_getnext(&base->active);
@@ -207,6 +211,8 @@ print_tickdevice(struct seq_file *m, str
 {
 	struct clock_event_device *dev = td->evtdev;
 
+	touch_nmi_watchdog();
+
 	SEQ_printf(m, "Tick Device: mode:     %d\n", td->mode);
 	if (cpu < 0)
 		SEQ_printf(m, "Broadcast device\n");
diff -druNp --no-dereference linux-libre-4.4.122-gnu/Makefile linux-libre-4.4.123-gnu/Makefile
--- linux-libre-4.4.122-gnu/Makefile	2018-03-19 03:17:56.000000000 -0400
+++ linux-libre-4.4.123-gnu/Makefile	2018-03-22 15:55:59.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 4
-SUBLEVEL = 122
+SUBLEVEL = 123
 EXTRAVERSION = -gnu
 NAME = Blurry Fish Butt
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/net/8021q/vlan_dev.c linux-libre-4.4.123-gnu/net/8021q/vlan_dev.c
--- linux-libre-4.4.122-gnu/net/8021q/vlan_dev.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/net/8021q/vlan_dev.c	2018-03-22 04:23:32.000000000 -0400
@@ -559,8 +559,7 @@ static int vlan_dev_init(struct net_devi
 			   NETIF_F_HIGHDMA | NETIF_F_SCTP_CSUM |
 			   NETIF_F_ALL_FCOE;
 
-	dev->features |= real_dev->vlan_features | NETIF_F_LLTX |
-			 NETIF_F_GSO_SOFTWARE;
+	dev->features |= dev->hw_features | NETIF_F_LLTX;
 	dev->gso_max_size = real_dev->gso_max_size;
 	if (dev->features & NETIF_F_VLAN_FEATURES)
 		netdev_warn(real_dev, "VLAN features are set incorrectly.  Q-in-Q configurations may not work correctly.\n");
diff -druNp --no-dereference linux-libre-4.4.122-gnu/net/batman-adv/bridge_loop_avoidance.c linux-libre-4.4.123-gnu/net/batman-adv/bridge_loop_avoidance.c
--- linux-libre-4.4.122-gnu/net/batman-adv/bridge_loop_avoidance.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/net/batman-adv/bridge_loop_avoidance.c	2018-03-22 04:23:32.000000000 -0400
@@ -1603,10 +1603,22 @@ int batadv_bla_tx(struct batadv_priv *ba
 		/* if yes, the client has roamed and we have
 		 * to unclaim it.
 		 */
-		batadv_handle_unclaim(bat_priv, primary_if,
-				      primary_if->net_dev->dev_addr,
-				      ethhdr->h_source, vid);
-		goto allow;
+		if (batadv_has_timed_out(claim->lasttime, 100)) {
+			/* only unclaim if the last claim entry is
+			 * older than 100 ms to make sure we really
+			 * have a roaming client here.
+			 */
+			batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla_tx(): Roaming client %pM detected. Unclaim it.\n",
+				   ethhdr->h_source);
+			batadv_handle_unclaim(bat_priv, primary_if,
+					      primary_if->net_dev->dev_addr,
+					      ethhdr->h_source, vid);
+			goto allow;
+		} else {
+			batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla_tx(): Race for claim %pM detected. Drop packet.\n",
+				   ethhdr->h_source);
+			goto handled;
+		}
 	}
 
 	/* check if it is a multicast/broadcast frame */
diff -druNp --no-dereference linux-libre-4.4.122-gnu/net/mac80211/iface.c linux-libre-4.4.123-gnu/net/mac80211/iface.c
--- linux-libre-4.4.122-gnu/net/mac80211/iface.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/net/mac80211/iface.c	2018-03-22 04:23:32.000000000 -0400
@@ -1441,7 +1441,7 @@ static void ieee80211_setup_sdata(struct
 		break;
 	case NL80211_IFTYPE_UNSPECIFIED:
 	case NUM_NL80211_IFTYPES:
-		BUG();
+		WARN_ON(1);
 		break;
 	}
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/net/sched/act_csum.c linux-libre-4.4.123-gnu/net/sched/act_csum.c
--- linux-libre-4.4.122-gnu/net/sched/act_csum.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/net/sched/act_csum.c	2018-03-22 04:23:32.000000000 -0400
@@ -175,6 +175,9 @@ static int tcf_csum_ipv4_tcp(struct sk_b
 	struct tcphdr *tcph;
 	const struct iphdr *iph;
 
+	if (skb_is_gso(skb) && skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4)
+		return 1;
+
 	tcph = tcf_csum_skb_nextlayer(skb, ihl, ipl, sizeof(*tcph));
 	if (tcph == NULL)
 		return 0;
@@ -196,6 +199,9 @@ static int tcf_csum_ipv6_tcp(struct sk_b
 	struct tcphdr *tcph;
 	const struct ipv6hdr *ip6h;
 
+	if (skb_is_gso(skb) && skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
+		return 1;
+
 	tcph = tcf_csum_skb_nextlayer(skb, ihl, ipl, sizeof(*tcph));
 	if (tcph == NULL)
 		return 0;
@@ -219,6 +225,9 @@ static int tcf_csum_ipv4_udp(struct sk_b
 	const struct iphdr *iph;
 	u16 ul;
 
+	if (skb_is_gso(skb) && skb_shinfo(skb)->gso_type & SKB_GSO_UDP)
+		return 1;
+
 	/*
 	 * Support both UDP and UDPLITE checksum algorithms, Don't use
 	 * udph->len to get the real length without any protocol check,
@@ -272,6 +281,9 @@ static int tcf_csum_ipv6_udp(struct sk_b
 	const struct ipv6hdr *ip6h;
 	u16 ul;
 
+	if (skb_is_gso(skb) && skb_shinfo(skb)->gso_type & SKB_GSO_UDP)
+		return 1;
+
 	/*
 	 * Support both UDP and UDPLITE checksum algorithms, Don't use
 	 * udph->len to get the real length without any protocol check,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/net/xfrm/xfrm_policy.c linux-libre-4.4.123-gnu/net/xfrm/xfrm_policy.c
--- linux-libre-4.4.122-gnu/net/xfrm/xfrm_policy.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/net/xfrm/xfrm_policy.c	2018-03-22 04:23:32.000000000 -0400
@@ -1313,7 +1313,7 @@ EXPORT_SYMBOL(xfrm_policy_delete);
 
 int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol)
 {
-	struct net *net = xp_net(pol);
+	struct net *net = sock_net(sk);
 	struct xfrm_policy *old_pol;
 
 #ifdef CONFIG_XFRM_SUB_POLICY
diff -druNp --no-dereference linux-libre-4.4.122-gnu/net/xfrm/xfrm_state.c linux-libre-4.4.123-gnu/net/xfrm/xfrm_state.c
--- linux-libre-4.4.122-gnu/net/xfrm/xfrm_state.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/net/xfrm/xfrm_state.c	2018-03-22 04:23:32.000000000 -0400
@@ -1845,6 +1845,13 @@ int xfrm_user_policy(struct sock *sk, in
 	struct xfrm_mgr *km;
 	struct xfrm_policy *pol = NULL;
 
+	if (!optval && !optlen) {
+		xfrm_sk_policy_insert(sk, XFRM_POLICY_IN, NULL);
+		xfrm_sk_policy_insert(sk, XFRM_POLICY_OUT, NULL);
+		__sk_dst_reset(sk);
+		return 0;
+	}
+
 	if (optlen <= 0 || optlen > PAGE_SIZE)
 		return -EMSGSIZE;
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/security/apparmor/lsm.c linux-libre-4.4.123-gnu/security/apparmor/lsm.c
--- linux-libre-4.4.122-gnu/security/apparmor/lsm.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/security/apparmor/lsm.c	2018-03-22 04:23:32.000000000 -0400
@@ -722,7 +722,7 @@ module_param_named(logsyscall, aa_g_logs
 
 /* Maximum pathname length before accesses will start getting rejected */
 unsigned int aa_g_path_max = 2 * PATH_MAX;
-module_param_named(path_max, aa_g_path_max, aauint, S_IRUSR | S_IWUSR);
+module_param_named(path_max, aa_g_path_max, aauint, S_IRUSR);
 
 /* Determines how paranoid loading of policy is and how much verification
  * on the loaded policy is done.
diff -druNp --no-dereference linux-libre-4.4.122-gnu/security/integrity/ima/ima_appraise.c linux-libre-4.4.123-gnu/security/integrity/ima/ima_appraise.c
--- linux-libre-4.4.122-gnu/security/integrity/ima/ima_appraise.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/security/integrity/ima/ima_appraise.c	2018-03-22 04:23:32.000000000 -0400
@@ -206,7 +206,8 @@ int ima_appraise_measurement(int func, s
 		if (opened & FILE_CREATED)
 			iint->flags |= IMA_NEW_FILE;
 		if ((iint->flags & IMA_NEW_FILE) &&
-		    !(iint->flags & IMA_DIGSIG_REQUIRED))
+		    (!(iint->flags & IMA_DIGSIG_REQUIRED) ||
+		     (inode->i_size == 0)))
 			status = INTEGRITY_PASS;
 		goto out;
 	}
diff -druNp --no-dereference linux-libre-4.4.122-gnu/security/selinux/hooks.c linux-libre-4.4.123-gnu/security/selinux/hooks.c
--- linux-libre-4.4.122-gnu/security/selinux/hooks.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/security/selinux/hooks.c	2018-03-22 04:23:32.000000000 -0400
@@ -4124,10 +4124,18 @@ static int selinux_socket_bind(struct so
 		u32 sid, node_perm;
 
 		if (family == PF_INET) {
+			if (addrlen < sizeof(struct sockaddr_in)) {
+				err = -EINVAL;
+				goto out;
+			}
 			addr4 = (struct sockaddr_in *)address;
 			snum = ntohs(addr4->sin_port);
 			addrp = (char *)&addr4->sin_addr.s_addr;
 		} else {
+			if (addrlen < SIN6_LEN_RFC2133) {
+				err = -EINVAL;
+				goto out;
+			}
 			addr6 = (struct sockaddr_in6 *)address;
 			snum = ntohs(addr6->sin6_port);
 			addrp = (char *)&addr6->sin6_addr.s6_addr;
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/core/oss/pcm_oss.c linux-libre-4.4.123-gnu/sound/core/oss/pcm_oss.c
--- linux-libre-4.4.122-gnu/sound/core/oss/pcm_oss.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/core/oss/pcm_oss.c	2018-03-22 04:23:32.000000000 -0400
@@ -1814,10 +1814,9 @@ static int snd_pcm_oss_get_formats(struc
 		return -ENOMEM;
 	_snd_pcm_hw_params_any(params);
 	err = snd_pcm_hw_refine(substream, params);
-	format_mask = *hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); 
-	kfree(params);
 	if (err < 0)
-		return err;
+		goto error;
+	format_mask = *hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
 	for (fmt = 0; fmt < 32; ++fmt) {
 		if (snd_mask_test(&format_mask, fmt)) {
 			int f = snd_pcm_oss_format_to(fmt);
@@ -1825,7 +1824,10 @@ static int snd_pcm_oss_get_formats(struc
 				formats |= f;
 		}
 	}
-	return formats;
+
+ error:
+	kfree(params);
+	return err < 0 ? err : formats;
 }
 
 static int snd_pcm_oss_set_format(struct snd_pcm_oss_file *pcm_oss_file, int format)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/core/seq/seq_clientmgr.c linux-libre-4.4.123-gnu/sound/core/seq/seq_clientmgr.c
--- linux-libre-4.4.122-gnu/sound/core/seq/seq_clientmgr.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/core/seq/seq_clientmgr.c	2018-03-22 04:23:32.000000000 -0400
@@ -270,12 +270,12 @@ static int seq_free_client1(struct snd_s
 
 	if (!client)
 		return 0;
-	snd_seq_delete_all_ports(client);
-	snd_seq_queue_client_leave(client->number);
 	spin_lock_irqsave(&clients_lock, flags);
 	clienttablock[client->number] = 1;
 	clienttab[client->number] = NULL;
 	spin_unlock_irqrestore(&clients_lock, flags);
+	snd_seq_delete_all_ports(client);
+	snd_seq_queue_client_leave(client->number);
 	snd_use_lock_sync(&client->use_lock);
 	snd_seq_queue_client_termination(client->number);
 	if (client->pool)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/core/seq/seq_prioq.c linux-libre-4.4.123-gnu/sound/core/seq/seq_prioq.c
--- linux-libre-4.4.122-gnu/sound/core/seq/seq_prioq.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/core/seq/seq_prioq.c	2018-03-22 04:23:32.000000000 -0400
@@ -87,7 +87,7 @@ void snd_seq_prioq_delete(struct snd_seq
 	if (f->cells > 0) {
 		/* drain prioQ */
 		while (f->cells > 0)
-			snd_seq_cell_free(snd_seq_prioq_cell_out(f));
+			snd_seq_cell_free(snd_seq_prioq_cell_out(f, NULL));
 	}
 	
 	kfree(f);
@@ -214,8 +214,18 @@ int snd_seq_prioq_cell_in(struct snd_seq
 	return 0;
 }
 
+/* return 1 if the current time >= event timestamp */
+static int event_is_ready(struct snd_seq_event *ev, void *current_time)
+{
+	if ((ev->flags & SNDRV_SEQ_TIME_STAMP_MASK) == SNDRV_SEQ_TIME_STAMP_TICK)
+		return snd_seq_compare_tick_time(current_time, &ev->time.tick);
+	else
+		return snd_seq_compare_real_time(current_time, &ev->time.time);
+}
+
 /* dequeue cell from prioq */
-struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f)
+struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f,
+						  void *current_time)
 {
 	struct snd_seq_event_cell *cell;
 	unsigned long flags;
@@ -227,6 +237,8 @@ struct snd_seq_event_cell *snd_seq_prioq
 	spin_lock_irqsave(&f->lock, flags);
 
 	cell = f->head;
+	if (cell && current_time && !event_is_ready(&cell->event, current_time))
+		cell = NULL;
 	if (cell) {
 		f->head = cell->next;
 
@@ -252,18 +264,6 @@ int snd_seq_prioq_avail(struct snd_seq_p
 	return f->cells;
 }
 
-
-/* peek at cell at the head of the prioq */
-struct snd_seq_event_cell *snd_seq_prioq_cell_peek(struct snd_seq_prioq * f)
-{
-	if (f == NULL) {
-		pr_debug("ALSA: seq: snd_seq_prioq_cell_in() called with NULL prioq\n");
-		return NULL;
-	}
-	return f->head;
-}
-
-
 static inline int prioq_match(struct snd_seq_event_cell *cell,
 			      int client, int timestamp)
 {
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/core/seq/seq_prioq.h linux-libre-4.4.123-gnu/sound/core/seq/seq_prioq.h
--- linux-libre-4.4.122-gnu/sound/core/seq/seq_prioq.h	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/core/seq/seq_prioq.h	2018-03-22 04:23:32.000000000 -0400
@@ -44,14 +44,12 @@ void snd_seq_prioq_delete(struct snd_seq
 int snd_seq_prioq_cell_in(struct snd_seq_prioq *f, struct snd_seq_event_cell *cell);
 
 /* dequeue cell from prioq */ 
-struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f);
+struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f,
+						  void *current_time);
 
 /* return number of events available in prioq */
 int snd_seq_prioq_avail(struct snd_seq_prioq *f);
 
-/* peek at cell at the head of the prioq */
-struct snd_seq_event_cell *snd_seq_prioq_cell_peek(struct snd_seq_prioq *f);
-
 /* client left queue */
 void snd_seq_prioq_leave(struct snd_seq_prioq *f, int client, int timestamp);        
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/core/seq/seq_queue.c linux-libre-4.4.123-gnu/sound/core/seq/seq_queue.c
--- linux-libre-4.4.122-gnu/sound/core/seq/seq_queue.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/core/seq/seq_queue.c	2018-03-22 04:23:32.000000000 -0400
@@ -277,30 +277,20 @@ void snd_seq_check_queue(struct snd_seq_
 
       __again:
 	/* Process tick queue... */
-	while ((cell = snd_seq_prioq_cell_peek(q->tickq)) != NULL) {
-		if (snd_seq_compare_tick_time(&q->timer->tick.cur_tick,
-					      &cell->event.time.tick)) {
-			cell = snd_seq_prioq_cell_out(q->tickq);
-			if (cell)
-				snd_seq_dispatch_event(cell, atomic, hop);
-		} else {
-			/* event remains in the queue */
+	for (;;) {
+		cell = snd_seq_prioq_cell_out(q->tickq,
+					      &q->timer->tick.cur_tick);
+		if (!cell)
 			break;
-		}
+		snd_seq_dispatch_event(cell, atomic, hop);
 	}
 
-
 	/* Process time queue... */
-	while ((cell = snd_seq_prioq_cell_peek(q->timeq)) != NULL) {
-		if (snd_seq_compare_real_time(&q->timer->cur_time,
-					      &cell->event.time.time)) {
-			cell = snd_seq_prioq_cell_out(q->timeq);
-			if (cell)
-				snd_seq_dispatch_event(cell, atomic, hop);
-		} else {
-			/* event remains in the queue */
+	for (;;) {
+		cell = snd_seq_prioq_cell_out(q->timeq, &q->timer->cur_time);
+		if (!cell)
 			break;
-		}
+		snd_seq_dispatch_event(cell, atomic, hop);
 	}
 
 	/* free lock */
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/firewire/digi00x/amdtp-dot.c linux-libre-4.4.123-gnu/sound/firewire/digi00x/amdtp-dot.c
--- linux-libre-4.4.122-gnu/sound/firewire/digi00x/amdtp-dot.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/firewire/digi00x/amdtp-dot.c	2018-03-22 04:23:32.000000000 -0400
@@ -28,6 +28,9 @@
  */
 #define MAX_MIDI_RX_BLOCKS	8
 
+/* 3 = MAX(DOT_MIDI_IN_PORTS, DOT_MIDI_OUT_PORTS) + 1. */
+#define MAX_MIDI_PORTS		3
+
 /*
  * The double-oh-three algorithm was discovered by Robin Gareus and Damien
  * Zammit in 2012, with reverse-engineering for Digi 003 Rack.
@@ -42,10 +45,8 @@ struct amdtp_dot {
 	unsigned int pcm_channels;
 	struct dot_state state;
 
-	unsigned int midi_ports;
-	/* 2 = MAX(DOT_MIDI_IN_PORTS, DOT_MIDI_OUT_PORTS) */
-	struct snd_rawmidi_substream *midi[2];
-	int midi_fifo_used[2];
+	struct snd_rawmidi_substream *midi[MAX_MIDI_PORTS];
+	int midi_fifo_used[MAX_MIDI_PORTS];
 	int midi_fifo_limit;
 
 	void (*transfer_samples)(struct amdtp_stream *s,
@@ -124,8 +125,8 @@ int amdtp_dot_set_parameters(struct amdt
 		return -EBUSY;
 
 	/*
-	 * A first data channel is for MIDI conformant data channel, the rest is
-	 * Multi Bit Linear Audio data channel.
+	 * A first data channel is for MIDI messages, the rest is Multi Bit
+	 * Linear Audio data channel.
 	 */
 	err = amdtp_stream_set_parameters(s, rate, pcm_channels + 1);
 	if (err < 0)
@@ -135,11 +136,6 @@ int amdtp_dot_set_parameters(struct amdt
 
 	p->pcm_channels = pcm_channels;
 
-	if (s->direction == AMDTP_IN_STREAM)
-		p->midi_ports = DOT_MIDI_IN_PORTS;
-	else
-		p->midi_ports = DOT_MIDI_OUT_PORTS;
-
 	/*
 	 * We do not know the actual MIDI FIFO size of most devices.  Just
 	 * assume two bytes, i.e., one byte can be received over the bus while
@@ -281,13 +277,25 @@ static void write_midi_messages(struct a
 		b = (u8 *)&buffer[0];
 
 		len = 0;
-		if (port < p->midi_ports &&
+		if (port < MAX_MIDI_PORTS &&
 		    midi_ratelimit_per_packet(s, port) &&
 		    p->midi[port] != NULL)
 			len = snd_rawmidi_transmit(p->midi[port], b + 1, 2);
 
 		if (len > 0) {
-			b[3] = (0x10 << port) | len;
+			/*
+			 * Upper 4 bits of LSB represent port number.
+			 * - 0000b: physical MIDI port 1.
+			 * - 0010b: physical MIDI port 2.
+			 * - 1110b: console MIDI port.
+			 */
+			if (port == 2)
+				b[3] = 0xe0;
+			else if (port == 1)
+				b[3] = 0x20;
+			else
+				b[3] = 0x00;
+			b[3] |= len;
 			midi_use_bytes(s, port, len);
 		} else {
 			b[1] = 0;
@@ -309,11 +317,22 @@ static void read_midi_messages(struct am
 
 	for (f = 0; f < data_blocks; f++) {
 		b = (u8 *)&buffer[0];
-		port = b[3] >> 4;
+
 		len = b[3] & 0x0f;
+		if (len > 0) {
+			/*
+			 * Upper 4 bits of LSB represent port number.
+			 * - 0000b: physical MIDI port 1. Use port 0.
+			 * - 1110b: console MIDI port. Use port 2.
+			 */
+			if (b[3] >> 4 > 0)
+				port = 2;
+			else
+				port = 0;
 
-		if (port < p->midi_ports && p->midi[port] && len > 0)
-			snd_rawmidi_receive(p->midi[port], b + 1, len);
+			if (port < MAX_MIDI_PORTS && p->midi[port])
+				snd_rawmidi_receive(p->midi[port], b + 1, len);
+		}
 
 		buffer += s->data_block_quadlets;
 	}
@@ -364,7 +383,7 @@ void amdtp_dot_midi_trigger(struct amdtp
 {
 	struct amdtp_dot *p = s->protocol;
 
-	if (port < p->midi_ports)
+	if (port < MAX_MIDI_PORTS)
 		ACCESS_ONCE(p->midi[port]) = midi;
 }
 
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/pci/hda/hda_intel.c linux-libre-4.4.123-gnu/sound/pci/hda/hda_intel.c
--- linux-libre-4.4.122-gnu/sound/pci/hda/hda_intel.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/pci/hda/hda_intel.c	2018-03-22 04:23:32.000000000 -0400
@@ -179,11 +179,15 @@ static const struct kernel_param_ops par
 };
 #define param_check_xint param_check_int
 
-static int power_save = -1;
+static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
 module_param(power_save, xint, 0644);
 MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
 		 "(in second, 0 = disable).");
 
+static bool pm_blacklist = true;
+module_param(pm_blacklist, bool, 0644);
+MODULE_PARM_DESC(pm_blacklist, "Enable power-management blacklist");
+
 /* reset the HD-audio controller in power save mode.
  * this may give more power-saving, but will take longer time to
  * wake up.
@@ -2164,10 +2168,9 @@ static int azx_probe_continue(struct azx
 
 	val = power_save;
 #ifdef CONFIG_PM
-	if (val == -1) {
+	if (pm_blacklist) {
 		const struct snd_pci_quirk *q;
 
-		val = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
 		q = snd_pci_quirk_lookup(chip->pci, power_save_blacklist);
 		if (q && val) {
 			dev_info(chip->card->dev, "device %04x:%04x is on the power_save blacklist, forcing power_save to 0\n",
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/soc/nuc900/nuc900-ac97.c linux-libre-4.4.123-gnu/sound/soc/nuc900/nuc900-ac97.c
--- linux-libre-4.4.122-gnu/sound/soc/nuc900/nuc900-ac97.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/soc/nuc900/nuc900-ac97.c	2018-03-22 04:23:32.000000000 -0400
@@ -67,7 +67,7 @@ static unsigned short nuc900_ac97_read(s
 
 	/* polling the AC_R_FINISH */
 	while (!(AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_R_FINISH)
-								&& timeout--)
+								&& --timeout)
 		mdelay(1);
 
 	if (!timeout) {
@@ -121,7 +121,7 @@ static void nuc900_ac97_write(struct snd
 
 	/* polling the AC_W_FINISH */
 	while ((AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_W_FINISH)
-								&& timeout--)
+								&& --timeout)
 		mdelay(1);
 
 	if (!timeout)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/sound/soc/sh/rcar/ssi.c linux-libre-4.4.123-gnu/sound/soc/sh/rcar/ssi.c
--- linux-libre-4.4.122-gnu/sound/soc/sh/rcar/ssi.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/sound/soc/sh/rcar/ssi.c	2018-03-22 04:23:32.000000000 -0400
@@ -143,6 +143,15 @@ static int rsnd_ssi_master_clk_start(str
 	for (j = 0; j < ARRAY_SIZE(ssi_clk_mul_table); j++) {
 
 		/*
+		 * It will set SSIWSR.CONT here, but SSICR.CKDV = 000
+		 * with it is not allowed. (SSIWSR.WS_MODE with
+		 * SSICR.CKDV = 000 is not allowed either).
+		 * Skip it. See SSICR.CKDV
+		 */
+		if (j == 0)
+			continue;
+
+		/*
 		 * this driver is assuming that
 		 * system word is 64fs (= 2 x 32bit)
 		 * see rsnd_ssi_init()
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/perf/builtin-probe.c linux-libre-4.4.123-gnu/tools/perf/builtin-probe.c
--- linux-libre-4.4.122-gnu/tools/perf/builtin-probe.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/perf/builtin-probe.c	2018-03-22 04:23:32.000000000 -0400
@@ -405,9 +405,9 @@ static int perf_del_probe_events(struct
 	}
 
 	if (ret == -ENOENT && ret2 == -ENOENT)
-		pr_debug("\"%s\" does not hit any event.\n", str);
-		/* Note that this is silently ignored */
-	ret = 0;
+		pr_warning("\"%s\" does not hit any event.\n", str);
+	else
+		ret = 0;
 
 error:
 	if (kfd >= 0)
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/perf/util/event.c linux-libre-4.4.123-gnu/tools/perf/util/event.c
--- linux-libre-4.4.122-gnu/tools/perf/util/event.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/perf/util/event.c	2018-03-22 04:23:32.000000000 -0400
@@ -234,8 +234,8 @@ int perf_event__synthesize_mmap_events(s
 	if (machine__is_default_guest(machine))
 		return 0;
 
-	snprintf(filename, sizeof(filename), "%s/proc/%d/maps",
-		 machine->root_dir, pid);
+	snprintf(filename, sizeof(filename), "%s/proc/%d/task/%d/maps",
+		 machine->root_dir, pid, pid);
 
 	fp = fopen(filename, "r");
 	if (fp == NULL) {
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/perf/util/ordered-events.c linux-libre-4.4.123-gnu/tools/perf/util/ordered-events.c
--- linux-libre-4.4.122-gnu/tools/perf/util/ordered-events.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/perf/util/ordered-events.c	2018-03-22 04:23:32.000000000 -0400
@@ -79,7 +79,7 @@ static union perf_event *dup_event(struc
 
 static void free_dup_event(struct ordered_events *oe, union perf_event *event)
 {
-	if (oe->copy_on_queue) {
+	if (event && oe->copy_on_queue) {
 		oe->cur_alloc_size -= event->header.size;
 		free(event);
 	}
@@ -150,6 +150,7 @@ void ordered_events__delete(struct order
 	list_move(&event->list, &oe->cache);
 	oe->nr_events--;
 	free_dup_event(oe, event->event);
+	event->event = NULL;
 }
 
 int ordered_events__queue(struct ordered_events *oe, union perf_event *event,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/perf/util/session.c linux-libre-4.4.123-gnu/tools/perf/util/session.c
--- linux-libre-4.4.122-gnu/tools/perf/util/session.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/perf/util/session.c	2018-03-22 04:23:32.000000000 -0400
@@ -135,8 +135,14 @@ struct perf_session *perf_session__new(s
 			if (perf_session__open(session) < 0)
 				goto out_close;
 
-			perf_session__set_id_hdr_size(session);
-			perf_session__set_comm_exec(session);
+			/*
+			 * set session attributes that are present in perf.data
+			 * but not in pipe-mode.
+			 */
+			if (!file->is_pipe) {
+				perf_session__set_id_hdr_size(session);
+				perf_session__set_comm_exec(session);
+			}
 		}
 	} else  {
 		session->machines.host.env = &perf_env;
@@ -151,7 +157,11 @@ struct perf_session *perf_session__new(s
 			pr_warning("Cannot read kernel map\n");
 	}
 
-	if (tool && tool->ordering_requires_timestamps &&
+	/*
+	 * In pipe-mode, evlist is empty until PERF_RECORD_HEADER_ATTR is
+	 * processed, so perf_evlist__sample_id_all is not meaningful here.
+	 */
+	if ((!file || !file->is_pipe) && tool && tool->ordering_requires_timestamps &&
 	    tool->ordered_events && !perf_evlist__sample_id_all(session->evlist)) {
 		dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n");
 		tool->ordered_events = false;
@@ -1437,6 +1447,7 @@ static int __perf_session__process_pipe_
 	buf = malloc(cur_size);
 	if (!buf)
 		return -errno;
+	ordered_events__set_copy_on_queue(oe, true);
 more:
 	event = buf;
 	err = readn(fd, event, sizeof(struct perf_event_header));
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/perf/util/sort.c linux-libre-4.4.123-gnu/tools/perf/util/sort.c
--- linux-libre-4.4.122-gnu/tools/perf/util/sort.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/perf/util/sort.c	2018-03-22 04:23:32.000000000 -0400
@@ -604,6 +604,9 @@ static int hist_entry__mispredict_snprin
 static int64_t
 sort__cycles_cmp(struct hist_entry *left, struct hist_entry *right)
 {
+	if (!left->branch_info || !right->branch_info)
+		return cmp_null(left->branch_info, right->branch_info);
+
 	return left->branch_info->flags.cycles -
 		right->branch_info->flags.cycles;
 }
@@ -611,6 +614,8 @@ sort__cycles_cmp(struct hist_entry *left
 static int hist_entry__cycles_snprintf(struct hist_entry *he, char *bf,
 				    size_t size, unsigned int width)
 {
+	if (!he->branch_info)
+		return scnprintf(bf, size, "%-.*s", width, "N/A");
 	if (he->branch_info->flags.cycles == 0)
 		return repsep_snprintf(bf, size, "%-*s", width, "-");
 	return repsep_snprintf(bf, size, "%-*hd", width,
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/testing/selftests/firmware/fw_filesystem.sh linux-libre-4.4.123-gnu/tools/testing/selftests/firmware/fw_filesystem.sh
--- linux-libre-4.4.122-gnu/tools/testing/selftests/firmware/fw_filesystem.sh	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/testing/selftests/firmware/fw_filesystem.sh	2018-03-22 04:23:32.000000000 -0400
@@ -28,7 +28,10 @@ test_finish()
 	if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
 		echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout
 	fi
-	echo -n "$OLD_PATH" >/sys/module/firmware_class/parameters/path
+	if [ "$OLD_FWPATH" = "" ]; then
+		OLD_FWPATH=" "
+	fi
+	echo -n "$OLD_FWPATH" >/sys/module/firmware_class/parameters/path
 	rm -f "$FW"
 	rmdir "$FWPATH"
 }
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/testing/selftests/rcutorture/bin/configinit.sh linux-libre-4.4.123-gnu/tools/testing/selftests/rcutorture/bin/configinit.sh
--- linux-libre-4.4.122-gnu/tools/testing/selftests/rcutorture/bin/configinit.sh	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/testing/selftests/rcutorture/bin/configinit.sh	2018-03-22 04:23:32.000000000 -0400
@@ -51,7 +51,7 @@ then
 			mkdir $builddir
 		fi
 	else
-		echo Bad build directory: \"$builddir\"
+		echo Bad build directory: \"$buildloc\"
 		exit 2
 	fi
 fi
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/testing/selftests/x86/entry_from_vm86.c linux-libre-4.4.123-gnu/tools/testing/selftests/x86/entry_from_vm86.c
--- linux-libre-4.4.122-gnu/tools/testing/selftests/x86/entry_from_vm86.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/testing/selftests/x86/entry_from_vm86.c	2018-03-22 04:23:32.000000000 -0400
@@ -95,6 +95,31 @@ asm (
 	"int3\n\t"
 	"vmcode_int80:\n\t"
 	"int $0x80\n\t"
+	"vmcode_popf_hlt:\n\t"
+	"push %ax\n\t"
+	"popf\n\t"
+	"hlt\n\t"
+	"vmcode_umip:\n\t"
+	/* addressing via displacements */
+	"smsw (2052)\n\t"
+	"sidt (2054)\n\t"
+	"sgdt (2060)\n\t"
+	/* addressing via registers */
+	"mov $2066, %bx\n\t"
+	"smsw (%bx)\n\t"
+	"mov $2068, %bx\n\t"
+	"sidt (%bx)\n\t"
+	"mov $2074, %bx\n\t"
+	"sgdt (%bx)\n\t"
+	/* register operands, only for smsw */
+	"smsw %ax\n\t"
+	"mov %ax, (2080)\n\t"
+	"int3\n\t"
+	"vmcode_umip_str:\n\t"
+	"str %eax\n\t"
+	"vmcode_umip_sldt:\n\t"
+	"sldt %eax\n\t"
+	"int3\n\t"
 	".size vmcode, . - vmcode\n\t"
 	"end_vmcode:\n\t"
 	".code32\n\t"
@@ -103,7 +128,8 @@ asm (
 
 extern unsigned char vmcode[], end_vmcode[];
 extern unsigned char vmcode_bound[], vmcode_sysenter[], vmcode_syscall[],
-	vmcode_sti[], vmcode_int3[], vmcode_int80[];
+	vmcode_sti[], vmcode_int3[], vmcode_int80[], vmcode_popf_hlt[],
+	vmcode_umip[], vmcode_umip_str[], vmcode_umip_sldt[];
 
 /* Returns false if the test was skipped. */
 static bool do_test(struct vm86plus_struct *v86, unsigned long eip,
@@ -153,13 +179,75 @@ static bool do_test(struct vm86plus_stru
 	    (VM86_TYPE(ret) == rettype && VM86_ARG(ret) == retarg)) {
 		printf("[OK]\tReturned correctly\n");
 	} else {
-		printf("[FAIL]\tIncorrect return reason\n");
+		printf("[FAIL]\tIncorrect return reason (started at eip = 0x%lx, ended at eip = 0x%lx)\n", eip, v86->regs.eip);
 		nerrs++;
 	}
 
 	return true;
 }
 
+void do_umip_tests(struct vm86plus_struct *vm86, unsigned char *test_mem)
+{
+	struct table_desc {
+		unsigned short limit;
+		unsigned long base;
+	} __attribute__((packed));
+
+	/* Initialize variables with arbitrary values */
+	struct table_desc gdt1 = { .base = 0x3c3c3c3c, .limit = 0x9999 };
+	struct table_desc gdt2 = { .base = 0x1a1a1a1a, .limit = 0xaeae };
+	struct table_desc idt1 = { .base = 0x7b7b7b7b, .limit = 0xf1f1 };
+	struct table_desc idt2 = { .base = 0x89898989, .limit = 0x1313 };
+	unsigned short msw1 = 0x1414, msw2 = 0x2525, msw3 = 3737;
+
+	/* UMIP -- exit with INT3 unless kernel emulation did not trap #GP */
+	do_test(vm86, vmcode_umip - vmcode, VM86_TRAP, 3, "UMIP tests");
+
+	/* Results from displacement-only addressing */
+	msw1 = *(unsigned short *)(test_mem + 2052);
+	memcpy(&idt1, test_mem + 2054, sizeof(idt1));
+	memcpy(&gdt1, test_mem + 2060, sizeof(gdt1));
+
+	/* Results from register-indirect addressing */
+	msw2 = *(unsigned short *)(test_mem + 2066);
+	memcpy(&idt2, test_mem + 2068, sizeof(idt2));
+	memcpy(&gdt2, test_mem + 2074, sizeof(gdt2));
+
+	/* Results when using register operands */
+	msw3 = *(unsigned short *)(test_mem + 2080);
+
+	printf("[INFO]\tResult from SMSW:[0x%04x]\n", msw1);
+	printf("[INFO]\tResult from SIDT: limit[0x%04x]base[0x%08lx]\n",
+	       idt1.limit, idt1.base);
+	printf("[INFO]\tResult from SGDT: limit[0x%04x]base[0x%08lx]\n",
+	       gdt1.limit, gdt1.base);
+
+	if (msw1 != msw2 || msw1 != msw3)
+		printf("[FAIL]\tAll the results of SMSW should be the same.\n");
+	else
+		printf("[PASS]\tAll the results from SMSW are identical.\n");
+
+	if (memcmp(&gdt1, &gdt2, sizeof(gdt1)))
+		printf("[FAIL]\tAll the results of SGDT should be the same.\n");
+	else
+		printf("[PASS]\tAll the results from SGDT are identical.\n");
+
+	if (memcmp(&idt1, &idt2, sizeof(idt1)))
+		printf("[FAIL]\tAll the results of SIDT should be the same.\n");
+	else
+		printf("[PASS]\tAll the results from SIDT are identical.\n");
+
+	sethandler(SIGILL, sighandler, 0);
+	do_test(vm86, vmcode_umip_str - vmcode, VM86_SIGNAL, 0,
+		"STR instruction");
+	clearhandler(SIGILL);
+
+	sethandler(SIGILL, sighandler, 0);
+	do_test(vm86, vmcode_umip_sldt - vmcode, VM86_SIGNAL, 0,
+		"SLDT instruction");
+	clearhandler(SIGILL);
+}
+
 int main(void)
 {
 	struct vm86plus_struct v86;
@@ -180,6 +268,9 @@ int main(void)
 	v86.regs.ds = load_addr / 16;
 	v86.regs.es = load_addr / 16;
 
+	/* Use the end of the page as our stack. */
+	v86.regs.esp = 4096;
+
 	assert((v86.regs.cs & 3) == 0);	/* Looks like RPL = 0 */
 
 	/* #BR -- should deliver SIG??? */
@@ -211,6 +302,23 @@ int main(void)
 	v86.regs.eflags &= ~X86_EFLAGS_IF;
 	do_test(&v86, vmcode_sti - vmcode, VM86_STI, 0, "STI with VIP set");
 
+	/* POPF with VIP set but IF clear: should not trap */
+	v86.regs.eflags = X86_EFLAGS_VIP;
+	v86.regs.eax = 0;
+	do_test(&v86, vmcode_popf_hlt - vmcode, VM86_UNKNOWN, 0, "POPF with VIP set and IF clear");
+
+	/* POPF with VIP set and IF set: should trap */
+	v86.regs.eflags = X86_EFLAGS_VIP;
+	v86.regs.eax = X86_EFLAGS_IF;
+	do_test(&v86, vmcode_popf_hlt - vmcode, VM86_STI, 0, "POPF with VIP and IF set");
+
+	/* POPF with VIP clear and IF set: should not trap */
+	v86.regs.eflags = 0;
+	v86.regs.eax = X86_EFLAGS_IF;
+	do_test(&v86, vmcode_popf_hlt - vmcode, VM86_UNKNOWN, 0, "POPF with VIP clear and IF set");
+
+	v86.regs.eflags = 0;
+
 	/* INT3 -- should cause #BP */
 	do_test(&v86, vmcode_int3 - vmcode, VM86_TRAP, 3, "INT3");
 
@@ -218,6 +326,9 @@ int main(void)
 	v86.regs.eax = (unsigned int)-1;
 	do_test(&v86, vmcode_int80 - vmcode, VM86_INTx, 0x80, "int80");
 
+	/* UMIP -- should exit with INTx 0x80 unless UMIP was not disabled */
+	do_umip_tests(&v86, addr);
+
 	/* Execute a null pointer */
 	v86.regs.cs = 0;
 	v86.regs.ss = 0;
@@ -231,7 +342,7 @@ int main(void)
 	clearhandler(SIGSEGV);
 
 	/* Make sure nothing explodes if we fork. */
-	if (fork() > 0)
+	if (fork() == 0)
 		return 0;
 
 	return (nerrs == 0 ? 0 : 1);
diff -druNp --no-dereference linux-libre-4.4.122-gnu/tools/usb/usbip/src/usbipd.c linux-libre-4.4.123-gnu/tools/usb/usbip/src/usbipd.c
--- linux-libre-4.4.122-gnu/tools/usb/usbip/src/usbipd.c	2018-03-18 06:17:54.000000000 -0400
+++ linux-libre-4.4.123-gnu/tools/usb/usbip/src/usbipd.c	2018-03-22 04:23:32.000000000 -0400
@@ -451,7 +451,7 @@ static void set_signal(void)
 	sigaction(SIGTERM, &act, NULL);
 	sigaction(SIGINT, &act, NULL);
 	act.sa_handler = SIG_IGN;
-	sigaction(SIGCLD, &act, NULL);
+	sigaction(SIGCHLD, &act, NULL);
 }
 
 static const char *pid_file;
