diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi linux-libre-4.4-gnu/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
--- linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi	2016-01-10 18:01:32.000000000 -0500
@@ -25,9 +25,9 @@
 		cache-sets = <512>;
 		cache-line-size = <32>;
 		/* At full speed latency must be >=2 */
-		arm,tag-latency = <2>;
-		arm,data-latency = <2 2>;
-		arm,dirty-latency = <2>;
+		arm,tag-latency = <8>;
+		arm,data-latency = <8 8>;
+		arm,dirty-latency = <8>;
 	};
 
 	mtu0: mtu@101e2000 {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/versatile-ab.dts linux-libre-4.4-gnu/arch/arm/boot/dts/versatile-ab.dts
--- linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/versatile-ab.dts	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/boot/dts/versatile-ab.dts	2016-01-10 18:01:32.000000000 -0500
@@ -110,7 +110,11 @@
 			interrupt-parent = <&vic>;
 			interrupts = <31>; /* Cascaded to vic */
 			clear-mask = <0xffffffff>;
-			valid-mask = <0xffc203f8>;
+			/*
+			 * Valid interrupt lines mask according to
+			 * table 4-36 page 4-50 of ARM DUI 0225D
+			 */
+			valid-mask = <0x0760031b>;
 		};
 
 		dma@10130000 {
@@ -266,8 +270,8 @@
 			};
 			mmc@5000 {
 				compatible = "arm,pl180", "arm,primecell";
-				reg = < 0x5000 0x1000>;
-				interrupts-extended = <&vic 22 &sic 2>;
+				reg = <0x5000 0x1000>;
+				interrupts-extended = <&vic 22 &sic 1>;
 				clocks = <&xtal24mhz>, <&pclk>;
 				clock-names = "mclk", "apb_pclk";
 			};
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/versatile-pb.dts linux-libre-4.4-gnu/arch/arm/boot/dts/versatile-pb.dts
--- linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/versatile-pb.dts	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/boot/dts/versatile-pb.dts	2016-01-10 18:01:32.000000000 -0500
@@ -5,6 +5,16 @@
 	compatible = "arm,versatile-pb";
 
 	amba {
+		/* The Versatile PB is using more SIC IRQ lines than the AB */
+		sic: intc@10003000 {
+			clear-mask = <0xffffffff>;
+			/*
+			 * Valid interrupt lines mask according to
+			 * figure 3-30 page 3-74 of ARM DUI 0224B
+			 */
+			valid-mask = <0x7fe003ff>;
+		};
+
 		gpio2: gpio@101e6000 {
 			compatible = "arm,pl061", "arm,primecell";
 			reg = <0x101e6000 0x1000>;
@@ -67,6 +77,13 @@
 		};
 
 		fpga {
+			mmc@5000 {
+				/*
+				 * Overrides the interrupt assignment from
+				 * the Versatile AB board file.
+				 */
+				interrupts-extended = <&sic 22 &sic 23>;
+			};
 			uart@9000 {
 				compatible = "arm,pl011", "arm,primecell";
 				reg = <0x9000 0x1000>;
@@ -86,7 +103,8 @@
 			mmc@b000 {
 				compatible = "arm,pl180", "arm,primecell";
 				reg = <0xb000 0x1000>;
-				interrupts-extended = <&vic 23 &sic 2>;
+				interrupt-parent = <&sic>;
+				interrupts = <1>, <2>;
 				clocks = <&xtal24mhz>, <&pclk>;
 				clock-names = "mclk", "apb_pclk";
 			};
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/wm8650.dtsi linux-libre-4.4-gnu/arch/arm/boot/dts/wm8650.dtsi
--- linux-libre-4.4-rc8-gnu/arch/arm/boot/dts/wm8650.dtsi	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/boot/dts/wm8650.dtsi	2016-01-10 18:01:32.000000000 -0500
@@ -187,6 +187,15 @@
 			interrupts = <43>;
 		};
 
+		sdhc@d800a000 {
+			compatible = "wm,wm8505-sdhc";
+			reg = <0xd800a000 0x400>;
+			interrupts = <20>, <21>;
+			clocks = <&clksdhc>;
+			bus-width = <4>;
+			sdon-inverted;
+		};
+
 		fb: fb@d8050800 {
 			compatible = "wm,wm8505-fb";
 			reg = <0xd8050800 0x200>;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/configs/multi_v7_defconfig linux-libre-4.4-gnu/arch/arm/configs/multi_v7_defconfig
--- linux-libre-4.4-rc8-gnu/arch/arm/configs/multi_v7_defconfig	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/configs/multi_v7_defconfig	2016-01-10 18:01:32.000000000 -0500
@@ -366,6 +366,7 @@ CONFIG_BATTERY_MAX17042=m
 CONFIG_CHARGER_MAX14577=m
 CONFIG_CHARGER_MAX77693=m
 CONFIG_CHARGER_TPS65090=y
+CONFIG_AXP20X_POWER=m
 CONFIG_POWER_RESET_AS3722=y
 CONFIG_POWER_RESET_GPIO=y
 CONFIG_POWER_RESET_GPIO_RESTART=y
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/configs/sunxi_defconfig linux-libre-4.4-gnu/arch/arm/configs/sunxi_defconfig
--- linux-libre-4.4-rc8-gnu/arch/arm/configs/sunxi_defconfig	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/configs/sunxi_defconfig	2016-01-10 18:01:32.000000000 -0500
@@ -84,6 +84,7 @@ CONFIG_SPI_SUN4I=y
 CONFIG_SPI_SUN6I=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_POWER_SUPPLY=y
+CONFIG_AXP20X_POWER=y
 CONFIG_THERMAL=y
 CONFIG_CPU_THERMAL=y
 CONFIG_WATCHDOG=y
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/mach-omap2/gpmc-onenand.c linux-libre-4.4-gnu/arch/arm/mach-omap2/gpmc-onenand.c
--- linux-libre-4.4-rc8-gnu/arch/arm/mach-omap2/gpmc-onenand.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/mach-omap2/gpmc-onenand.c	2016-01-10 18:01:32.000000000 -0500
@@ -149,8 +149,8 @@ static int omap2_onenand_get_freq(struct
 		freq = 104;
 		break;
 	default:
-		freq = 54;
-		break;
+		pr_err("onenand rate not detected, bad GPMC async timings?\n");
+		freq = 0;
 	}
 
 	return freq;
@@ -271,6 +271,11 @@ static int omap2_onenand_setup_async(voi
 	struct gpmc_timings t;
 	int ret;
 
+	/*
+	 * Note that we need to keep sync_write set for the call to
+	 * omap2_onenand_set_async_mode() to work to detect the onenand
+	 * supported clock rate for the sync timings.
+	 */
 	if (gpmc_onenand_data->of_node) {
 		gpmc_read_settings_dt(gpmc_onenand_data->of_node,
 				      &onenand_async);
@@ -281,12 +286,9 @@ static int omap2_onenand_setup_async(voi
 			else
 				gpmc_onenand_data->flags |= ONENAND_SYNC_READ;
 			onenand_async.sync_read = false;
-			onenand_async.sync_write = false;
 		}
 	}
 
-	omap2_onenand_set_async_mode(onenand_base);
-
 	omap2_onenand_calc_async_timings(&t);
 
 	ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async);
@@ -310,6 +312,8 @@ static int omap2_onenand_setup_sync(void
 	if (!freq) {
 		/* Very first call freq is not known */
 		freq = omap2_onenand_get_freq(gpmc_onenand_data, onenand_base);
+		if (!freq)
+			return -ENODEV;
 		set_onenand_cfg(onenand_base);
 	}
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/arm/net/bpf_jit_32.c linux-libre-4.4-gnu/arch/arm/net/bpf_jit_32.c
--- linux-libre-4.4-rc8-gnu/arch/arm/net/bpf_jit_32.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/arm/net/bpf_jit_32.c	2016-01-10 18:01:32.000000000 -0500
@@ -187,19 +187,6 @@ static inline int mem_words_used(struct
 	return fls(ctx->seen & SEEN_MEM);
 }
 
-static inline bool is_load_to_a(u16 inst)
-{
-	switch (inst) {
-	case BPF_LD | BPF_W | BPF_LEN:
-	case BPF_LD | BPF_W | BPF_ABS:
-	case BPF_LD | BPF_H | BPF_ABS:
-	case BPF_LD | BPF_B | BPF_ABS:
-		return true;
-	default:
-		return false;
-	}
-}
-
 static void jit_fill_hole(void *area, unsigned int size)
 {
 	u32 *ptr;
@@ -211,7 +198,6 @@ static void jit_fill_hole(void *area, un
 static void build_prologue(struct jit_ctx *ctx)
 {
 	u16 reg_set = saved_regs(ctx);
-	u16 first_inst = ctx->skf->insns[0].code;
 	u16 off;
 
 #ifdef CONFIG_FRAME_POINTER
@@ -241,7 +227,7 @@ static void build_prologue(struct jit_ct
 		emit(ARM_MOV_I(r_X, 0), ctx);
 
 	/* do not leak kernel data to userspace */
-	if ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))
+	if (bpf_needs_clear_a(&ctx->skf->insns[0]))
 		emit(ARM_MOV_I(r_A, 0), ctx);
 
 	/* stack space for the BPF_MEM words */
@@ -770,7 +756,8 @@ load_ind:
 		case BPF_ALU | BPF_RSH | BPF_K:
 			if (unlikely(k > 31))
 				return -1;
-			emit(ARM_LSR_I(r_A, r_A, k), ctx);
+			if (k)
+				emit(ARM_LSR_I(r_A, r_A, k), ctx);
 			break;
 		case BPF_ALU | BPF_RSH | BPF_X:
 			update_on_xread(ctx);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/mips/net/bpf_jit.c linux-libre-4.4-gnu/arch/mips/net/bpf_jit.c
--- linux-libre-4.4-rc8-gnu/arch/mips/net/bpf_jit.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/mips/net/bpf_jit.c	2016-01-10 18:01:32.000000000 -0500
@@ -521,19 +521,6 @@ static inline u16 align_sp(unsigned int
 	return num;
 }
 
-static bool is_load_to_a(u16 inst)
-{
-	switch (inst) {
-	case BPF_LD | BPF_W | BPF_LEN:
-	case BPF_LD | BPF_W | BPF_ABS:
-	case BPF_LD | BPF_H | BPF_ABS:
-	case BPF_LD | BPF_B | BPF_ABS:
-		return true;
-	default:
-		return false;
-	}
-}
-
 static void save_bpf_jit_regs(struct jit_ctx *ctx, unsigned offset)
 {
 	int i = 0, real_off = 0;
@@ -614,7 +601,6 @@ static unsigned int get_stack_depth(stru
 
 static void build_prologue(struct jit_ctx *ctx)
 {
-	u16 first_inst = ctx->skf->insns[0].code;
 	int sp_off;
 
 	/* Calculate the total offset for the stack pointer */
@@ -641,7 +627,7 @@ static void build_prologue(struct jit_ct
 		emit_jit_reg_move(r_X, r_zero, ctx);
 
 	/* Do not leak kernel data to userspace */
-	if ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))
+	if (bpf_needs_clear_a(&ctx->skf->insns[0]))
 		emit_jit_reg_move(r_A, r_zero, ctx);
 }
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/powerpc/net/bpf_jit_comp.c linux-libre-4.4-gnu/arch/powerpc/net/bpf_jit_comp.c
--- linux-libre-4.4-rc8-gnu/arch/powerpc/net/bpf_jit_comp.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/powerpc/net/bpf_jit_comp.c	2016-01-10 18:01:32.000000000 -0500
@@ -78,18 +78,9 @@ static void bpf_jit_build_prologue(struc
 		PPC_LI(r_X, 0);
 	}
 
-	switch (filter[0].code) {
-	case BPF_RET | BPF_K:
-	case BPF_LD | BPF_W | BPF_LEN:
-	case BPF_LD | BPF_W | BPF_ABS:
-	case BPF_LD | BPF_H | BPF_ABS:
-	case BPF_LD | BPF_B | BPF_ABS:
-		/* first instruction sets A register (or is RET 'constant') */
-		break;
-	default:
-		/* make sure we dont leak kernel information to user */
+	/* make sure we dont leak kernel information to user */
+	if (bpf_needs_clear_a(&filter[0]))
 		PPC_LI(r_A, 0);
-	}
 }
 
 static void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/sparc/net/bpf_jit_comp.c linux-libre-4.4-gnu/arch/sparc/net/bpf_jit_comp.c
--- linux-libre-4.4-rc8-gnu/arch/sparc/net/bpf_jit_comp.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/sparc/net/bpf_jit_comp.c	2016-01-10 18:01:32.000000000 -0500
@@ -420,22 +420,9 @@ void bpf_jit_compile(struct bpf_prog *fp
 		}
 		emit_reg_move(O7, r_saved_O7);
 
-		switch (filter[0].code) {
-		case BPF_RET | BPF_K:
-		case BPF_LD | BPF_W | BPF_LEN:
-		case BPF_LD | BPF_W | BPF_ABS:
-		case BPF_LD | BPF_H | BPF_ABS:
-		case BPF_LD | BPF_B | BPF_ABS:
-			/* The first instruction sets the A register (or is
-			 * a "RET 'constant'")
-			 */
-			break;
-		default:
-			/* Make sure we dont leak kernel information to the
-			 * user.
-			 */
+		/* Make sure we dont leak kernel information to the user. */
+		if (bpf_needs_clear_a(&filter[0]))
 			emit_clear(r_A); /* A = 0 */
-		}
 
 		for (i = 0; i < flen; i++) {
 			unsigned int K = filter[i].k;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/tile/include/asm/page.h linux-libre-4.4-gnu/arch/tile/include/asm/page.h
--- linux-libre-4.4-rc8-gnu/arch/tile/include/asm/page.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/tile/include/asm/page.h	2016-01-10 18:01:32.000000000 -0500
@@ -20,15 +20,17 @@
 #include <arch/chip.h>
 
 /* PAGE_SHIFT and HPAGE_SHIFT determine the page sizes. */
-#if defined(CONFIG_PAGE_SIZE_16KB)
+#if defined(CONFIG_PAGE_SIZE_4KB)  /* tilepro only */
+#define PAGE_SHIFT	12
+#define CTX_PAGE_FLAG	HV_CTX_PG_SM_4K
+#elif defined(CONFIG_PAGE_SIZE_16KB)
 #define PAGE_SHIFT	14
 #define CTX_PAGE_FLAG	HV_CTX_PG_SM_16K
 #elif defined(CONFIG_PAGE_SIZE_64KB)
 #define PAGE_SHIFT	16
 #define CTX_PAGE_FLAG	HV_CTX_PG_SM_64K
 #else
-#define PAGE_SHIFT	HV_LOG2_DEFAULT_PAGE_SIZE_SMALL
-#define CTX_PAGE_FLAG	0
+#error Page size not specified in Kconfig
 #endif
 #define HPAGE_SHIFT	HV_LOG2_DEFAULT_PAGE_SIZE_LARGE
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/tile/Kconfig linux-libre-4.4-gnu/arch/tile/Kconfig
--- linux-libre-4.4-rc8-gnu/arch/tile/Kconfig	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/tile/Kconfig	2016-01-10 18:01:32.000000000 -0500
@@ -176,8 +176,6 @@ config NR_CPUS
 	  smaller kernel memory footprint results from using a smaller
 	  value on chips with fewer tiles.
 
-if TILEGX
-
 choice
 	prompt "Kernel page size"
 	default PAGE_SIZE_64KB
@@ -188,8 +186,11 @@ choice
 	  connections, etc., it may be better to select 16KB, which uses
 	  memory more efficiently at some cost in TLB performance.
 
-	  Note that this option is TILE-Gx specific; currently
-	  TILEPro page size is set by rebuilding the hypervisor.
+	  Note that for TILEPro, you must also rebuild the hypervisor
+	  with a matching page size.
+
+config PAGE_SIZE_4KB
+	bool "4KB" if TILEPRO
 
 config PAGE_SIZE_16KB
 	bool "16KB"
@@ -199,8 +200,6 @@ config PAGE_SIZE_64KB
 
 endchoice
 
-endif
-
 source "kernel/Kconfig.hz"
 
 config KEXEC
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/entry/common.c linux-libre-4.4-gnu/arch/x86/entry/common.c
--- linux-libre-4.4-rc8-gnu/arch/x86/entry/common.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/entry/common.c	2016-01-10 18:01:32.000000000 -0500
@@ -421,7 +421,7 @@ __visible long do_fast_syscall_32(struct
 	regs->ip = landing_pad;
 
 	/*
-	 * Fetch ECX from where the vDSO stashed it.
+	 * Fetch EBP from where the vDSO stashed it.
 	 *
 	 * WARNING: We are in CONTEXT_USER and RCU isn't paying attention!
 	 */
@@ -432,10 +432,10 @@ __visible long do_fast_syscall_32(struct
 		 * Micro-optimization: the pointer we're following is explicitly
 		 * 32 bits, so it can't be out of range.
 		 */
-		__get_user(*(u32 *)&regs->cx,
+		__get_user(*(u32 *)&regs->bp,
 			    (u32 __user __force *)(unsigned long)(u32)regs->sp)
 #else
-		get_user(*(u32 *)&regs->cx,
+		get_user(*(u32 *)&regs->bp,
 			 (u32 __user __force *)(unsigned long)(u32)regs->sp)
 #endif
 		) {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/entry/entry_32.S linux-libre-4.4-gnu/arch/x86/entry/entry_32.S
--- linux-libre-4.4-rc8-gnu/arch/x86/entry/entry_32.S	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/entry/entry_32.S	2016-01-10 18:01:32.000000000 -0500
@@ -292,7 +292,7 @@ ENTRY(entry_SYSENTER_32)
 	movl	TSS_sysenter_sp0(%esp), %esp
 sysenter_past_esp:
 	pushl	$__USER_DS		/* pt_regs->ss */
-	pushl	%ecx			/* pt_regs->cx */
+	pushl	%ebp			/* pt_regs->sp (stashed in bp) */
 	pushfl				/* pt_regs->flags (except IF = 0) */
 	orl	$X86_EFLAGS_IF, (%esp)	/* Fix IF */
 	pushl	$__USER_CS		/* pt_regs->cs */
@@ -308,8 +308,9 @@ sysenter_past_esp:
 
 	movl	%esp, %eax
 	call	do_fast_syscall_32
-	testl	%eax, %eax
-	jz	.Lsyscall_32_done
+	/* XEN PV guests always use IRET path */
+	ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \
+		    "jmp .Lsyscall_32_done", X86_FEATURE_XENPV
 
 /* Opportunistic SYSEXIT */
 	TRACE_IRQS_ON			/* User mode traces as IRQs on. */
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/entry/entry_64_compat.S linux-libre-4.4-gnu/arch/x86/entry/entry_64_compat.S
--- linux-libre-4.4-rc8-gnu/arch/x86/entry/entry_64_compat.S	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/entry/entry_64_compat.S	2016-01-10 18:01:32.000000000 -0500
@@ -63,7 +63,7 @@ ENTRY(entry_SYSENTER_compat)
 
 	/* Construct struct pt_regs on stack */
 	pushq	$__USER32_DS		/* pt_regs->ss */
-	pushq	%rcx			/* pt_regs->sp */
+	pushq	%rbp			/* pt_regs->sp (stashed in bp) */
 
 	/*
 	 * Push flags.  This is nasty.  First, interrupts are currently
@@ -82,14 +82,14 @@ ENTRY(entry_SYSENTER_compat)
 	pushq	%rdi			/* pt_regs->di */
 	pushq	%rsi			/* pt_regs->si */
 	pushq	%rdx			/* pt_regs->dx */
-	pushq	%rcx			/* pt_regs->cx (will be overwritten) */
+	pushq	%rcx			/* pt_regs->cx */
 	pushq	$-ENOSYS		/* pt_regs->ax */
 	pushq   %r8                     /* pt_regs->r8  = 0 */
 	pushq   %r8                     /* pt_regs->r9  = 0 */
 	pushq   %r8                     /* pt_regs->r10 = 0 */
 	pushq   %r8                     /* pt_regs->r11 = 0 */
 	pushq   %rbx                    /* pt_regs->rbx */
-	pushq   %rbp                    /* pt_regs->rbp */
+	pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
 	pushq   %r8                     /* pt_regs->r12 = 0 */
 	pushq   %r8                     /* pt_regs->r13 = 0 */
 	pushq   %r8                     /* pt_regs->r14 = 0 */
@@ -121,8 +121,9 @@ sysenter_flags_fixed:
 
 	movq	%rsp, %rdi
 	call	do_fast_syscall_32
-	testl	%eax, %eax
-	jz	.Lsyscall_32_done
+	/* XEN PV guests always use IRET path */
+	ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \
+		    "jmp .Lsyscall_32_done", X86_FEATURE_XENPV
 	jmp	sysret32_from_system_call
 
 sysenter_fix_flags:
@@ -178,7 +179,7 @@ ENTRY(entry_SYSCALL_compat)
 	pushq	%rdi			/* pt_regs->di */
 	pushq	%rsi			/* pt_regs->si */
 	pushq	%rdx			/* pt_regs->dx */
-	pushq	%rcx			/* pt_regs->cx (will be overwritten) */
+	pushq	%rbp			/* pt_regs->cx (stashed in bp) */
 	pushq	$-ENOSYS		/* pt_regs->ax */
 	xorq    %r8,%r8
 	pushq   %r8                     /* pt_regs->r8  = 0 */
@@ -186,7 +187,7 @@ ENTRY(entry_SYSCALL_compat)
 	pushq   %r8                     /* pt_regs->r10 = 0 */
 	pushq   %r8                     /* pt_regs->r11 = 0 */
 	pushq   %rbx                    /* pt_regs->rbx */
-	pushq   %rbp                    /* pt_regs->rbp */
+	pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
 	pushq   %r8                     /* pt_regs->r12 = 0 */
 	pushq   %r8                     /* pt_regs->r13 = 0 */
 	pushq   %r8                     /* pt_regs->r14 = 0 */
@@ -200,8 +201,9 @@ ENTRY(entry_SYSCALL_compat)
 
 	movq	%rsp, %rdi
 	call	do_fast_syscall_32
-	testl	%eax, %eax
-	jz	.Lsyscall_32_done
+	/* XEN PV guests always use IRET path */
+	ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \
+		    "jmp .Lsyscall_32_done", X86_FEATURE_XENPV
 
 	/* Opportunistic SYSRET */
 sysret32_from_system_call:
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/entry/vdso/vdso32/system_call.S linux-libre-4.4-gnu/arch/x86/entry/vdso/vdso32/system_call.S
--- linux-libre-4.4-rc8-gnu/arch/x86/entry/vdso/vdso32/system_call.S	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/entry/vdso/vdso32/system_call.S	2016-01-10 18:01:32.000000000 -0500
@@ -1,5 +1,5 @@
 /*
- * Code for the vDSO.  This version uses the old int $0x80 method.
+ * AT_SYSINFO entry point
 */
 
 #include <asm/dwarf2.h>
@@ -21,35 +21,67 @@ __kernel_vsyscall:
 	/*
 	 * Reshuffle regs so that all of any of the entry instructions
 	 * will preserve enough state.
+	 *
+	 * A really nice entry sequence would be:
+	 *  pushl %edx
+	 *  pushl %ecx
+	 *  movl  %esp, %ecx
+	 *
+	 * Unfortunately, naughty Android versions between July and December
+	 * 2015 actually hardcode the traditional Linux SYSENTER entry
+	 * sequence.  That is severely broken for a number of reasons (ask
+	 * anyone with an AMD CPU, for example).  Nonetheless, we try to keep
+	 * it working approximately as well as it ever worked.
+	 *
+	 * This link may eludicate some of the history:
+	 *   https://android-review.googlesource.com/#/q/Iac3295376d61ef83e713ac9b528f3b50aa780cd7
+	 * personally, I find it hard to understand what's going on there.
+	 *
+	 * Note to future user developers: DO NOT USE SYSENTER IN YOUR CODE.
+	 * Execute an indirect call to the address in the AT_SYSINFO auxv
+	 * entry.  That is the ONLY correct way to make a fast 32-bit system
+	 * call on Linux.  (Open-coding int $0x80 is also fine, but it's
+	 * slow.)
 	 */
+	pushl	%ecx
+	CFI_ADJUST_CFA_OFFSET	4
+	CFI_REL_OFFSET		ecx, 0
 	pushl	%edx
 	CFI_ADJUST_CFA_OFFSET	4
 	CFI_REL_OFFSET		edx, 0
-	pushl	%ecx
+	pushl	%ebp
 	CFI_ADJUST_CFA_OFFSET	4
-	CFI_REL_OFFSET		ecx, 0
-	movl	%esp, %ecx
+	CFI_REL_OFFSET		ebp, 0
+
+	#define SYSENTER_SEQUENCE	"movl %esp, %ebp; sysenter"
+	#define SYSCALL_SEQUENCE	"movl %ecx, %ebp; syscall"
 
 #ifdef CONFIG_X86_64
 	/* If SYSENTER (Intel) or SYSCALL32 (AMD) is available, use it. */
-	ALTERNATIVE_2 "", "sysenter", X86_FEATURE_SYSENTER32, \
-	                  "syscall",  X86_FEATURE_SYSCALL32
+	ALTERNATIVE_2 "", SYSENTER_SEQUENCE, X86_FEATURE_SYSENTER32, \
+	                  SYSCALL_SEQUENCE,  X86_FEATURE_SYSCALL32
 #else
-	ALTERNATIVE "", "sysenter", X86_FEATURE_SEP
+	ALTERNATIVE "", SYSENTER_SEQUENCE, X86_FEATURE_SEP
 #endif
 
 	/* Enter using int $0x80 */
-	movl	(%esp), %ecx
 	int	$0x80
 GLOBAL(int80_landing_pad)
 
-	/* Restore ECX and EDX in case they were clobbered. */
-	popl	%ecx
-	CFI_RESTORE		ecx
+	/*
+	 * Restore EDX and ECX in case they were clobbered.  EBP is not
+	 * clobbered (the kernel restores it), but it's cleaner and
+	 * probably faster to pop it than to adjust ESP using addl.
+	 */
+	popl	%ebp
+	CFI_RESTORE		ebp
 	CFI_ADJUST_CFA_OFFSET	-4
 	popl	%edx
 	CFI_RESTORE		edx
 	CFI_ADJUST_CFA_OFFSET	-4
+	popl	%ecx
+	CFI_RESTORE		ecx
+	CFI_ADJUST_CFA_OFFSET	-4
 	ret
 	CFI_ENDPROC
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/include/asm/cpufeature.h linux-libre-4.4-gnu/arch/x86/include/asm/cpufeature.h
--- linux-libre-4.4-rc8-gnu/arch/x86/include/asm/cpufeature.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/include/asm/cpufeature.h	2016-01-10 18:01:32.000000000 -0500
@@ -216,6 +216,7 @@
 #define X86_FEATURE_PAUSEFILTER ( 8*32+13) /* AMD filtered pause intercept */
 #define X86_FEATURE_PFTHRESHOLD ( 8*32+14) /* AMD pause filter threshold */
 #define X86_FEATURE_VMMCALL     ( 8*32+15) /* Prefer vmmcall to vmcall */
+#define X86_FEATURE_XENPV       ( 8*32+16) /* "" Xen paravirtual guest */
 
 
 /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/include/asm/paravirt.h linux-libre-4.4-gnu/arch/x86/include/asm/paravirt.h
--- linux-libre-4.4-rc8-gnu/arch/x86/include/asm/paravirt.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/include/asm/paravirt.h	2016-01-10 18:01:32.000000000 -0500
@@ -19,6 +19,12 @@ static inline int paravirt_enabled(void)
 	return pv_info.paravirt_enabled;
 }
 
+static inline int paravirt_has_feature(unsigned int feature)
+{
+	WARN_ON_ONCE(!pv_info.paravirt_enabled);
+	return (pv_info.features & feature);
+}
+
 static inline void load_sp0(struct tss_struct *tss,
 			     struct thread_struct *thread)
 {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/include/asm/paravirt_types.h linux-libre-4.4-gnu/arch/x86/include/asm/paravirt_types.h
--- linux-libre-4.4-rc8-gnu/arch/x86/include/asm/paravirt_types.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/include/asm/paravirt_types.h	2016-01-10 18:01:32.000000000 -0500
@@ -70,9 +70,14 @@ struct pv_info {
 #endif
 
 	int paravirt_enabled;
+	unsigned int features;	  /* valid only if paravirt_enabled is set */
 	const char *name;
 };
 
+#define paravirt_has(x) paravirt_has_feature(PV_SUPPORTED_##x)
+/* Supported features */
+#define PV_SUPPORTED_RTC        (1<<0)
+
 struct pv_init_ops {
 	/*
 	 * Patch may replace one of the defined code sequences with
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/include/asm/processor.h linux-libre-4.4-gnu/arch/x86/include/asm/processor.h
--- linux-libre-4.4-rc8-gnu/arch/x86/include/asm/processor.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/include/asm/processor.h	2016-01-10 18:01:32.000000000 -0500
@@ -472,6 +472,7 @@ static inline unsigned long current_top_
 #else
 #define __cpuid			native_cpuid
 #define paravirt_enabled()	0
+#define paravirt_has(x) 	0
 
 static inline void load_sp0(struct tss_struct *tss,
 			    struct thread_struct *thread)
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/kernel/apic/apic_numachip.c linux-libre-4.4-gnu/arch/x86/kernel/apic/apic_numachip.c
--- linux-libre-4.4-rc8-gnu/arch/x86/kernel/apic/apic_numachip.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/kernel/apic/apic_numachip.c	2016-01-10 18:01:32.000000000 -0500
@@ -193,20 +193,17 @@ static int __init numachip_system_init(v
 	case 1:
 		init_extra_mapping_uc(NUMACHIP_LCSR_BASE, NUMACHIP_LCSR_SIZE);
 		numachip_apic_icr_write = numachip1_apic_icr_write;
-		x86_init.pci.arch_init = pci_numachip_init;
 		break;
 	case 2:
 		init_extra_mapping_uc(NUMACHIP2_LCSR_BASE, NUMACHIP2_LCSR_SIZE);
 		numachip_apic_icr_write = numachip2_apic_icr_write;
-
-		/* Use MCFG config cycles rather than locked CF8 cycles */
-		raw_pci_ops = &pci_mmcfg;
 		break;
 	default:
 		return 0;
 	}
 
 	x86_cpuinit.fixup_cpu_id = fixup_cpu_id;
+	x86_init.pci.arch_init = pci_numachip_init;
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/kernel/cpu/mcheck/mce.c linux-libre-4.4-gnu/arch/x86/kernel/cpu/mcheck/mce.c
--- linux-libre-4.4-rc8-gnu/arch/x86/kernel/cpu/mcheck/mce.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/kernel/cpu/mcheck/mce.c	2016-01-10 18:01:32.000000000 -0500
@@ -999,6 +999,17 @@ void do_machine_check(struct pt_regs *re
 	int flags = MF_ACTION_REQUIRED;
 	int lmce = 0;
 
+	/* If this CPU is offline, just bail out. */
+	if (cpu_is_offline(smp_processor_id())) {
+		u64 mcgstatus;
+
+		mcgstatus = mce_rdmsrl(MSR_IA32_MCG_STATUS);
+		if (mcgstatus & MCG_STATUS_RIPV) {
+			mce_wrmsrl(MSR_IA32_MCG_STATUS, 0);
+			return;
+		}
+	}
+
 	ist_enter(regs);
 
 	this_cpu_inc(mce_exception_count);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/kernel/rtc.c linux-libre-4.4-gnu/arch/x86/kernel/rtc.c
--- linux-libre-4.4-rc8-gnu/arch/x86/kernel/rtc.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/kernel/rtc.c	2016-01-10 18:01:32.000000000 -0500
@@ -200,6 +200,9 @@ static __init int add_rtc_cmos(void)
 	}
 #endif
 
+	if (paravirt_enabled() && !paravirt_has(RTC))
+		return -ENODEV;
+
 	platform_device_register(&rtc_device);
 	dev_info(&rtc_device.dev,
 		 "registered platform RTC device (no PNP device found)\n");
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/kvm/i8254.c linux-libre-4.4-gnu/arch/x86/kvm/i8254.c
--- linux-libre-4.4-rc8-gnu/arch/x86/kvm/i8254.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/kvm/i8254.c	2016-01-10 18:01:32.000000000 -0500
@@ -420,6 +420,7 @@ void kvm_pit_load_count(struct kvm *kvm,
 	u8 saved_mode;
 	if (hpet_legacy_start) {
 		/* save existing mode for later reenablement */
+		WARN_ON(channel != 0);
 		saved_mode = kvm->arch.vpit->pit_state.channels[0].mode;
 		kvm->arch.vpit->pit_state.channels[0].mode = 0xff; /* disable timer */
 		pit_load_count(kvm, channel, val);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/kvm/x86.c linux-libre-4.4-gnu/arch/x86/kvm/x86.c
--- linux-libre-4.4-rc8-gnu/arch/x86/kvm/x86.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/kvm/x86.c	2016-01-10 18:01:32.000000000 -0500
@@ -3606,7 +3606,8 @@ static int kvm_vm_ioctl_set_pit2(struct
 	       sizeof(kvm->arch.vpit->pit_state.channels));
 	kvm->arch.vpit->pit_state.flags = ps->flags;
 	for (i = 0; i < 3; i++)
-		kvm_pit_load_count(kvm, i, kvm->arch.vpit->pit_state.channels[i].count, start);
+		kvm_pit_load_count(kvm, i, kvm->arch.vpit->pit_state.channels[i].count,
+				   start && i == 0);
 	mutex_unlock(&kvm->arch.vpit->pit_state.lock);
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/lguest/boot.c linux-libre-4.4-gnu/arch/x86/lguest/boot.c
--- linux-libre-4.4-rc8-gnu/arch/x86/lguest/boot.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/lguest/boot.c	2016-01-10 18:01:32.000000000 -0500
@@ -1414,6 +1414,7 @@ __init void lguest_init(void)
 	pv_info.kernel_rpl = 1;
 	/* Everyone except Xen runs with this set. */
 	pv_info.shared_kernel_pmd = 1;
+	pv_info.features = 0;
 
 	/*
 	 * We set up all the lguest overrides for sensitive operations.  These
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/arch/x86/xen/enlighten.c linux-libre-4.4-gnu/arch/x86/xen/enlighten.c
--- linux-libre-4.4-rc8-gnu/arch/x86/xen/enlighten.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/arch/x86/xen/enlighten.c	2016-01-10 18:01:32.000000000 -0500
@@ -1192,7 +1192,7 @@ static const struct pv_info xen_info __i
 #ifdef CONFIG_X86_64
 	.extra_user_64bit_cs = FLAT_USER_CS64,
 #endif
-
+	.features = 0,
 	.name = "Xen",
 };
 
@@ -1535,6 +1535,8 @@ asmlinkage __visible void __init xen_sta
 
 	/* Install Xen paravirt ops */
 	pv_info = xen_info;
+	if (xen_initial_domain())
+		pv_info.features |= PV_SUPPORTED_RTC;
 	pv_init_ops = xen_init_ops;
 	pv_apic_ops = xen_apic_ops;
 	if (!xen_pvh_domain()) {
@@ -1886,8 +1888,10 @@ EXPORT_SYMBOL_GPL(xen_hvm_need_lapic);
 
 static void xen_set_cpu_features(struct cpuinfo_x86 *c)
 {
-	if (xen_pv_domain())
+	if (xen_pv_domain()) {
 		clear_cpu_bug(c, X86_BUG_SYSRET_SS_ATTRS);
+		set_cpu_cap(c, X86_FEATURE_XENPV);
+	}
 }
 
 const struct hypervisor_x86 x86_hyper_xen = {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/block/blk-merge.c linux-libre-4.4-gnu/block/blk-merge.c
--- linux-libre-4.4-rc8-gnu/block/blk-merge.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/block/blk-merge.c	2016-01-10 18:01:32.000000000 -0500
@@ -81,7 +81,7 @@ static struct bio *blk_bio_segment_split
 	struct bio *new = NULL;
 
 	bio_for_each_segment(bv, bio, iter) {
-		if (sectors + (bv.bv_len >> 9) > blk_max_size_offset(q, bio->bi_iter.bi_sector))
+		if (sectors + (bv.bv_len >> 9) > queue_max_sectors(q))
 			goto split;
 
 		/*
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/crypto/async_tx/async_memcpy.c linux-libre-4.4-gnu/crypto/async_tx/async_memcpy.c
--- linux-libre-4.4-rc8-gnu/crypto/async_tx/async_memcpy.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/crypto/async_tx/async_memcpy.c	2016-01-10 18:01:32.000000000 -0500
@@ -53,7 +53,7 @@ async_memcpy(struct page *dest, struct p
 	struct dmaengine_unmap_data *unmap = NULL;
 
 	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, 2, GFP_NOIO);
+		unmap = dmaengine_get_unmap_data(device->dev, 2, GFP_NOWAIT);
 
 	if (unmap && is_dma_copy_aligned(device, src_offset, dest_offset, len)) {
 		unsigned long dma_prep_flags = 0;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/crypto/async_tx/async_pq.c linux-libre-4.4-gnu/crypto/async_tx/async_pq.c
--- linux-libre-4.4-rc8-gnu/crypto/async_tx/async_pq.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/crypto/async_tx/async_pq.c	2016-01-10 18:01:32.000000000 -0500
@@ -188,7 +188,7 @@ async_gen_syndrome(struct page **blocks,
 	BUG_ON(disks > 255 || !(P(blocks, disks) || Q(blocks, disks)));
 
 	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOIO);
+		unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOWAIT);
 
 	/* XORing P/Q is only implemented in software */
 	if (unmap && !(submit->flags & ASYNC_TX_PQ_XOR_DST) &&
@@ -307,7 +307,7 @@ async_syndrome_val(struct page **blocks,
 	BUG_ON(disks < 4);
 
 	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOIO);
+		unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOWAIT);
 
 	if (unmap && disks <= dma_maxpq(device, 0) &&
 	    is_dma_pq_aligned(device, offset, 0, len)) {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/crypto/async_tx/async_raid6_recov.c linux-libre-4.4-gnu/crypto/async_tx/async_raid6_recov.c
--- linux-libre-4.4-rc8-gnu/crypto/async_tx/async_raid6_recov.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/crypto/async_tx/async_raid6_recov.c	2016-01-10 18:01:32.000000000 -0500
@@ -41,7 +41,7 @@ async_sum_product(struct page *dest, str
 	u8 *a, *b, *c;
 
 	if (dma)
-		unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOIO);
+		unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOWAIT);
 
 	if (unmap) {
 		struct device *dev = dma->dev;
@@ -105,7 +105,7 @@ async_mult(struct page *dest, struct pag
 	u8 *d, *s;
 
 	if (dma)
-		unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOIO);
+		unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOWAIT);
 
 	if (unmap) {
 		dma_addr_t dma_dest[2];
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/crypto/async_tx/async_xor.c linux-libre-4.4-gnu/crypto/async_tx/async_xor.c
--- linux-libre-4.4-rc8-gnu/crypto/async_tx/async_xor.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/crypto/async_tx/async_xor.c	2016-01-10 18:01:32.000000000 -0500
@@ -182,7 +182,7 @@ async_xor(struct page *dest, struct page
 	BUG_ON(src_cnt <= 1);
 
 	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, src_cnt+1, GFP_NOIO);
+		unmap = dmaengine_get_unmap_data(device->dev, src_cnt+1, GFP_NOWAIT);
 
 	if (unmap && is_dma_xor_aligned(device, offset, 0, len)) {
 		struct dma_async_tx_descriptor *tx;
@@ -278,7 +278,7 @@ async_xor_val(struct page *dest, struct
 	BUG_ON(src_cnt <= 1);
 
 	if (device)
-		unmap = dmaengine_get_unmap_data(device->dev, src_cnt, GFP_NOIO);
+		unmap = dmaengine_get_unmap_data(device->dev, src_cnt, GFP_NOWAIT);
 
 	if (unmap && src_cnt <= device->max_xor &&
 	    is_dma_xor_aligned(device, offset, 0, len)) {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/acpi/device_sysfs.c linux-libre-4.4-gnu/drivers/acpi/device_sysfs.c
--- linux-libre-4.4-rc8-gnu/drivers/acpi/device_sysfs.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/acpi/device_sysfs.c	2016-01-10 18:01:32.000000000 -0500
@@ -104,7 +104,7 @@ static void acpi_expose_nondev_subnodes(
 
 		init_completion(&dn->kobj_done);
 		ret = kobject_init_and_add(&dn->kobj, &acpi_data_node_ktype,
-					   kobj, dn->name);
+					   kobj, "%s", dn->name);
 		if (ret)
 			acpi_handle_err(dn->handle, "Failed to expose (%d)\n", ret);
 		else
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/connector/connector.c linux-libre-4.4-gnu/drivers/connector/connector.c
--- linux-libre-4.4-rc8-gnu/drivers/connector/connector.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/connector/connector.c	2016-01-10 18:01:32.000000000 -0500
@@ -179,26 +179,21 @@ static int cn_call_callback(struct sk_bu
  *
  * It checks skb, netlink header and msg sizes, and calls callback helper.
  */
-static void cn_rx_skb(struct sk_buff *__skb)
+static void cn_rx_skb(struct sk_buff *skb)
 {
 	struct nlmsghdr *nlh;
-	struct sk_buff *skb;
 	int len, err;
 
-	skb = skb_get(__skb);
-
 	if (skb->len >= NLMSG_HDRLEN) {
 		nlh = nlmsg_hdr(skb);
 		len = nlmsg_len(nlh);
 
 		if (len < (int)sizeof(struct cn_msg) ||
 		    skb->len < nlh->nlmsg_len ||
-		    len > CONNECTOR_MAX_MSG_SIZE) {
-			kfree_skb(skb);
+		    len > CONNECTOR_MAX_MSG_SIZE)
 			return;
-		}
 
-		err = cn_call_callback(skb);
+		err = cn_call_callback(skb_get(skb));
 		if (err < 0)
 			kfree_skb(skb);
 	}
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/dma/mic_x100_dma.c linux-libre-4.4-gnu/drivers/dma/mic_x100_dma.c
--- linux-libre-4.4-rc8-gnu/drivers/dma/mic_x100_dma.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/dma/mic_x100_dma.c	2016-01-10 18:01:32.000000000 -0500
@@ -317,7 +317,6 @@ mic_dma_prep_memcpy_lock(struct dma_chan
 	struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch);
 	struct device *dev = mic_dma_ch_to_device(mic_ch);
 	int result;
-	struct dma_async_tx_descriptor *tx = NULL;
 
 	if (!len && !flags)
 		return NULL;
@@ -325,13 +324,10 @@ mic_dma_prep_memcpy_lock(struct dma_chan
 	spin_lock(&mic_ch->prep_lock);
 	result = mic_dma_do_dma(mic_ch, flags, dma_src, dma_dest, len);
 	if (result >= 0)
-		tx = allocate_tx(mic_ch);
-
-	if (!tx)
-		dev_err(dev, "Error enqueueing dma, error=%d\n", result);
-
+		return allocate_tx(mic_ch);
+	dev_err(dev, "Error enqueueing dma, error=%d\n", result);
 	spin_unlock(&mic_ch->prep_lock);
-	return tx;
+	return NULL;
 }
 
 static struct dma_async_tx_descriptor *
@@ -339,14 +335,13 @@ mic_dma_prep_interrupt_lock(struct dma_c
 {
 	struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch);
 	int ret;
-	struct dma_async_tx_descriptor *tx = NULL;
 
 	spin_lock(&mic_ch->prep_lock);
 	ret = mic_dma_do_dma(mic_ch, flags, 0, 0, 0);
 	if (!ret)
-		tx = allocate_tx(mic_ch);
+		return allocate_tx(mic_ch);
 	spin_unlock(&mic_ch->prep_lock);
-	return tx;
+	return NULL;
 }
 
 /* Return the status of the transaction */
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/dma/xgene-dma.c linux-libre-4.4-gnu/drivers/dma/xgene-dma.c
--- linux-libre-4.4-rc8-gnu/drivers/dma/xgene-dma.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/dma/xgene-dma.c	2016-01-10 18:01:32.000000000 -0500
@@ -29,6 +29,7 @@
 #include <linux/dmapool.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
 
@@ -1610,6 +1611,7 @@ static int xgene_dma_request_irqs(struct
 	/* Register DMA channel rx irq */
 	for (i = 0; i < XGENE_DMA_MAX_CHANNEL; i++) {
 		chan = &pdma->chan[i];
+		irq_set_status_flags(chan->rx_irq, IRQ_DISABLE_UNLAZY);
 		ret = devm_request_irq(chan->dev, chan->rx_irq,
 				       xgene_dma_chan_ring_isr,
 				       0, chan->name, chan);
@@ -1620,6 +1622,7 @@ static int xgene_dma_request_irqs(struct
 
 			for (j = 0; j < i; j++) {
 				chan = &pdma->chan[i];
+				irq_clear_status_flags(chan->rx_irq, IRQ_DISABLE_UNLAZY);
 				devm_free_irq(chan->dev, chan->rx_irq, chan);
 			}
 
@@ -1640,6 +1643,7 @@ static void xgene_dma_free_irqs(struct x
 
 	for (i = 0; i < XGENE_DMA_MAX_CHANNEL; i++) {
 		chan = &pdma->chan[i];
+		irq_clear_status_flags(chan->rx_irq, IRQ_DISABLE_UNLAZY);
 		devm_free_irq(chan->dev, chan->rx_irq, chan);
 	}
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/firmware/dmi_scan.c linux-libre-4.4-gnu/drivers/firmware/dmi_scan.c
--- linux-libre-4.4-rc8-gnu/drivers/firmware/dmi_scan.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/firmware/dmi_scan.c	2016-01-10 18:01:32.000000000 -0500
@@ -521,6 +521,7 @@ static int __init dmi_present(const u8 *
 			dmi_ver = smbios_ver;
 		else
 			dmi_ver = (buf[14] & 0xF0) << 4 | (buf[14] & 0x0F);
+		dmi_ver <<= 8;
 		dmi_num = get_unaligned_le16(buf + 12);
 		dmi_len = get_unaligned_le16(buf + 6);
 		dmi_base = get_unaligned_le32(buf + 8);
@@ -528,15 +529,14 @@ static int __init dmi_present(const u8 *
 		if (dmi_walk_early(dmi_decode) == 0) {
 			if (smbios_ver) {
 				pr_info("SMBIOS %d.%d present.\n",
-				       dmi_ver >> 8, dmi_ver & 0xFF);
+					dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
 			} else {
 				smbios_entry_point_size = 15;
 				memcpy(smbios_entry_point, buf,
 				       smbios_entry_point_size);
 				pr_info("Legacy DMI %d.%d present.\n",
-				       dmi_ver >> 8, dmi_ver & 0xFF);
+					dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
 			}
-			dmi_ver <<= 8;
 			dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
 			printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string);
 			return 0;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c linux-libre-4.4-gnu/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
--- linux-libre-4.4-rc8-gnu/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c	2016-01-10 18:01:32.000000000 -0500
@@ -156,6 +156,7 @@ nv40_gr_chan_new(struct nvkm_gr *base, s
 		return -ENOMEM;
 	nvkm_object_ctor(&nv40_gr_chan, oclass, &chan->object);
 	chan->gr = gr;
+	chan->fifo = fifoch;
 	*pobject = &chan->object;
 
 	spin_lock_irqsave(&chan->gr->base.engine.lock, flags);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/iommu/dma-iommu.c linux-libre-4.4-gnu/drivers/iommu/dma-iommu.c
--- linux-libre-4.4-rc8-gnu/drivers/iommu/dma-iommu.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/iommu/dma-iommu.c	2016-01-10 18:01:32.000000000 -0500
@@ -21,10 +21,13 @@
 
 #include <linux/device.h>
 #include <linux/dma-iommu.h>
+#include <linux/gfp.h>
 #include <linux/huge_mm.h>
 #include <linux/iommu.h>
 #include <linux/iova.h>
 #include <linux/mm.h>
+#include <linux/scatterlist.h>
+#include <linux/vmalloc.h>
 
 int iommu_dma_init(void)
 {
@@ -191,6 +194,7 @@ static struct page **__iommu_dma_alloc_p
 {
 	struct page **pages;
 	unsigned int i = 0, array_size = count * sizeof(*pages);
+	unsigned int order = MAX_ORDER;
 
 	if (array_size <= PAGE_SIZE)
 		pages = kzalloc(array_size, GFP_KERNEL);
@@ -204,14 +208,15 @@ static struct page **__iommu_dma_alloc_p
 
 	while (count) {
 		struct page *page = NULL;
-		int j, order = __fls(count);
+		int j;
 
 		/*
 		 * Higher-order allocations are a convenience rather
 		 * than a necessity, hence using __GFP_NORETRY until
 		 * falling back to single-page allocations.
 		 */
-		for (order = min(order, MAX_ORDER); order > 0; order--) {
+		for (order = min_t(unsigned int, order, __fls(count));
+		     order > 0; order--) {
 			page = alloc_pages(gfp | __GFP_NORETRY, order);
 			if (!page)
 				continue;
@@ -453,7 +458,7 @@ int iommu_dma_map_sg(struct device *dev,
 		size_t s_offset = iova_offset(iovad, s->offset);
 		size_t s_length = s->length;
 
-		sg_dma_address(s) = s->offset;
+		sg_dma_address(s) = s_offset;
 		sg_dma_len(s) = s_length;
 		s->offset -= s_offset;
 		s_length = iova_align(iovad, s_length + s_offset);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/iommu/ipmmu-vmsa.c linux-libre-4.4-gnu/drivers/iommu/ipmmu-vmsa.c
--- linux-libre-4.4-rc8-gnu/drivers/iommu/ipmmu-vmsa.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/iommu/ipmmu-vmsa.c	2016-01-10 18:01:32.000000000 -0500
@@ -295,7 +295,7 @@ static struct iommu_gather_ops ipmmu_gat
 
 static int ipmmu_domain_init_context(struct ipmmu_vmsa_domain *domain)
 {
-	phys_addr_t ttbr;
+	u64 ttbr;
 
 	/*
 	 * Allocate the page table operations.
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/mtd/mtdcore.c linux-libre-4.4-gnu/drivers/mtd/mtdcore.c
--- linux-libre-4.4-rc8-gnu/drivers/mtd/mtdcore.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/mtd/mtdcore.c	2016-01-10 18:01:32.000000000 -0500
@@ -426,15 +426,6 @@ int add_mtd_device(struct mtd_info *mtd)
 	mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1;
 	mtd->writesize_mask = (1 << mtd->writesize_shift) - 1;
 
-	if (mtd->dev.parent) {
-		if (!mtd->owner && mtd->dev.parent->driver)
-			mtd->owner = mtd->dev.parent->driver->owner;
-		if (!mtd->name)
-			mtd->name = dev_name(mtd->dev.parent);
-	} else {
-		pr_debug("mtd device won't show a device symlink in sysfs\n");
-	}
-
 	/* Some chips always power up locked. Unlock them now */
 	if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) {
 		error = mtd_unlock(mtd, 0, mtd->size);
@@ -549,6 +540,21 @@ static int mtd_add_device_partitions(str
 	return 0;
 }
 
+/*
+ * Set a few defaults based on the parent devices, if not provided by the
+ * driver
+ */
+static void mtd_set_dev_defaults(struct mtd_info *mtd)
+{
+	if (mtd->dev.parent) {
+		if (!mtd->owner && mtd->dev.parent->driver)
+			mtd->owner = mtd->dev.parent->driver->owner;
+		if (!mtd->name)
+			mtd->name = dev_name(mtd->dev.parent);
+	} else {
+		pr_debug("mtd device won't show a device symlink in sysfs\n");
+	}
+}
 
 /**
  * mtd_device_parse_register - parse partitions and register an MTD device.
@@ -587,6 +593,8 @@ int mtd_device_parse_register(struct mtd
 	int ret;
 	struct mtd_partition *real_parts = NULL;
 
+	mtd_set_dev_defaults(mtd);
+
 	ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data);
 	if (ret <= 0 && nr_parts && parts) {
 		real_parts = kmemdup(parts, sizeof(*parts) * nr_parts,
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/mtd/spi-nor/spi-nor.c linux-libre-4.4-gnu/drivers/mtd/spi-nor/spi-nor.c
--- linux-libre-4.4-rc8-gnu/drivers/mtd/spi-nor/spi-nor.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/mtd/spi-nor/spi-nor.c	2016-01-10 18:01:32.000000000 -0500
@@ -516,8 +516,8 @@ static int stm_unlock(struct spi_nor *no
 	status_old = read_sr(nor);
 
 	/* Cannot unlock; would unlock larger region than requested */
-	if (stm_is_locked_sr(nor, status_old, ofs - mtd->erasesize,
-			     mtd->erasesize))
+	if (stm_is_locked_sr(nor, ofs - mtd->erasesize, mtd->erasesize,
+			     status_old))
 		return -EINVAL;
 
 	/*
@@ -1200,8 +1200,7 @@ int spi_nor_scan(struct spi_nor *nor, co
 
 	if (JEDEC_MFR(info) == SNOR_MFR_ATMEL ||
 	    JEDEC_MFR(info) == SNOR_MFR_INTEL ||
-	    JEDEC_MFR(info) == SNOR_MFR_SST ||
-	    JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
+	    JEDEC_MFR(info) == SNOR_MFR_SST) {
 		write_enable(nor);
 		write_sr(nor, 0);
 	}
@@ -1217,8 +1216,7 @@ int spi_nor_scan(struct spi_nor *nor, co
 	mtd->_read = spi_nor_read;
 
 	/* NOR protection support for STmicro/Micron chips and similar */
-	if (JEDEC_MFR(info) == SNOR_MFR_MICRON ||
-	    JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
+	if (JEDEC_MFR(info) == SNOR_MFR_MICRON) {
 		nor->flash_lock = stm_lock;
 		nor->flash_unlock = stm_unlock;
 		nor->flash_is_locked = stm_is_locked;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c linux-libre-4.4-gnu/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c
--- linux-libre-4.4-rc8-gnu/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c	2016-01-10 18:01:32.000000000 -0500
@@ -295,6 +295,10 @@ struct clip_tbl *t4_init_clip_tbl(unsign
 		INIT_LIST_HEAD(&ctbl->hash_list[i]);
 
 	cl_list = t4_alloc_mem(clipt_size*sizeof(struct clip_entry));
+	if (!cl_list) {
+		t4_free_mem(ctbl);
+		return NULL;
+	}
 	ctbl->cl_list = (void *)cl_list;
 
 	for (i = 0; i < clipt_size; i++) {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c linux-libre-4.4-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
--- linux-libre-4.4-rc8-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c	2016-01-10 18:01:32.000000000 -0500
@@ -772,8 +772,10 @@ int qlcnic_82xx_config_intrpt(struct qlc
 	int i, err = 0;
 
 	for (i = 0; i < ahw->num_msix; i++) {
-		qlcnic_alloc_mbx_args(&cmd, adapter,
-				      QLCNIC_CMD_MQ_TX_CONFIG_INTR);
+		err = qlcnic_alloc_mbx_args(&cmd, adapter,
+					    QLCNIC_CMD_MQ_TX_CONFIG_INTR);
+		if (err)
+			return err;
 		type = op_type ? QLCNIC_INTRPT_ADD : QLCNIC_INTRPT_DEL;
 		val = type | (ahw->intr_tbl[i].type << 4);
 		if (ahw->intr_tbl[i].type == QLCNIC_INTRPT_MSIX)
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/hamradio/6pack.c linux-libre-4.4-gnu/drivers/net/hamradio/6pack.c
--- linux-libre-4.4-rc8-gnu/drivers/net/hamradio/6pack.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/hamradio/6pack.c	2016-01-10 18:01:32.000000000 -0500
@@ -683,6 +683,12 @@ static void sixpack_close(struct tty_str
 	if (!atomic_dec_and_test(&sp->refcnt))
 		down(&sp->dead_sem);
 
+	/* We must stop the queue to avoid potentially scribbling
+	 * on the free buffers. The sp->dead_sem is not sufficient
+	 * to protect us from sp->xbuff access.
+	 */
+	netif_stop_queue(sp->dev);
+
 	del_timer_sync(&sp->tx_t);
 	del_timer_sync(&sp->resync_t);
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/hamradio/mkiss.c linux-libre-4.4-gnu/drivers/net/hamradio/mkiss.c
--- linux-libre-4.4-rc8-gnu/drivers/net/hamradio/mkiss.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/hamradio/mkiss.c	2016-01-10 18:01:32.000000000 -0500
@@ -797,6 +797,11 @@ static void mkiss_close(struct tty_struc
 	 */
 	if (!atomic_dec_and_test(&ax->refcnt))
 		down(&ax->dead_sem);
+	/*
+	 * Halt the transmit queue so that a new transmit cannot scribble
+	 * on our buffers
+	 */
+	netif_stop_queue(ax->dev);
 
 	/* Free all AX25 frame buffers. */
 	kfree(ax->rbuff);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/usb/qmi_wwan.c linux-libre-4.4-gnu/drivers/net/usb/qmi_wwan.c
--- linux-libre-4.4-rc8-gnu/drivers/net/usb/qmi_wwan.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/usb/qmi_wwan.c	2016-01-10 18:01:32.000000000 -0500
@@ -742,6 +742,7 @@ static const struct usb_device_id produc
 	{QMI_FIXED_INTF(0x413c, 0x81a9, 8)},	/* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */
 	{QMI_FIXED_INTF(0x413c, 0x81b1, 8)},	/* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card */
 	{QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)},	/* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
+	{QMI_FIXED_INTF(0x22de, 0x9061, 3)},	/* WeTelecom WPD-600N */
 
 	/* 4. Gobi 1000 devices */
 	{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)},	/* Acer Gobi Modem Device */
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/usb/r8152.c linux-libre-4.4-gnu/drivers/net/usb/r8152.c
--- linux-libre-4.4-rc8-gnu/drivers/net/usb/r8152.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/usb/r8152.c	2016-01-10 18:01:32.000000000 -0500
@@ -3525,6 +3525,14 @@ static int rtl8152_resume(struct usb_int
 	return 0;
 }
 
+static int rtl8152_reset_resume(struct usb_interface *intf)
+{
+	struct r8152 *tp = usb_get_intfdata(intf);
+
+	clear_bit(SELECTIVE_SUSPEND, &tp->flags);
+	return rtl8152_resume(intf);
+}
+
 static void rtl8152_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
 	struct r8152 *tp = netdev_priv(dev);
@@ -4276,7 +4284,7 @@ static struct usb_driver rtl8152_driver
 	.disconnect =	rtl8152_disconnect,
 	.suspend =	rtl8152_suspend,
 	.resume =	rtl8152_resume,
-	.reset_resume =	rtl8152_resume,
+	.reset_resume =	rtl8152_reset_resume,
 	.pre_reset =	rtl8152_pre_reset,
 	.post_reset =	rtl8152_post_reset,
 	.supports_autosuspend = 1,
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/vmxnet3/vmxnet3_drv.c linux-libre-4.4-gnu/drivers/net/vmxnet3/vmxnet3_drv.c
--- linux-libre-4.4-rc8-gnu/drivers/net/vmxnet3/vmxnet3_drv.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/vmxnet3/vmxnet3_drv.c	2016-01-10 18:01:32.000000000 -0500
@@ -1380,10 +1380,10 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx
 					skip_page_frags = true;
 					goto rcd_done;
 				}
-				new_dma_addr = dma_map_page(&adapter->pdev->dev
-							, rbi->page,
-							0, PAGE_SIZE,
-							PCI_DMA_FROMDEVICE);
+				new_dma_addr = dma_map_page(&adapter->pdev->dev,
+							    new_page,
+							    0, PAGE_SIZE,
+							    PCI_DMA_FROMDEVICE);
 				if (dma_mapping_error(&adapter->pdev->dev,
 						      new_dma_addr)) {
 					put_page(new_page);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/vmxnet3/vmxnet3_int.h linux-libre-4.4-gnu/drivers/net/vmxnet3/vmxnet3_int.h
--- linux-libre-4.4-rc8-gnu/drivers/net/vmxnet3/vmxnet3_int.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/vmxnet3/vmxnet3_int.h	2016-01-10 18:01:32.000000000 -0500
@@ -69,10 +69,10 @@
 /*
  * Version numbers
  */
-#define VMXNET3_DRIVER_VERSION_STRING   "1.4.4.0-k"
+#define VMXNET3_DRIVER_VERSION_STRING   "1.4.5.0-k"
 
 /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
-#define VMXNET3_DRIVER_VERSION_NUM      0x01040400
+#define VMXNET3_DRIVER_VERSION_NUM      0x01040500
 
 #if defined(CONFIG_PCI_MSI)
 	/* RSS only makes sense if MSI-X is supported. */
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/net/vrf.c linux-libre-4.4-gnu/drivers/net/vrf.c
--- linux-libre-4.4-rc8-gnu/drivers/net/vrf.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/net/vrf.c	2016-01-10 18:01:32.000000000 -0500
@@ -800,7 +800,7 @@ static struct rtable *vrf_get_rtable(con
 }
 
 /* called under rcu_read_lock */
-static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
+static int vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
 {
 	struct fib_result res = { .tclassid = 0 };
 	struct net *net = dev_net(dev);
@@ -808,9 +808,10 @@ static void vrf_get_saddr(struct net_dev
 	u8 flags = fl4->flowi4_flags;
 	u8 scope = fl4->flowi4_scope;
 	u8 tos = RT_FL_TOS(fl4);
+	int rc;
 
 	if (unlikely(!fl4->daddr))
-		return;
+		return 0;
 
 	fl4->flowi4_flags |= FLOWI_FLAG_SKIP_NH_OIF;
 	fl4->flowi4_iif = LOOPBACK_IFINDEX;
@@ -818,7 +819,8 @@ static void vrf_get_saddr(struct net_dev
 	fl4->flowi4_scope = ((tos & RTO_ONLINK) ?
 			     RT_SCOPE_LINK : RT_SCOPE_UNIVERSE);
 
-	if (!fib_lookup(net, fl4, &res, 0)) {
+	rc = fib_lookup(net, fl4, &res, 0);
+	if (!rc) {
 		if (res.type == RTN_LOCAL)
 			fl4->saddr = res.fi->fib_prefsrc ? : fl4->daddr;
 		else
@@ -828,6 +830,8 @@ static void vrf_get_saddr(struct net_dev
 	fl4->flowi4_flags = flags;
 	fl4->flowi4_tos = orig_tos;
 	fl4->flowi4_scope = scope;
+
+	return rc;
 }
 
 #if IS_ENABLED(CONFIG_IPV6)
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/pci/host/Kconfig linux-libre-4.4-gnu/drivers/pci/host/Kconfig
--- linux-libre-4.4-rc8-gnu/drivers/pci/host/Kconfig	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/pci/host/Kconfig	2016-01-10 18:01:32.000000000 -0500
@@ -5,6 +5,7 @@ config PCI_DRA7XX
 	bool "TI DRA7xx PCIe controller"
 	select PCIE_DW
 	depends on OF && HAS_IOMEM && TI_PIPE3
+	depends on BROKEN
 	help
 	 Enables support for the PCIe controller in the DRA7xx SoC.  There
 	 are two instances of PCIe controller in DRA7xx.  This controller can
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/drivers/scsi/sd.c linux-libre-4.4-gnu/drivers/scsi/sd.c
--- linux-libre-4.4-rc8-gnu/drivers/scsi/sd.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/drivers/scsi/sd.c	2016-01-10 18:01:32.000000000 -0500
@@ -2885,10 +2885,13 @@ static int sd_revalidate_disk(struct gen
 
 	/*
 	 * Use the device's preferred I/O size for reads and writes
-	 * unless the reported value is unreasonably large (or garbage).
+	 * unless the reported value is unreasonably small, large, or
+	 * garbage.
 	 */
-	if (sdkp->opt_xfer_blocks && sdkp->opt_xfer_blocks <= dev_max &&
-	    sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS)
+	if (sdkp->opt_xfer_blocks &&
+	    sdkp->opt_xfer_blocks <= dev_max &&
+	    sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS &&
+	    sdkp->opt_xfer_blocks * sdp->sector_size >= PAGE_CACHE_SIZE)
 		rw_max = q->limits.io_opt =
 			logical_to_sectors(sdp, sdkp->opt_xfer_blocks);
 	else
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/include/linux/filter.h linux-libre-4.4-gnu/include/linux/filter.h
--- linux-libre-4.4-rc8-gnu/include/linux/filter.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/include/linux/filter.h	2016-01-10 18:01:32.000000000 -0500
@@ -493,6 +493,25 @@ static inline void bpf_jit_free(struct b
 
 #define BPF_ANC		BIT(15)
 
+static inline bool bpf_needs_clear_a(const struct sock_filter *first)
+{
+	switch (first->code) {
+	case BPF_RET | BPF_K:
+	case BPF_LD | BPF_W | BPF_LEN:
+		return false;
+
+	case BPF_LD | BPF_W | BPF_ABS:
+	case BPF_LD | BPF_H | BPF_ABS:
+	case BPF_LD | BPF_B | BPF_ABS:
+		if (first->k == SKF_AD_OFF + SKF_AD_ALU_XOR_X)
+			return true;
+		return false;
+
+	default:
+		return true;
+	}
+}
+
 static inline u16 bpf_anc_helper(const struct sock_filter *ftest)
 {
 	BUG_ON(ftest->code & BPF_ANC);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/include/linux/ftrace.h linux-libre-4.4-gnu/include/linux/ftrace.h
--- linux-libre-4.4-rc8-gnu/include/linux/ftrace.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/include/linux/ftrace.h	2016-01-10 18:01:32.000000000 -0500
@@ -586,6 +586,7 @@ extern int ftrace_arch_read_dyn_info(cha
 
 extern int skip_trace(unsigned long ip);
 extern void ftrace_module_init(struct module *mod);
+extern void ftrace_release_mod(struct module *mod);
 
 extern void ftrace_disable_daemon(void);
 extern void ftrace_enable_daemon(void);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/include/linux/mtd/spi-nor.h linux-libre-4.4-gnu/include/linux/mtd/spi-nor.h
--- linux-libre-4.4-rc8-gnu/include/linux/mtd/spi-nor.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/include/linux/mtd/spi-nor.h	2016-01-10 18:01:32.000000000 -0500
@@ -25,7 +25,7 @@
 #define SNOR_MFR_MACRONIX	CFI_MFR_MACRONIX
 #define SNOR_MFR_SPANSION	CFI_MFR_AMD
 #define SNOR_MFR_SST		CFI_MFR_SST
-#define SNOR_MFR_WINBOND	0xef
+#define SNOR_MFR_WINBOND	0xef /* Also used by some Spansion */
 
 /*
  * Note on opcode nomenclature: some opcodes have a format like
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/include/linux/sched.h linux-libre-4.4-gnu/include/linux/sched.h
--- linux-libre-4.4-rc8-gnu/include/linux/sched.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/include/linux/sched.h	2016-01-10 18:01:32.000000000 -0500
@@ -1455,14 +1455,15 @@ struct task_struct {
 	/* Used for emulating ABI behavior of previous Linux versions */
 	unsigned int personality;
 
-	unsigned in_execve:1;	/* Tell the LSMs that the process is doing an
-				 * execve */
-	unsigned in_iowait:1;
-
-	/* Revert to default priority/policy when forking */
+	/* scheduler bits, serialized by scheduler locks */
 	unsigned sched_reset_on_fork:1;
 	unsigned sched_contributes_to_load:1;
 	unsigned sched_migrated:1;
+	unsigned :0; /* force alignment to the next boundary */
+
+	/* unserialized, strictly 'current' */
+	unsigned in_execve:1; /* bit to tell LSMs we're in execve */
+	unsigned in_iowait:1;
 #ifdef CONFIG_MEMCG
 	unsigned memcg_may_oom:1;
 #endif
@@ -2002,7 +2003,8 @@ static inline int pid_alive(const struct
 }
 
 /**
- * is_global_init - check if a task structure is init
+ * is_global_init - check if a task structure is init. Since init
+ * is free to have sub-threads we need to check tgid.
  * @tsk: Task structure to be checked.
  *
  * Check if a task structure is the first user space task the kernel created.
@@ -2011,7 +2013,7 @@ static inline int pid_alive(const struct
  */
 static inline int is_global_init(struct task_struct *tsk)
 {
-	return tsk->pid == 1;
+	return task_tgid_nr(tsk) == 1;
 }
 
 extern struct pid *cad_pid;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/include/net/l3mdev.h linux-libre-4.4-gnu/include/net/l3mdev.h
--- linux-libre-4.4-rc8-gnu/include/net/l3mdev.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/include/net/l3mdev.h	2016-01-10 18:01:32.000000000 -0500
@@ -29,7 +29,7 @@ struct l3mdev_ops {
 	/* IPv4 ops */
 	struct rtable *	(*l3mdev_get_rtable)(const struct net_device *dev,
 					     const struct flowi4 *fl4);
-	void		(*l3mdev_get_saddr)(struct net_device *dev,
+	int		(*l3mdev_get_saddr)(struct net_device *dev,
 					    struct flowi4 *fl4);
 
 	/* IPv6 ops */
@@ -112,10 +112,11 @@ static inline bool netif_index_is_l3_mas
 	return rc;
 }
 
-static inline void l3mdev_get_saddr(struct net *net, int ifindex,
-				    struct flowi4 *fl4)
+static inline int l3mdev_get_saddr(struct net *net, int ifindex,
+				   struct flowi4 *fl4)
 {
 	struct net_device *dev;
+	int rc = 0;
 
 	if (ifindex) {
 
@@ -124,11 +125,13 @@ static inline void l3mdev_get_saddr(stru
 		dev = dev_get_by_index_rcu(net, ifindex);
 		if (dev && netif_is_l3_master(dev) &&
 		    dev->l3mdev_ops->l3mdev_get_saddr) {
-			dev->l3mdev_ops->l3mdev_get_saddr(dev, fl4);
+			rc = dev->l3mdev_ops->l3mdev_get_saddr(dev, fl4);
 		}
 
 		rcu_read_unlock();
 	}
+
+	return rc;
 }
 
 static inline struct dst_entry *l3mdev_get_rt6_dst(const struct net_device *dev,
@@ -200,9 +203,10 @@ static inline bool netif_index_is_l3_mas
 	return false;
 }
 
-static inline void l3mdev_get_saddr(struct net *net, int ifindex,
-				    struct flowi4 *fl4)
+static inline int l3mdev_get_saddr(struct net *net, int ifindex,
+				   struct flowi4 *fl4)
 {
+	return 0;
 }
 
 static inline
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/include/net/route.h linux-libre-4.4-gnu/include/net/route.h
--- linux-libre-4.4-rc8-gnu/include/net/route.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/include/net/route.h	2016-01-10 18:01:32.000000000 -0500
@@ -283,7 +283,12 @@ static inline struct rtable *ip_route_co
 			      sport, dport, sk);
 
 	if (!src && oif) {
-		l3mdev_get_saddr(net, oif, fl4);
+		int rc;
+
+		rc = l3mdev_get_saddr(net, oif, fl4);
+		if (rc < 0)
+			return ERR_PTR(rc);
+
 		src = fl4->saddr;
 	}
 	if (!dst || !src) {
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/include/sound/soc.h linux-libre-4.4-gnu/include/sound/soc.h
--- linux-libre-4.4-rc8-gnu/include/sound/soc.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/include/sound/soc.h	2016-01-10 18:01:32.000000000 -0500
@@ -1655,7 +1655,7 @@ extern const struct dev_pm_ops snd_soc_p
 /* Helper functions */
 static inline void snd_soc_dapm_mutex_lock(struct snd_soc_dapm_context *dapm)
 {
-	mutex_lock(&dapm->card->dapm_mutex);
+	mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
 }
 
 static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm)
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/kernel/events/core.c linux-libre-4.4-gnu/kernel/events/core.c
--- linux-libre-4.4-rc8-gnu/kernel/events/core.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/kernel/events/core.c	2016-01-10 18:01:32.000000000 -0500
@@ -3154,15 +3154,16 @@ static int event_enable_on_exec(struct p
  * Enable all of a task's events that have been marked enable-on-exec.
  * This expects task == current.
  */
-static void perf_event_enable_on_exec(struct perf_event_context *ctx)
+static void perf_event_enable_on_exec(int ctxn)
 {
-	struct perf_event_context *clone_ctx = NULL;
+	struct perf_event_context *ctx, *clone_ctx = NULL;
 	struct perf_event *event;
 	unsigned long flags;
 	int enabled = 0;
 	int ret;
 
 	local_irq_save(flags);
+	ctx = current->perf_event_ctxp[ctxn];
 	if (!ctx || !ctx->nr_events)
 		goto out;
 
@@ -3205,17 +3206,11 @@ out:
 
 void perf_event_exec(void)
 {
-	struct perf_event_context *ctx;
 	int ctxn;
 
 	rcu_read_lock();
-	for_each_task_context_nr(ctxn) {
-		ctx = current->perf_event_ctxp[ctxn];
-		if (!ctx)
-			continue;
-
-		perf_event_enable_on_exec(ctx);
-	}
+	for_each_task_context_nr(ctxn)
+		perf_event_enable_on_exec(ctxn);
 	rcu_read_unlock();
 }
 
@@ -6493,9 +6488,6 @@ struct swevent_htable {
 
 	/* Recursion avoidance in each contexts */
 	int				recursion[PERF_NR_CONTEXTS];
-
-	/* Keeps track of cpu being initialized/exited */
-	bool				online;
 };
 
 static DEFINE_PER_CPU(struct swevent_htable, swevent_htable);
@@ -6753,14 +6745,8 @@ static int perf_swevent_add(struct perf_
 	hwc->state = !(flags & PERF_EF_START);
 
 	head = find_swevent_head(swhash, event);
-	if (!head) {
-		/*
-		 * We can race with cpu hotplug code. Do not
-		 * WARN if the cpu just got unplugged.
-		 */
-		WARN_ON_ONCE(swhash->online);
+	if (WARN_ON_ONCE(!head))
 		return -EINVAL;
-	}
 
 	hlist_add_head_rcu(&event->hlist_entry, head);
 	perf_event_update_userpage(event);
@@ -6828,7 +6814,6 @@ static int swevent_hlist_get_cpu(struct
 	int err = 0;
 
 	mutex_lock(&swhash->hlist_mutex);
-
 	if (!swevent_hlist_deref(swhash) && cpu_online(cpu)) {
 		struct swevent_hlist *hlist;
 
@@ -9291,7 +9276,6 @@ static void perf_event_init_cpu(int cpu)
 	struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu);
 
 	mutex_lock(&swhash->hlist_mutex);
-	swhash->online = true;
 	if (swhash->hlist_refcount > 0) {
 		struct swevent_hlist *hlist;
 
@@ -9333,14 +9317,7 @@ static void perf_event_exit_cpu_context(
 
 static void perf_event_exit_cpu(int cpu)
 {
-	struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu);
-
 	perf_event_exit_cpu_context(cpu);
-
-	mutex_lock(&swhash->hlist_mutex);
-	swhash->online = false;
-	swevent_hlist_release(swhash);
-	mutex_unlock(&swhash->hlist_mutex);
 }
 #else
 static inline void perf_event_exit_cpu(int cpu) { }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/kernel/fork.c linux-libre-4.4-gnu/kernel/fork.c
--- linux-libre-4.4-rc8-gnu/kernel/fork.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/kernel/fork.c	2016-01-10 18:01:32.000000000 -0500
@@ -380,6 +380,7 @@ static struct task_struct *dup_task_stru
 #endif
 	tsk->splice_pipe = NULL;
 	tsk->task_frag.page = NULL;
+	tsk->wake_q.next = NULL;
 
 	account_kernel_stack(ti, 1);
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/kernel/irq/manage.c linux-libre-4.4-gnu/kernel/irq/manage.c
--- linux-libre-4.4-rc8-gnu/kernel/irq/manage.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/kernel/irq/manage.c	2016-01-10 18:01:32.000000000 -0500
@@ -1434,6 +1434,7 @@ static struct irqaction *__free_irq(unsi
 	if (!desc)
 		return NULL;
 
+	chip_bus_lock(desc);
 	raw_spin_lock_irqsave(&desc->lock, flags);
 
 	/*
@@ -1447,7 +1448,7 @@ static struct irqaction *__free_irq(unsi
 		if (!action) {
 			WARN(1, "Trying to free already-free IRQ %d\n", irq);
 			raw_spin_unlock_irqrestore(&desc->lock, flags);
-
+			chip_bus_sync_unlock(desc);
 			return NULL;
 		}
 
@@ -1475,6 +1476,7 @@ static struct irqaction *__free_irq(unsi
 #endif
 
 	raw_spin_unlock_irqrestore(&desc->lock, flags);
+	chip_bus_sync_unlock(desc);
 
 	unregister_handler_proc(irq, action);
 
@@ -1553,9 +1555,7 @@ void free_irq(unsigned int irq, void *de
 		desc->affinity_notify = NULL;
 #endif
 
-	chip_bus_lock(desc);
 	kfree(__free_irq(irq, dev_id));
-	chip_bus_sync_unlock(desc);
 }
 EXPORT_SYMBOL(free_irq);
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/kernel/module.c linux-libre-4.4-gnu/kernel/module.c
--- linux-libre-4.4-rc8-gnu/kernel/module.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/kernel/module.c	2016-01-10 18:01:32.000000000 -0500
@@ -3571,6 +3571,12 @@ static int load_module(struct load_info
 	synchronize_sched();
 	mutex_unlock(&module_mutex);
  free_module:
+	/*
+	 * Ftrace needs to clean up what it initialized.
+	 * This does nothing if ftrace_module_init() wasn't called,
+	 * but it must be called outside of module_mutex.
+	 */
+	ftrace_release_mod(mod);
 	/* Free lock-classes; relies on the preceding sync_rcu() */
 	lockdep_free_key_range(mod->module_core, mod->core_size);
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/kernel/sched/fair.c linux-libre-4.4-gnu/kernel/sched/fair.c
--- linux-libre-4.4-rc8-gnu/kernel/sched/fair.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/kernel/sched/fair.c	2016-01-10 18:01:32.000000000 -0500
@@ -2689,7 +2689,7 @@ static inline int update_cfs_rq_load_avg
 	int decayed, removed = 0;
 
 	if (atomic_long_read(&cfs_rq->removed_load_avg)) {
-		long r = atomic_long_xchg(&cfs_rq->removed_load_avg, 0);
+		s64 r = atomic_long_xchg(&cfs_rq->removed_load_avg, 0);
 		sa->load_avg = max_t(long, sa->load_avg - r, 0);
 		sa->load_sum = max_t(s64, sa->load_sum - r * LOAD_AVG_MAX, 0);
 		removed = 1;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/kernel/trace/trace_printk.c linux-libre-4.4-gnu/kernel/trace/trace_printk.c
--- linux-libre-4.4-rc8-gnu/kernel/trace/trace_printk.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/kernel/trace/trace_printk.c	2016-01-10 18:01:32.000000000 -0500
@@ -273,6 +273,7 @@ static const char **find_next(void *v, l
 	if (*pos < last_index + start_index)
 		return __start___tracepoint_str + (*pos - last_index);
 
+	start_index += last_index;
 	return find_next_mod_format(start_index, v, fmt, pos);
 }
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/Makefile linux-libre-4.4-gnu/Makefile
--- linux-libre-4.4-rc8-gnu/Makefile	2016-01-04 10:29:25.000000000 -0500
+++ linux-libre-4.4-gnu/Makefile	2016-01-10 20:54:53.000000000 -0500
@@ -1,7 +1,7 @@
 VERSION = 4
 PATCHLEVEL = 4
 SUBLEVEL = 0
-EXTRAVERSION = -rc8-gnu
+EXTRAVERSION = -gnu
 NAME = Blurry Fish Butt
 
 # *DOCUMENTATION*
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/mm/vmstat.c linux-libre-4.4-gnu/mm/vmstat.c
--- linux-libre-4.4-rc8-gnu/mm/vmstat.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/mm/vmstat.c	2016-01-10 18:01:32.000000000 -0500
@@ -1483,6 +1483,7 @@ static void __init start_shepherd_timer(
 		BUG();
 	cpumask_copy(cpu_stat_off, cpu_online_mask);
 
+	vmstat_wq = alloc_workqueue("vmstat", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
 	schedule_delayed_work(&shepherd,
 		round_jiffies_relative(sysctl_stat_interval));
 }
@@ -1550,7 +1551,6 @@ static int __init setup_vmstat(void)
 
 	start_shepherd_timer();
 	cpu_notifier_register_done();
-	vmstat_wq = alloc_workqueue("vmstat", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
 #endif
 #ifdef CONFIG_PROC_FS
 	proc_create("buddyinfo", S_IRUGO, NULL, &fragmentation_file_operations);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/net/bridge/br_stp_if.c linux-libre-4.4-gnu/net/bridge/br_stp_if.c
--- linux-libre-4.4-rc8-gnu/net/bridge/br_stp_if.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/net/bridge/br_stp_if.c	2016-01-10 18:01:32.000000000 -0500
@@ -142,7 +142,10 @@ static void br_stp_start(struct net_brid
 	char *envp[] = { NULL };
 	struct net_bridge_port *p;
 
-	r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
+	if (net_eq(dev_net(br->dev), &init_net))
+		r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
+	else
+		r = -ENOENT;
 
 	spin_lock_bh(&br->lock);
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/net/core/dst.c linux-libre-4.4-gnu/net/core/dst.c
--- linux-libre-4.4-rc8-gnu/net/core/dst.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/net/core/dst.c	2016-01-10 18:01:32.000000000 -0500
@@ -301,12 +301,13 @@ void dst_release(struct dst_entry *dst)
 {
 	if (dst) {
 		int newrefcnt;
+		unsigned short nocache = dst->flags & DST_NOCACHE;
 
 		newrefcnt = atomic_dec_return(&dst->__refcnt);
 		if (unlikely(newrefcnt < 0))
 			net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
 					     __func__, dst, newrefcnt);
-		if (!newrefcnt && unlikely(dst->flags & DST_NOCACHE))
+		if (!newrefcnt && unlikely(nocache))
 			call_rcu(&dst->rcu_head, dst_destroy_rcu);
 	}
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/net/ipv4/raw.c linux-libre-4.4-gnu/net/ipv4/raw.c
--- linux-libre-4.4-rc8-gnu/net/ipv4/raw.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/net/ipv4/raw.c	2016-01-10 18:01:32.000000000 -0500
@@ -601,8 +601,11 @@ static int raw_sendmsg(struct sock *sk,
 			    (inet->hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),
 			   daddr, saddr, 0, 0);
 
-	if (!saddr && ipc.oif)
-		l3mdev_get_saddr(net, ipc.oif, &fl4);
+	if (!saddr && ipc.oif) {
+		err = l3mdev_get_saddr(net, ipc.oif, &fl4);
+		if (err < 0)
+			goto done;
+	}
 
 	if (!inet->hdrincl) {
 		rfv.msg = msg;
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/net/ipv4/tcp_input.c linux-libre-4.4-gnu/net/ipv4/tcp_input.c
--- linux-libre-4.4-rc8-gnu/net/ipv4/tcp_input.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/net/ipv4/tcp_input.c	2016-01-10 18:01:32.000000000 -0500
@@ -2478,6 +2478,9 @@ static void tcp_cwnd_reduction(struct so
 	int newly_acked_sacked = prior_unsacked -
 				 (tp->packets_out - tp->sacked_out);
 
+	if (newly_acked_sacked <= 0 || WARN_ON_ONCE(!tp->prior_cwnd))
+		return;
+
 	tp->prr_delivered += newly_acked_sacked;
 	if (delta < 0) {
 		u64 dividend = (u64)tp->snd_ssthresh * tp->prr_delivered +
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/net/ipv4/udp.c linux-libre-4.4-gnu/net/ipv4/udp.c
--- linux-libre-4.4-rc8-gnu/net/ipv4/udp.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/net/ipv4/udp.c	2016-01-10 18:01:32.000000000 -0500
@@ -1025,8 +1025,11 @@ int udp_sendmsg(struct sock *sk, struct
 				   flow_flags,
 				   faddr, saddr, dport, inet->inet_sport);
 
-		if (!saddr && ipc.oif)
-			l3mdev_get_saddr(net, ipc.oif, fl4);
+		if (!saddr && ipc.oif) {
+			err = l3mdev_get_saddr(net, ipc.oif, fl4);
+			if (err < 0)
+				goto out;
+		}
 
 		security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
 		rt = ip_route_output_flow(net, fl4, sk);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/net/sched/sch_generic.c linux-libre-4.4-gnu/net/sched/sch_generic.c
--- linux-libre-4.4-rc8-gnu/net/sched/sch_generic.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/net/sched/sch_generic.c	2016-01-10 18:01:32.000000000 -0500
@@ -658,8 +658,10 @@ static void qdisc_rcu_free(struct rcu_he
 {
 	struct Qdisc *qdisc = container_of(head, struct Qdisc, rcu_head);
 
-	if (qdisc_is_percpu_stats(qdisc))
+	if (qdisc_is_percpu_stats(qdisc)) {
 		free_percpu(qdisc->cpu_bstats);
+		free_percpu(qdisc->cpu_qstats);
+	}
 
 	kfree((char *) qdisc - qdisc->padded);
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/net/unix/af_unix.c linux-libre-4.4-gnu/net/unix/af_unix.c
--- linux-libre-4.4-rc8-gnu/net/unix/af_unix.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/net/unix/af_unix.c	2016-01-10 18:01:32.000000000 -0500
@@ -953,32 +953,20 @@ fail:
 	return NULL;
 }
 
-static int unix_mknod(const char *sun_path, umode_t mode, struct path *res)
+static int unix_mknod(struct dentry *dentry, struct path *path, umode_t mode,
+		      struct path *res)
 {
-	struct dentry *dentry;
-	struct path path;
-	int err = 0;
-	/*
-	 * Get the parent directory, calculate the hash for last
-	 * component.
-	 */
-	dentry = kern_path_create(AT_FDCWD, sun_path, &path, 0);
-	err = PTR_ERR(dentry);
-	if (IS_ERR(dentry))
-		return err;
+	int err;
 
-	/*
-	 * All right, let's create it.
-	 */
-	err = security_path_mknod(&path, dentry, mode, 0);
+	err = security_path_mknod(path, dentry, mode, 0);
 	if (!err) {
-		err = vfs_mknod(d_inode(path.dentry), dentry, mode, 0);
+		err = vfs_mknod(d_inode(path->dentry), dentry, mode, 0);
 		if (!err) {
-			res->mnt = mntget(path.mnt);
+			res->mnt = mntget(path->mnt);
 			res->dentry = dget(dentry);
 		}
 	}
-	done_path_create(&path, dentry);
+
 	return err;
 }
 
@@ -989,10 +977,12 @@ static int unix_bind(struct socket *sock
 	struct unix_sock *u = unix_sk(sk);
 	struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
 	char *sun_path = sunaddr->sun_path;
-	int err;
+	int err, name_err;
 	unsigned int hash;
 	struct unix_address *addr;
 	struct hlist_head *list;
+	struct path path;
+	struct dentry *dentry;
 
 	err = -EINVAL;
 	if (sunaddr->sun_family != AF_UNIX)
@@ -1008,14 +998,34 @@ static int unix_bind(struct socket *sock
 		goto out;
 	addr_len = err;
 
+	name_err = 0;
+	dentry = NULL;
+	if (sun_path[0]) {
+		/* Get the parent directory, calculate the hash for last
+		 * component.
+		 */
+		dentry = kern_path_create(AT_FDCWD, sun_path, &path, 0);
+
+		if (IS_ERR(dentry)) {
+			/* delay report until after 'already bound' check */
+			name_err = PTR_ERR(dentry);
+			dentry = NULL;
+		}
+	}
+
 	err = mutex_lock_interruptible(&u->readlock);
 	if (err)
-		goto out;
+		goto out_path;
 
 	err = -EINVAL;
 	if (u->addr)
 		goto out_up;
 
+	if (name_err) {
+		err = name_err == -EEXIST ? -EADDRINUSE : name_err;
+		goto out_up;
+	}
+
 	err = -ENOMEM;
 	addr = kmalloc(sizeof(*addr)+addr_len, GFP_KERNEL);
 	if (!addr)
@@ -1026,11 +1036,11 @@ static int unix_bind(struct socket *sock
 	addr->hash = hash ^ sk->sk_type;
 	atomic_set(&addr->refcnt, 1);
 
-	if (sun_path[0]) {
-		struct path path;
+	if (dentry) {
+		struct path u_path;
 		umode_t mode = S_IFSOCK |
 		       (SOCK_INODE(sock)->i_mode & ~current_umask());
-		err = unix_mknod(sun_path, mode, &path);
+		err = unix_mknod(dentry, &path, mode, &u_path);
 		if (err) {
 			if (err == -EEXIST)
 				err = -EADDRINUSE;
@@ -1038,9 +1048,9 @@ static int unix_bind(struct socket *sock
 			goto out_up;
 		}
 		addr->hash = UNIX_HASH_SIZE;
-		hash = d_backing_inode(path.dentry)->i_ino & (UNIX_HASH_SIZE-1);
+		hash = d_backing_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1);
 		spin_lock(&unix_table_lock);
-		u->path = path;
+		u->path = u_path;
 		list = &unix_socket_table[hash];
 	} else {
 		spin_lock(&unix_table_lock);
@@ -1063,6 +1073,10 @@ out_unlock:
 	spin_unlock(&unix_table_lock);
 out_up:
 	mutex_unlock(&u->readlock);
+out_path:
+	if (dentry)
+		done_path_create(&path, dentry);
+
 out:
 	return err;
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/scripts/recordmcount.c linux-libre-4.4-gnu/scripts/recordmcount.c
--- linux-libre-4.4-rc8-gnu/scripts/recordmcount.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/scripts/recordmcount.c	2016-01-10 18:01:32.000000000 -0500
@@ -586,7 +586,7 @@ main(int argc, char *argv[])
 			do_file(file);
 			break;
 		case SJ_FAIL:    /* error in do_file or below */
-			sprintf("%s: failed\n", file);
+			fprintf(stderr, "%s: failed\n", file);
 			++n_error;
 			break;
 		case SJ_SUCCEED:    /* premature success */
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/sound/pci/hda/patch_realtek.c linux-libre-4.4-gnu/sound/pci/hda/patch_realtek.c
--- linux-libre-4.4-rc8-gnu/sound/pci/hda/patch_realtek.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/sound/pci/hda/patch_realtek.c	2016-01-10 18:01:32.000000000 -0500
@@ -67,6 +67,10 @@ enum {
 	ALC_HEADSET_TYPE_OMTP,
 };
 
+enum {
+	ALC_KEY_MICMUTE_INDEX,
+};
+
 struct alc_customize_define {
 	unsigned int  sku_cfg;
 	unsigned char port_connectivity;
@@ -123,6 +127,7 @@ struct alc_spec {
 	unsigned int pll_coef_idx, pll_coef_bit;
 	unsigned int coef0;
 	struct input_dev *kb_dev;
+	u8 alc_mute_keycode_map[1];
 };
 
 /*
@@ -3462,12 +3467,43 @@ static void gpio2_mic_hotkey_event(struc
 
 	/* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
 	   send both key on and key off event for every interrupt. */
-	input_report_key(spec->kb_dev, KEY_MICMUTE, 1);
+	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
 	input_sync(spec->kb_dev);
-	input_report_key(spec->kb_dev, KEY_MICMUTE, 0);
+	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
 	input_sync(spec->kb_dev);
 }
 
+static int alc_register_micmute_input_device(struct hda_codec *codec)
+{
+	struct alc_spec *spec = codec->spec;
+	int i;
+
+	spec->kb_dev = input_allocate_device();
+	if (!spec->kb_dev) {
+		codec_err(codec, "Out of memory (input_allocate_device)\n");
+		return -ENOMEM;
+	}
+
+	spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
+
+	spec->kb_dev->name = "Microphone Mute Button";
+	spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
+	spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
+	spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
+	spec->kb_dev->keycode = spec->alc_mute_keycode_map;
+	for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
+		set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
+
+	if (input_register_device(spec->kb_dev)) {
+		codec_err(codec, "input_register_device failed\n");
+		input_free_device(spec->kb_dev);
+		spec->kb_dev = NULL;
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
 					     const struct hda_fixup *fix, int action)
 {
@@ -3485,20 +3521,8 @@ static void alc280_fixup_hp_gpio2_mic_ho
 	struct alc_spec *spec = codec->spec;
 
 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
-		spec->kb_dev = input_allocate_device();
-		if (!spec->kb_dev) {
-			codec_err(codec, "Out of memory (input_allocate_device)\n");
-			return;
-		}
-		spec->kb_dev->name = "Microphone Mute Button";
-		spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
-		spec->kb_dev->keybit[BIT_WORD(KEY_MICMUTE)] = BIT_MASK(KEY_MICMUTE);
-		if (input_register_device(spec->kb_dev)) {
-			codec_err(codec, "input_register_device failed\n");
-			input_free_device(spec->kb_dev);
-			spec->kb_dev = NULL;
+		if (alc_register_micmute_input_device(codec) != 0)
 			return;
-		}
 
 		snd_hda_add_verbs(codec, gpio_init);
 		snd_hda_codec_write_cache(codec, codec->core.afg, 0,
@@ -3528,6 +3552,47 @@ static void alc280_fixup_hp_gpio2_mic_ho
 	}
 }
 
+static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
+					     const struct hda_fixup *fix, int action)
+{
+	/* Line2 = mic mute hotkey
+	   GPIO2 = mic mute LED */
+	static const struct hda_verb gpio_init[] = {
+		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
+		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
+		{}
+	};
+
+	struct alc_spec *spec = codec->spec;
+
+	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
+		if (alc_register_micmute_input_device(codec) != 0)
+			return;
+
+		snd_hda_add_verbs(codec, gpio_init);
+		snd_hda_jack_detect_enable_callback(codec, 0x1b,
+						    gpio2_mic_hotkey_event);
+
+		spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
+		spec->gpio_led = 0;
+		spec->mute_led_polarity = 0;
+		spec->gpio_mic_led_mask = 0x04;
+		return;
+	}
+
+	if (!spec->kb_dev)
+		return;
+
+	switch (action) {
+	case HDA_FIXUP_ACT_PROBE:
+		spec->init_amp = ALC_INIT_DEFAULT;
+		break;
+	case HDA_FIXUP_ACT_FREE:
+		input_unregister_device(spec->kb_dev);
+		spec->kb_dev = NULL;
+	}
+}
+
 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
 				const struct hda_fixup *fix, int action)
 {
@@ -4628,6 +4693,7 @@ enum {
 	ALC275_FIXUP_DELL_XPS,
 	ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
 	ALC293_FIXUP_LENOVO_SPK_NOISE,
+	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -5237,6 +5303,10 @@ static const struct hda_fixup alc269_fix
 		.chained = true,
 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
 	},
+	[ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
+		.type = HDA_FIXUP_FUNC,
+		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,
+	},
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -5386,6 +5456,7 @@ static const struct snd_pci_quirk alc269
 	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
 	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
+	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
 	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
 	SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
 	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/sound/soc/codecs/arizona.c linux-libre-4.4-gnu/sound/soc/codecs/arizona.c
--- linux-libre-4.4-rc8-gnu/sound/soc/codecs/arizona.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/sound/soc/codecs/arizona.c	2016-01-10 18:01:32.000000000 -0500
@@ -1537,7 +1537,7 @@ static int arizona_hw_params(struct snd_
 	bool reconfig;
 	unsigned int aif_tx_state, aif_rx_state;
 
-	if (params_rate(params) % 8000)
+	if (params_rate(params) % 4000)
 		rates = &arizona_44k1_bclk_rates[0];
 	else
 		rates = &arizona_48k_bclk_rates[0];
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/sound/soc/codecs/rt5645.c linux-libre-4.4-gnu/sound/soc/codecs/rt5645.c
--- linux-libre-4.4-rc8-gnu/sound/soc/codecs/rt5645.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/sound/soc/codecs/rt5645.c	2016-01-10 18:01:32.000000000 -0500
@@ -1667,9 +1667,13 @@ static int rt5645_spk_event(struct snd_s
 			RT5645_PWR_CLS_D_L,
 			RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
 			RT5645_PWR_CLS_D_L);
+		snd_soc_update_bits(codec, RT5645_GEN_CTRL3,
+			RT5645_DET_CLK_MASK, RT5645_DET_CLK_MODE1);
 		break;
 
 	case SND_SOC_DAPM_PRE_PMD:
+		snd_soc_update_bits(codec, RT5645_GEN_CTRL3,
+			RT5645_DET_CLK_MASK, RT5645_DET_CLK_DIS);
 		snd_soc_write(codec, RT5645_EQ_CTRL2, 0);
 		snd_soc_update_bits(codec, RT5645_PWR_DIG1,
 			RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/sound/soc/codecs/rt5645.h linux-libre-4.4-gnu/sound/soc/codecs/rt5645.h
--- linux-libre-4.4-rc8-gnu/sound/soc/codecs/rt5645.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/sound/soc/codecs/rt5645.h	2016-01-10 18:01:32.000000000 -0500
@@ -2122,6 +2122,10 @@ enum {
 /* General Control3 (0xfc) */
 #define RT5645_JD_PSV_MODE			(0x1 << 12)
 #define RT5645_IRQ_CLK_GATE_CTRL		(0x1 << 11)
+#define RT5645_DET_CLK_MASK			(0x3 << 9)
+#define RT5645_DET_CLK_DIS			(0x0 << 9)
+#define RT5645_DET_CLK_MODE1			(0x1 << 9)
+#define RT5645_DET_CLK_MODE2			(0x2 << 9)
 #define RT5645_MICINDET_MANU			(0x1 << 7)
 #define RT5645_RING2_SLEEVE_GND			(0x1 << 5)
 
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/sound/soc/intel/skylake/skl.c linux-libre-4.4-gnu/sound/soc/intel/skylake/skl.c
--- linux-libre-4.4-rc8-gnu/sound/soc/intel/skylake/skl.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/sound/soc/intel/skylake/skl.c	2016-01-10 18:01:32.000000000 -0500
@@ -25,6 +25,7 @@
 #include <linux/pci.h>
 #include <linux/pm_runtime.h>
 #include <linux/platform_device.h>
+#include <linux/firmware.h>
 #include <sound/pcm.h>
 #include "skl.h"
 
@@ -520,6 +521,9 @@ static void skl_remove(struct pci_dev *p
 	struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
 	struct skl *skl = ebus_to_skl(ebus);
 
+	if (skl->tplg)
+		release_firmware(skl->tplg);
+
 	if (pci_dev_run_wake(pci))
 		pm_runtime_get_noresume(&pci->dev);
 	pci_dev_put(pci);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/sound/soc/intel/skylake/skl.h linux-libre-4.4-gnu/sound/soc/intel/skylake/skl.h
--- linux-libre-4.4-rc8-gnu/sound/soc/intel/skylake/skl.h	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/sound/soc/intel/skylake/skl.h	2016-01-10 18:01:32.000000000 -0500
@@ -68,6 +68,8 @@ struct skl {
 	struct skl_dsp_resource resource;
 	struct list_head ppl_list;
 	struct list_head dapm_path_list;
+
+	const struct firmware *tplg;
 };
 
 #define skl_to_ebus(s)	(&(s)->ebus)
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/sound/soc/intel/skylake/skl-topology.c linux-libre-4.4-gnu/sound/soc/intel/skylake/skl-topology.c
--- linux-libre-4.4-rc8-gnu/sound/soc/intel/skylake/skl-topology.c	2016-01-04 10:53:46.000000000 -0500
+++ linux-libre-4.4-gnu/sound/soc/intel/skylake/skl-topology.c	2016-01-10 21:18:23.000000000 -0500
@@ -1240,7 +1240,6 @@ int skl_tplg_init(struct snd_soc_platfor
 	 */
 	ret = snd_soc_tplg_component_load(&platform->component,
 					&skl_tplg_ops, fw, 0);
-	release_firmware(fw);
 	if (ret < 0) {
 		dev_err(bus->dev, "tplg component load failed%d\n", ret);
 		return -EINVAL;
@@ -1249,5 +1248,7 @@ int skl_tplg_init(struct snd_soc_platfor
 	skl->resource.max_mcps = SKL_MAX_MCPS;
 	skl->resource.max_mem = SKL_FW_MAX_MEM;
 
+	skl->tplg = fw;
+
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/tools/perf/builtin-buildid-list.c linux-libre-4.4-gnu/tools/perf/builtin-buildid-list.c
--- linux-libre-4.4-rc8-gnu/tools/perf/builtin-buildid-list.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/tools/perf/builtin-buildid-list.c	2016-01-10 18:01:32.000000000 -0500
@@ -110,7 +110,7 @@ int cmd_buildid_list(int argc, const cha
 	setup_pager();
 
 	if (show_kernel)
-		return sysfs__fprintf_build_id(stdout);
+		return !(sysfs__fprintf_build_id(stdout) > 0);
 
 	return perf_session__list_build_ids(force, with_hits);
 }
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/tools/perf/ui/browsers/hists.c linux-libre-4.4-gnu/tools/perf/ui/browsers/hists.c
--- linux-libre-4.4-rc8-gnu/tools/perf/ui/browsers/hists.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/tools/perf/ui/browsers/hists.c	2016-01-10 18:01:32.000000000 -0500
@@ -298,6 +298,9 @@ static bool hist_browser__toggle_fold(st
 	struct callchain_list *cl = container_of(ms, struct callchain_list, ms);
 	bool has_children;
 
+	if (!he || !ms)
+		return false;
+
 	if (ms == &he->ms)
 		has_children = hist_entry__toggle_fold(he);
 	else
@@ -928,6 +931,8 @@ static unsigned int hist_browser__refres
 	}
 
 	ui_browser__hists_init_top(browser);
+	hb->he_selection = NULL;
+	hb->selection = NULL;
 
 	for (nd = browser->top; nd; nd = rb_next(nd)) {
 		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
@@ -1033,6 +1038,9 @@ static void ui_browser__hists_seek(struc
 	 * and stop when we printed enough lines to fill the screen.
 	 */
 do_offset:
+	if (!nd)
+		return;
+
 	if (offset > 0) {
 		do {
 			h = rb_entry(nd, struct hist_entry, rb_node);
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/tools/perf/util/build-id.c linux-libre-4.4-gnu/tools/perf/util/build-id.c
--- linux-libre-4.4-rc8-gnu/tools/perf/util/build-id.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/tools/perf/util/build-id.c	2016-01-10 18:01:32.000000000 -0500
@@ -91,7 +91,7 @@ int build_id__sprintf(const u8 *build_id
 		bid += 2;
 	}
 
-	return raw - build_id;
+	return (bid - bf) + 1;
 }
 
 int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
diff -druNp --no-dereference linux-libre-4.4-rc8-gnu/tools/perf/util/parse-events.c linux-libre-4.4-gnu/tools/perf/util/parse-events.c
--- linux-libre-4.4-rc8-gnu/tools/perf/util/parse-events.c	2016-01-03 18:15:37.000000000 -0500
+++ linux-libre-4.4-gnu/tools/perf/util/parse-events.c	2016-01-10 18:01:32.000000000 -0500
@@ -124,6 +124,10 @@ struct event_symbol event_symbols_sw[PER
 		.symbol = "dummy",
 		.alias  = "",
 	},
+	[PERF_COUNT_SW_BPF_OUTPUT] = {
+		.symbol = "bpf-output",
+		.alias  = "",
+	},
 };
 
 #define __PERF_EVENT_FIELD(config, name) \
@@ -1879,7 +1883,7 @@ restart:
 
 	for (i = 0; i < max; i++, syms++) {
 
-		if (event_glob != NULL &&
+		if (event_glob != NULL && syms->symbol != NULL &&
 		    !(strglobmatch(syms->symbol, event_glob) ||
 		      (syms->alias && strglobmatch(syms->alias, event_glob))))
 			continue;
