diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/arch/arm/include/asm/cacheflush.h linux-libre-3.17-gnu/arch/arm/include/asm/cacheflush.h
--- linux-libre-3.17-rc7-gnu/arch/arm/include/asm/cacheflush.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/arch/arm/include/asm/cacheflush.h	2014-10-05 15:23:04.000000000 -0400
@@ -466,6 +466,7 @@ static inline void __sync_cache_range_r(
  */
 #define v7_exit_coherency_flush(level) \
 	asm volatile( \
+	".arch	armv7-a \n\t" \
 	"stmfd	sp!, {fp, ip} \n\t" \
 	"mrc	p15, 0, r0, c1, c0, 0	@ get SCTLR \n\t" \
 	"bic	r0, r0, #"__stringify(CR_C)" \n\t" \
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/arch/arm/include/asm/tls.h linux-libre-3.17-gnu/arch/arm/include/asm/tls.h
--- linux-libre-3.17-rc7-gnu/arch/arm/include/asm/tls.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/arch/arm/include/asm/tls.h	2014-10-05 15:23:04.000000000 -0400
@@ -81,6 +81,7 @@ static inline void set_tls(unsigned long
 			asm("mcr p15, 0, %0, c13, c0, 3"
 			    : : "r" (val));
 		} else {
+#ifdef CONFIG_KUSER_HELPERS
 			/*
 			 * User space must never try to access this
 			 * directly.  Expect your app to break
@@ -89,6 +90,7 @@ static inline void set_tls(unsigned long
 			 * entry-armv.S for details)
 			 */
 			*((unsigned int *)0xffff0ff0) = val;
+#endif
 		}
 
 	}
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/arch/arm/kernel/kprobes-test.c linux-libre-3.17-gnu/arch/arm/kernel/kprobes-test.c
--- linux-libre-3.17-rc7-gnu/arch/arm/kernel/kprobes-test.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/arch/arm/kernel/kprobes-test.c	2014-10-05 15:23:04.000000000 -0400
@@ -110,10 +110,13 @@
  *
  *	@ TESTCASE_START
  *	bl	__kprobes_test_case_start
- *	@ start of inline data...
+ *	.pushsection .rodata
+ *	"10:
  *	.ascii "mov r0, r7"	@ text title for test case
  *	.byte	0
- *	.align	2, 0
+ *	.popsection
+ *	@ start of inline data...
+ *	.word	10b		@ pointer to title in .rodata section
  *
  *	@ TEST_ARG_REG
  *	.byte	ARG_TYPE_REG
@@ -971,7 +974,7 @@ void __naked __kprobes_test_case_start(v
 	__asm__ __volatile__ (
 		"stmdb	sp!, {r4-r11}				\n\t"
 		"sub	sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
-		"bic	r0, lr, #1  @ r0 = inline title string	\n\t"
+		"bic	r0, lr, #1  @ r0 = inline data		\n\t"
 		"mov	r1, sp					\n\t"
 		"bl	kprobes_test_case_start			\n\t"
 		"bx	r0					\n\t"
@@ -1349,15 +1352,14 @@ static unsigned long next_instruction(un
 	return pc + 4;
 }
 
-static uintptr_t __used kprobes_test_case_start(const char *title, void *stack)
+static uintptr_t __used kprobes_test_case_start(const char **title, void *stack)
 {
 	struct test_arg *args;
 	struct test_arg_end *end_arg;
 	unsigned long test_code;
 
-	args = (struct test_arg *)PTR_ALIGN(title + strlen(title) + 1, 4);
-
-	current_title = title;
+	current_title = *title++;
+	args = (struct test_arg *)title;
 	current_args = args;
 	current_stack = stack;
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/arch/arm/kernel/kprobes-test.h linux-libre-3.17-gnu/arch/arm/kernel/kprobes-test.h
--- linux-libre-3.17-rc7-gnu/arch/arm/kernel/kprobes-test.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/arch/arm/kernel/kprobes-test.h	2014-10-05 15:23:04.000000000 -0400
@@ -111,11 +111,14 @@ struct test_arg_end {
 #define TESTCASE_START(title)					\
 	__asm__ __volatile__ (					\
 	"bl	__kprobes_test_case_start		\n\t"	\
+	".pushsection .rodata				\n\t"	\
+	"10:						\n\t"	\
 	/* don't use .asciz here as 'title' may be */		\
 	/* multiple strings to be concatenated.  */		\
 	".ascii "#title"				\n\t"	\
 	".byte	0					\n\t"	\
-	".align	2, 0					\n\t"
+	".popsection					\n\t"	\
+	".word	10b					\n\t"
 
 #define	TEST_ARG_REG(reg, val)					\
 	".byte	"__stringify(ARG_TYPE_REG)"		\n\t"	\
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/arch/arm/mm/alignment.c linux-libre-3.17-gnu/arch/arm/mm/alignment.c
--- linux-libre-3.17-rc7-gnu/arch/arm/mm/alignment.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/arch/arm/mm/alignment.c	2014-10-05 15:23:04.000000000 -0400
@@ -41,6 +41,7 @@
  * This code is not portable to processors with late data abort handling.
  */
 #define CODING_BITS(i)	(i & 0x0e000000)
+#define COND_BITS(i)	(i & 0xf0000000)
 
 #define LDST_I_BIT(i)	(i & (1 << 26))		/* Immediate constant	*/
 #define LDST_P_BIT(i)	(i & (1 << 24))		/* Preindex		*/
@@ -821,6 +822,8 @@ do_alignment(unsigned long addr, unsigne
 		break;
 
 	case 0x04000000:	/* ldr or str immediate */
+		if (COND_BITS(instr) == 0xf0000000) /* NEON VLDn, VSTn */
+			goto bad;
 		offset.un = OFFSET_BITS(instr);
 		handler = do_alignment_ldrstr;
 		break;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/arch/arm/mm/proc-v7-3level.S linux-libre-3.17-gnu/arch/arm/mm/proc-v7-3level.S
--- linux-libre-3.17-rc7-gnu/arch/arm/mm/proc-v7-3level.S	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/arch/arm/mm/proc-v7-3level.S	2014-10-05 15:23:04.000000000 -0400
@@ -157,9 +157,9 @@ ENDPROC(cpu_v7_set_pte_ext)
 	 *  TFR   EV X F   IHD LR    S
 	 * .EEE ..EE PUI. .TAT 4RVI ZWRS BLDP WCAM
 	 * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced
-	 *   11    0 110    1  0011 1100 .111 1101 < we want
+	 *   11    0 110    0  0011 1100 .111 1101 < we want
 	 */
 	.align	2
 	.type	v7_crval, #object
 v7_crval:
-	crval	clear=0x0120c302, mmuset=0x30c23c7d, ucset=0x00c01c7c
+	crval	clear=0x0122c302, mmuset=0x30c03c7d, ucset=0x00c01c7c
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/cpufreq/cpufreq.c linux-libre-3.17-gnu/drivers/cpufreq/cpufreq.c
--- linux-libre-3.17-rc7-gnu/drivers/cpufreq/cpufreq.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/cpufreq/cpufreq.c	2014-10-05 15:23:04.000000000 -0400
@@ -1658,10 +1658,8 @@ void cpufreq_suspend(void)
 	if (!cpufreq_driver)
 		return;
 
-	cpufreq_suspended = true;
-
 	if (!has_target())
-		return;
+		goto suspend;
 
 	pr_debug("%s: Suspending Governors\n", __func__);
 
@@ -1674,6 +1672,9 @@ void cpufreq_suspend(void)
 			pr_err("%s: Failed to suspend driver: %p\n", __func__,
 				policy);
 	}
+
+suspend:
+	cpufreq_suspended = true;
 }
 
 /**
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/cpufreq/integrator-cpufreq.c linux-libre-3.17-gnu/drivers/cpufreq/integrator-cpufreq.c
--- linux-libre-3.17-rc7-gnu/drivers/cpufreq/integrator-cpufreq.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/cpufreq/integrator-cpufreq.c	2014-10-05 15:23:04.000000000 -0400
@@ -213,9 +213,9 @@ static int __init integrator_cpufreq_pro
 	return cpufreq_register_driver(&integrator_driver);
 }
 
-static void __exit integrator_cpufreq_remove(struct platform_device *pdev)
+static int __exit integrator_cpufreq_remove(struct platform_device *pdev)
 {
-	cpufreq_unregister_driver(&integrator_driver);
+	return cpufreq_unregister_driver(&integrator_driver);
 }
 
 static const struct of_device_id integrator_cpufreq_match[] = {
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/cpufreq/pcc-cpufreq.c linux-libre-3.17-gnu/drivers/cpufreq/pcc-cpufreq.c
--- linux-libre-3.17-rc7-gnu/drivers/cpufreq/pcc-cpufreq.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/cpufreq/pcc-cpufreq.c	2014-10-05 15:23:04.000000000 -0400
@@ -204,7 +204,6 @@ static int pcc_cpufreq_target(struct cpu
 	u32 input_buffer;
 	int cpu;
 
-	spin_lock(&pcc_lock);
 	cpu = policy->cpu;
 	pcc_cpu_data = per_cpu_ptr(pcc_cpu_info, cpu);
 
@@ -216,6 +215,7 @@ static int pcc_cpufreq_target(struct cpu
 	freqs.old = policy->cur;
 	freqs.new = target_freq;
 	cpufreq_freq_transition_begin(policy, &freqs);
+	spin_lock(&pcc_lock);
 
 	input_buffer = 0x1 | (((target_freq * 100)
 			       / (ioread32(&pcch_hdr->nominal) * 1000)) << 8);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c linux-libre-3.17-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/i915/i915_gem_gtt.c	2014-10-05 15:23:04.000000000 -0400
@@ -1310,6 +1310,16 @@ void i915_check_and_clear_faults(struct
 	POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS]));
 }
 
+static void i915_ggtt_flush(struct drm_i915_private *dev_priv)
+{
+	if (INTEL_INFO(dev_priv->dev)->gen < 6) {
+		intel_gtt_chipset_flush();
+	} else {
+		I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
+		POSTING_READ(GFX_FLSH_CNTL_GEN6);
+	}
+}
+
 void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1326,6 +1336,8 @@ void i915_gem_suspend_gtt_mappings(struc
 				       dev_priv->gtt.base.start,
 				       dev_priv->gtt.base.total,
 				       true);
+
+	i915_ggtt_flush(dev_priv);
 }
 
 void i915_gem_restore_gtt_mappings(struct drm_device *dev)
@@ -1378,7 +1390,7 @@ void i915_gem_restore_gtt_mappings(struc
 		gen6_write_pdes(container_of(vm, struct i915_hw_ppgtt, base));
 	}
 
-	i915_gem_chipset_flush(dev);
+	i915_ggtt_flush(dev_priv);
 }
 
 int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj)
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/i915/intel_opregion.c linux-libre-3.17-gnu/drivers/gpu/drm/i915/intel_opregion.c
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/i915/intel_opregion.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/i915/intel_opregion.c	2014-10-05 15:23:04.000000000 -0400
@@ -396,6 +396,16 @@ int intel_opregion_notify_adapter(struct
 	return -EINVAL;
 }
 
+/*
+ * If the vendor backlight interface is not in use and ACPI backlight interface
+ * is broken, do not bother processing backlight change requests from firmware.
+ */
+static bool should_ignore_backlight_request(void)
+{
+	return acpi_video_backlight_support() &&
+	       !acpi_video_verify_backlight_support();
+}
+
 static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
@@ -404,11 +414,7 @@ static u32 asle_set_backlight(struct drm
 
 	DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
 
-	/*
-	 * If the acpi_video interface is not supposed to be used, don't
-	 * bother processing backlight level change requests from firmware.
-	 */
-	if (!acpi_video_verify_backlight_support()) {
+	if (should_ignore_backlight_request()) {
 		DRM_DEBUG_KMS("opregion backlight request ignored\n");
 		return 0;
 	}
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c	2014-10-05 15:23:04.000000000 -0400
@@ -1763,9 +1763,10 @@ nv50_disp_intr_unk40_0_tmds(struct nv50_
 	const int   or = ffs(outp->or) - 1;
 	const u32 loff = (or * 0x800) + (link * 0x80);
 	const u16 mask = (outp->sorconf.link << 6) | outp->or;
+	struct dcb_output match;
 	u8  ver, hdr;
 
-	if (dcb_outp_match(bios, DCB_OUTPUT_DP, mask, &ver, &hdr, outp))
+	if (dcb_outp_match(bios, DCB_OUTPUT_DP, mask, &ver, &hdr, &match))
 		nv_mask(priv, 0x61c10c + loff, 0x00000001, 0x00000000);
 }
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_chan.c linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_chan.c
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_chan.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_chan.c	2014-10-05 15:23:04.000000000 -0400
@@ -285,6 +285,7 @@ nouveau_channel_init(struct nouveau_chan
 	struct nouveau_software_chan *swch;
 	struct nv_dma_v0 args = {};
 	int ret, i;
+	bool save;
 
 	nvif_object_map(chan->object);
 
@@ -386,7 +387,11 @@ nouveau_channel_init(struct nouveau_chan
 	}
 
 	/* initialise synchronisation */
-	return nouveau_fence(chan->drm)->context_new(chan);
+	save = cli->base.super;
+	cli->base.super = true; /* hack until fencenv50 fixed */
+	ret = nouveau_fence(chan->drm)->context_new(chan);
+	cli->base.super = save;
+	return ret;
 }
 
 int
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_display.c linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_display.c
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_display.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_display.c	2014-10-05 15:23:04.000000000 -0400
@@ -550,14 +550,12 @@ nouveau_display_destroy(struct drm_devic
 }
 
 int
-nouveau_display_suspend(struct drm_device *dev)
+nouveau_display_suspend(struct drm_device *dev, bool runtime)
 {
-	struct nouveau_drm *drm = nouveau_drm(dev);
 	struct drm_crtc *crtc;
 
 	nouveau_display_fini(dev);
 
-	NV_INFO(drm, "unpinning framebuffer(s)...\n");
 	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
 		struct nouveau_framebuffer *nouveau_fb;
 
@@ -579,12 +577,13 @@ nouveau_display_suspend(struct drm_devic
 }
 
 void
-nouveau_display_repin(struct drm_device *dev)
+nouveau_display_resume(struct drm_device *dev, bool runtime)
 {
 	struct nouveau_drm *drm = nouveau_drm(dev);
 	struct drm_crtc *crtc;
-	int ret;
+	int ret, head;
 
+	/* re-pin fb/cursors */
 	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
 		struct nouveau_framebuffer *nouveau_fb;
 
@@ -606,13 +605,6 @@ nouveau_display_repin(struct drm_device
 		if (ret)
 			NV_ERROR(drm, "Could not pin/map cursor.\n");
 	}
-}
-
-void
-nouveau_display_resume(struct drm_device *dev)
-{
-	struct drm_crtc *crtc;
-	int head;
 
 	nouveau_display_init(dev);
 
@@ -627,6 +619,13 @@ nouveau_display_resume(struct drm_device
 	for (head = 0; head < dev->mode_config.num_crtc; head++)
 		drm_vblank_on(dev, head);
 
+	/* This should ensure we don't hit a locking problem when someone
+	 * wakes us up via a connector.  We should never go into suspend
+	 * while the display is on anyways.
+	 */
+	if (runtime)
+		return;
+
 	drm_helper_resume_force_mode(dev);
 
 	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_display.h linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_display.h
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_display.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_display.h	2014-10-05 15:23:04.000000000 -0400
@@ -63,9 +63,8 @@ int  nouveau_display_create(struct drm_d
 void nouveau_display_destroy(struct drm_device *dev);
 int  nouveau_display_init(struct drm_device *dev);
 void nouveau_display_fini(struct drm_device *dev);
-int  nouveau_display_suspend(struct drm_device *dev);
-void nouveau_display_repin(struct drm_device *dev);
-void nouveau_display_resume(struct drm_device *dev);
+int  nouveau_display_suspend(struct drm_device *dev, bool runtime);
+void nouveau_display_resume(struct drm_device *dev, bool runtime);
 int  nouveau_display_vblank_enable(struct drm_device *, int);
 void nouveau_display_vblank_disable(struct drm_device *, int);
 int  nouveau_display_scanoutpos(struct drm_device *, int, unsigned int,
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_drm.c	2014-10-05 15:23:04.000000000 -0400
@@ -547,9 +547,11 @@ nouveau_do_suspend(struct drm_device *de
 	struct nouveau_cli *cli;
 	int ret;
 
-	if (dev->mode_config.num_crtc && !runtime) {
+	if (dev->mode_config.num_crtc) {
+		NV_INFO(drm, "suspending console...\n");
+		nouveau_fbcon_set_suspend(dev, 1);
 		NV_INFO(drm, "suspending display...\n");
-		ret = nouveau_display_suspend(dev);
+		ret = nouveau_display_suspend(dev, runtime);
 		if (ret)
 			return ret;
 	}
@@ -603,7 +605,7 @@ fail_client:
 fail_display:
 	if (dev->mode_config.num_crtc) {
 		NV_INFO(drm, "resuming display...\n");
-		nouveau_display_resume(dev);
+		nouveau_display_resume(dev, runtime);
 	}
 	return ret;
 }
@@ -618,9 +620,6 @@ int nouveau_pmops_suspend(struct device
 	    drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
 		return 0;
 
-	if (drm_dev->mode_config.num_crtc)
-		nouveau_fbcon_set_suspend(drm_dev, 1);
-
 	ret = nouveau_do_suspend(drm_dev, false);
 	if (ret)
 		return ret;
@@ -633,7 +632,7 @@ int nouveau_pmops_suspend(struct device
 }
 
 static int
-nouveau_do_resume(struct drm_device *dev)
+nouveau_do_resume(struct drm_device *dev, bool runtime)
 {
 	struct nouveau_drm *drm = nouveau_drm(dev);
 	struct nouveau_cli *cli;
@@ -658,7 +657,9 @@ nouveau_do_resume(struct drm_device *dev
 
 	if (dev->mode_config.num_crtc) {
 		NV_INFO(drm, "resuming display...\n");
-		nouveau_display_repin(dev);
+		nouveau_display_resume(dev, runtime);
+		NV_INFO(drm, "resuming console...\n");
+		nouveau_fbcon_set_suspend(dev, 0);
 	}
 
 	return 0;
@@ -681,47 +682,21 @@ int nouveau_pmops_resume(struct device *
 		return ret;
 	pci_set_master(pdev);
 
-	ret = nouveau_do_resume(drm_dev);
-	if (ret)
-		return ret;
-
-	if (drm_dev->mode_config.num_crtc) {
-		nouveau_display_resume(drm_dev);
-		nouveau_fbcon_set_suspend(drm_dev, 0);
-	}
-
-	return 0;
+	return nouveau_do_resume(drm_dev, false);
 }
 
 static int nouveau_pmops_freeze(struct device *dev)
 {
 	struct pci_dev *pdev = to_pci_dev(dev);
 	struct drm_device *drm_dev = pci_get_drvdata(pdev);
-	int ret;
-
-	if (drm_dev->mode_config.num_crtc)
-		nouveau_fbcon_set_suspend(drm_dev, 1);
-
-	ret = nouveau_do_suspend(drm_dev, false);
-	return ret;
+	return nouveau_do_suspend(drm_dev, false);
 }
 
 static int nouveau_pmops_thaw(struct device *dev)
 {
 	struct pci_dev *pdev = to_pci_dev(dev);
 	struct drm_device *drm_dev = pci_get_drvdata(pdev);
-	int ret;
-
-	ret = nouveau_do_resume(drm_dev);
-	if (ret)
-		return ret;
-
-	if (drm_dev->mode_config.num_crtc) {
-		nouveau_display_resume(drm_dev);
-		nouveau_fbcon_set_suspend(drm_dev, 0);
-	}
-
-	return 0;
+	return nouveau_do_resume(drm_dev, false);
 }
 
 
@@ -977,7 +952,7 @@ static int nouveau_pmops_runtime_resume(
 		return ret;
 	pci_set_master(pdev);
 
-	ret = nouveau_do_resume(drm_dev);
+	ret = nouveau_do_resume(drm_dev, true);
 	drm_kms_helper_poll_enable(drm_dev);
 	/* do magic */
 	nvif_mask(device, 0x88488, (1 << 25), (1 << 25));
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.c linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.c
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.c	2014-10-05 15:23:04.000000000 -0400
@@ -486,6 +486,16 @@ static const struct drm_fb_helper_funcs
 	.fb_probe = nouveau_fbcon_create,
 };
 
+static void
+nouveau_fbcon_set_suspend_work(struct work_struct *work)
+{
+	struct nouveau_fbdev *fbcon = container_of(work, typeof(*fbcon), work);
+	console_lock();
+	nouveau_fbcon_accel_restore(fbcon->dev);
+	nouveau_fbcon_zfill(fbcon->dev, fbcon);
+	fb_set_suspend(fbcon->helper.fbdev, FBINFO_STATE_RUNNING);
+	console_unlock();
+}
 
 int
 nouveau_fbcon_init(struct drm_device *dev)
@@ -503,6 +513,7 @@ nouveau_fbcon_init(struct drm_device *de
 	if (!fbcon)
 		return -ENOMEM;
 
+	INIT_WORK(&fbcon->work, nouveau_fbcon_set_suspend_work);
 	fbcon->dev = dev;
 	drm->fbcon = fbcon;
 
@@ -551,14 +562,14 @@ nouveau_fbcon_set_suspend(struct drm_dev
 {
 	struct nouveau_drm *drm = nouveau_drm(dev);
 	if (drm->fbcon) {
-		console_lock();
-		if (state == 0) {
-			nouveau_fbcon_accel_restore(dev);
-			nouveau_fbcon_zfill(dev, drm->fbcon);
+		if (state == FBINFO_STATE_RUNNING) {
+			schedule_work(&drm->fbcon->work);
+			return;
 		}
+		flush_work(&drm->fbcon->work);
+		console_lock();
 		fb_set_suspend(drm->fbcon->helper.fbdev, state);
-		if (state == 1)
-			nouveau_fbcon_accel_save_disable(dev);
+		nouveau_fbcon_accel_save_disable(dev);
 		console_unlock();
 	}
 }
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.h linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.h
--- linux-libre-3.17-rc7-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/gpu/drm/nouveau/nouveau_fbcon.h	2014-10-05 15:23:04.000000000 -0400
@@ -36,6 +36,7 @@ struct nouveau_fbdev {
 	struct nouveau_framebuffer nouveau_fb;
 	struct list_head fbdev_list;
 	struct drm_device *dev;
+	struct work_struct work;
 	unsigned int saved_flags;
 	struct nvif_object surf2d;
 	struct nvif_object clip;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/i2c/busses/i2c-qup.c linux-libre-3.17-gnu/drivers/i2c/busses/i2c-qup.c
--- linux-libre-3.17-rc7-gnu/drivers/i2c/busses/i2c-qup.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/i2c/busses/i2c-qup.c	2014-10-05 15:23:04.000000000 -0400
@@ -674,16 +674,20 @@ static int qup_i2c_probe(struct platform
 	qup->adap.dev.of_node = pdev->dev.of_node;
 	strlcpy(qup->adap.name, "QUP I2C adapter", sizeof(qup->adap.name));
 
-	ret = i2c_add_adapter(&qup->adap);
-	if (ret)
-		goto fail;
-
 	pm_runtime_set_autosuspend_delay(qup->dev, MSEC_PER_SEC);
 	pm_runtime_use_autosuspend(qup->dev);
 	pm_runtime_set_active(qup->dev);
 	pm_runtime_enable(qup->dev);
+
+	ret = i2c_add_adapter(&qup->adap);
+	if (ret)
+		goto fail_runtime;
+
 	return 0;
 
+fail_runtime:
+	pm_runtime_disable(qup->dev);
+	pm_runtime_set_suspended(qup->dev);
 fail:
 	qup_i2c_disable_clocks(qup);
 	return ret;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/i2c/busses/i2c-rk3x.c linux-libre-3.17-gnu/drivers/i2c/busses/i2c-rk3x.c
--- linux-libre-3.17-rc7-gnu/drivers/i2c/busses/i2c-rk3x.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/i2c/busses/i2c-rk3x.c	2014-10-05 15:23:04.000000000 -0400
@@ -238,7 +238,7 @@ static void rk3x_i2c_fill_transmit_buf(s
 	for (i = 0; i < 8; ++i) {
 		val = 0;
 		for (j = 0; j < 4; ++j) {
-			if (i2c->processed == i2c->msg->len)
+			if ((i2c->processed == i2c->msg->len) && (cnt != 0))
 				break;
 
 			if (i2c->processed == 0 && cnt == 0)
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/md/raid5.c linux-libre-3.17-gnu/drivers/md/raid5.c
--- linux-libre-3.17-rc7-gnu/drivers/md/raid5.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/md/raid5.c	2014-10-05 15:23:04.000000000 -0400
@@ -64,6 +64,10 @@
 #define cpu_to_group(cpu) cpu_to_node(cpu)
 #define ANY_GROUP NUMA_NO_NODE
 
+static bool devices_handle_discard_safely = false;
+module_param(devices_handle_discard_safely, bool, 0644);
+MODULE_PARM_DESC(devices_handle_discard_safely,
+		 "Set to Y if all devices in each array reliably return zeroes on reads from discarded regions");
 static struct workqueue_struct *raid5_wq;
 /*
  * Stripe cache
@@ -6208,7 +6212,7 @@ static int run(struct mddev *mddev)
 		mddev->queue->limits.discard_granularity = stripe;
 		/*
 		 * unaligned part of discard request will be ignored, so can't
-		 * guarantee discard_zerors_data
+		 * guarantee discard_zeroes_data
 		 */
 		mddev->queue->limits.discard_zeroes_data = 0;
 
@@ -6233,6 +6237,18 @@ static int run(struct mddev *mddev)
 			    !bdev_get_queue(rdev->bdev)->
 						limits.discard_zeroes_data)
 				discard_supported = false;
+			/* Unfortunately, discard_zeroes_data is not currently
+			 * a guarantee - just a hint.  So we only allow DISCARD
+			 * if the sysadmin has confirmed that only safe devices
+			 * are in use by setting a module parameter.
+			 */
+			if (!devices_handle_discard_safely) {
+				if (discard_supported) {
+					pr_info("md/raid456: discard support disabled due to uncertainty.\n");
+					pr_info("Set raid456.devices_handle_discard_safely=Y to override.\n");
+				}
+				discard_supported = false;
+			}
 		}
 
 		if (discard_supported &&
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/media/usb/em28xx/em28xx-cards.c linux-libre-3.17-gnu/drivers/media/usb/em28xx/em28xx-cards.c
--- linux-libre-3.17-rc7-gnu/drivers/media/usb/em28xx/em28xx-cards.c	2014-09-28 21:27:55.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/media/usb/em28xx/em28xx-cards.c	2014-10-05 16:45:00.000000000 -0400
@@ -3524,6 +3524,7 @@ static struct usb_driver em28xx_usb_driv
 	.disconnect = em28xx_usb_disconnect,
 	.suspend = em28xx_usb_suspend,
 	.resume = em28xx_usb_resume,
+	.reset_resume = em28xx_usb_resume,
 	.id_table = em28xx_id_table,
 };
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/broadcom/bnx2.c linux-libre-3.17-gnu/drivers/net/ethernet/broadcom/bnx2.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/broadcom/bnx2.c	2014-09-28 21:33:01.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/broadcom/bnx2.c	2014-10-05 16:49:37.000000000 -0400
@@ -3232,8 +3232,9 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2
 
 		skb->protocol = eth_type_trans(skb, bp->dev);
 
-		if ((len > (bp->dev->mtu + ETH_HLEN)) &&
-			(ntohs(skb->protocol) != 0x8100)) {
+		if (len > (bp->dev->mtu + ETH_HLEN) &&
+		    skb->protocol != htons(0x8100) &&
+		    skb->protocol != htons(ETH_P_8021AD)) {
 
 			dev_kfree_skb(skb);
 			goto next_rx;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/broadcom/tg3.c linux-libre-3.17-gnu/drivers/net/ethernet/broadcom/tg3.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/broadcom/tg3.c	2014-09-28 21:34:39.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/broadcom/tg3.c	2014-10-05 16:51:04.000000000 -0400
@@ -6909,7 +6909,8 @@ static int tg3_rx(struct tg3_napi *tnapi
 		skb->protocol = eth_type_trans(skb, tp->dev);
 
 		if (len > (tp->dev->mtu + ETH_HLEN) &&
-		    skb->protocol != htons(ETH_P_8021Q)) {
+		    skb->protocol != htons(ETH_P_8021Q) &&
+		    skb->protocol != htons(ETH_P_8021AD)) {
 			dev_kfree_skb_any(skb);
 			goto drop_it_no_recycle;
 		}
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/cadence/macb.c linux-libre-3.17-gnu/drivers/net/ethernet/cadence/macb.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/cadence/macb.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/cadence/macb.c	2014-10-05 15:23:04.000000000 -0400
@@ -30,7 +30,6 @@
 #include <linux/of_device.h>
 #include <linux/of_mdio.h>
 #include <linux/of_net.h>
-#include <linux/pinctrl/consumer.h>
 
 #include "macb.h"
 
@@ -2071,7 +2070,6 @@ static int __init macb_probe(struct plat
 	struct phy_device *phydev;
 	u32 config;
 	int err = -ENXIO;
-	struct pinctrl *pinctrl;
 	const char *mac;
 
 	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -2080,15 +2078,6 @@ static int __init macb_probe(struct plat
 		goto err_out;
 	}
 
-	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
-	if (IS_ERR(pinctrl)) {
-		err = PTR_ERR(pinctrl);
-		if (err == -EPROBE_DEFER)
-			goto err_out;
-
-		dev_warn(&pdev->dev, "No pinctrl provided\n");
-	}
-
 	err = -ENOMEM;
 	dev = alloc_etherdev(sizeof(*bp));
 	if (!dev)
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/mellanox/mlx4/main.c linux-libre-3.17-gnu/drivers/net/ethernet/mellanox/mlx4/main.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2014-10-05 15:23:04.000000000 -0400
@@ -78,13 +78,13 @@ MODULE_PARM_DESC(msi_x, "attempt to use
 #endif /* CONFIG_PCI_MSI */
 
 static uint8_t num_vfs[3] = {0, 0, 0};
-static int num_vfs_argc = 3;
+static int num_vfs_argc;
 module_param_array(num_vfs, byte , &num_vfs_argc, 0444);
 MODULE_PARM_DESC(num_vfs, "enable #num_vfs functions if num_vfs > 0\n"
 			  "num_vfs=port1,port2,port1+2");
 
 static uint8_t probe_vf[3] = {0, 0, 0};
-static int probe_vfs_argc = 3;
+static int probe_vfs_argc;
 module_param_array(probe_vf, byte, &probe_vfs_argc, 0444);
 MODULE_PARM_DESC(probe_vf, "number of vfs to probe by pf driver (num_vfs > 0)\n"
 			   "probe_vf=port1,port2,port1+2");
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c	2014-09-28 21:33:51.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c	2014-10-05 16:50:21.000000000 -0400
@@ -135,6 +135,7 @@ void netxen_release_tx_buffers(struct ne
 	int i, j;
 	struct nx_host_tx_ring *tx_ring = adapter->tx_ring;
 
+	spin_lock(&adapter->tx_clean_lock);
 	cmd_buf = tx_ring->cmd_buf_arr;
 	for (i = 0; i < tx_ring->num_desc; i++) {
 		buffrag = cmd_buf->frag_array;
@@ -158,6 +159,7 @@ void netxen_release_tx_buffers(struct ne
 		}
 		cmd_buf++;
 	}
+	spin_unlock(&adapter->tx_clean_lock);
 }
 
 void netxen_free_sw_resources(struct netxen_adapter *adapter)
@@ -1792,9 +1794,9 @@ int netxen_process_cmd_ring(struct netxe
 			break;
 	}
 
-	if (count && netif_running(netdev)) {
-		tx_ring->sw_consumer = sw_consumer;
+	tx_ring->sw_consumer = sw_consumer;
 
+	if (count && netif_running(netdev)) {
 		smp_mb();
 
 		if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev))
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c	2014-09-28 21:33:59.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c	2014-10-05 16:50:28.000000000 -0400
@@ -1186,7 +1186,6 @@ __netxen_nic_down(struct netxen_adapter
 		return;
 
 	smp_mb();
-	spin_lock(&adapter->tx_clean_lock);
 	netif_carrier_off(netdev);
 	netif_tx_disable(netdev);
 
@@ -1204,7 +1203,6 @@ __netxen_nic_down(struct netxen_adapter
 	netxen_napi_disable(adapter);
 
 	netxen_release_tx_buffers(adapter);
-	spin_unlock(&adapter->tx_clean_lock);
 }
 
 /* Usage: During suspend and firmware recovery module */
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c	2014-09-28 21:33:59.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c	2014-10-05 16:50:28.000000000 -0400
@@ -1177,9 +1177,8 @@ static void qlcnic_83xx_setup_idc_parame
 {
 	u32 idc_params, val;
 
-	if (qlcnic_83xx_lockless_flash_read32(adapter,
-					      QLC_83XX_IDC_FLASH_PARAM_ADDR,
-					      (u8 *)&idc_params, 1)) {
+	if (qlcnic_83xx_flash_read32(adapter, QLC_83XX_IDC_FLASH_PARAM_ADDR,
+				     (u8 *)&idc_params, 1)) {
 		dev_info(&adapter->pdev->dev,
 			 "%s:failed to get IDC params from flash\n", __func__);
 		adapter->dev_init_timeo = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c	2014-10-05 15:23:04.000000000 -0400
@@ -1333,21 +1333,21 @@ static void qlcnic_get_ethtool_stats(str
 	struct qlcnic_host_tx_ring *tx_ring;
 	struct qlcnic_esw_statistics port_stats;
 	struct qlcnic_mac_statistics mac_stats;
-	int index, ret, length, size, tx_size, ring;
+	int index, ret, length, size, ring;
 	char *p;
 
-	tx_size = adapter->drv_tx_rings * QLCNIC_TX_STATS_LEN;
+	memset(data, 0, stats->n_stats * sizeof(u64));
 
-	memset(data, 0, tx_size * sizeof(u64));
 	for (ring = 0, index = 0; ring < adapter->drv_tx_rings; ring++) {
-		if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
+		if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) {
 			tx_ring = &adapter->tx_ring[ring];
 			data = qlcnic_fill_tx_queue_stats(data, tx_ring);
 			qlcnic_update_stats(adapter);
+		} else {
+			data += QLCNIC_TX_STATS_LEN;
 		}
 	}
 
-	memset(data, 0, stats->n_stats * sizeof(u64));
 	length = QLCNIC_STATS_LEN;
 	for (index = 0; index < length; index++) {
 		p = (char *)adapter + qlcnic_gstrings_stats[index].stat_offset;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c linux-libre-3.17-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
--- linux-libre-3.17-rc7-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c	2014-10-05 15:23:04.000000000 -0400
@@ -2786,8 +2786,15 @@ struct stmmac_priv *stmmac_dvr_probe(str
 	if (IS_ERR(priv->stmmac_clk)) {
 		dev_warn(priv->device, "%s: warning: cannot get CSR clock\n",
 			 __func__);
-		ret = PTR_ERR(priv->stmmac_clk);
-		goto error_clk_get;
+		/* If failed to obtain stmmac_clk and specific clk_csr value
+		 * is NOT passed from the platform, probe fail.
+		 */
+		if (!priv->plat->clk_csr) {
+			ret = PTR_ERR(priv->stmmac_clk);
+			goto error_clk_get;
+		} else {
+			priv->stmmac_clk = NULL;
+		}
 	}
 	clk_prepare_enable(priv->stmmac_clk);
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/hyperv/netvsc_drv.c linux-libre-3.17-gnu/drivers/net/hyperv/netvsc_drv.c
--- linux-libre-3.17-rc7-gnu/drivers/net/hyperv/netvsc_drv.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/hyperv/netvsc_drv.c	2014-10-05 15:23:04.000000000 -0400
@@ -387,6 +387,7 @@ static int netvsc_start_xmit(struct sk_b
 	int  hdr_offset;
 	u32 net_trans_info;
 	u32 hash;
+	u32 skb_length = skb->len;
 
 
 	/* We will atmost need two pages to describe the rndis
@@ -562,7 +563,7 @@ do_send:
 
 drop:
 	if (ret == 0) {
-		net->stats.tx_bytes += skb->len;
+		net->stats.tx_bytes += skb_length;
 		net->stats.tx_packets++;
 	} else {
 		kfree(packet);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/macvtap.c linux-libre-3.17-gnu/drivers/net/macvtap.c
--- linux-libre-3.17-rc7-gnu/drivers/net/macvtap.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/macvtap.c	2014-10-05 15:23:04.000000000 -0400
@@ -112,17 +112,15 @@ out:
 	return err;
 }
 
+/* Requires RTNL */
 static int macvtap_set_queue(struct net_device *dev, struct file *file,
 			     struct macvtap_queue *q)
 {
 	struct macvlan_dev *vlan = netdev_priv(dev);
-	int err = -EBUSY;
 
-	rtnl_lock();
 	if (vlan->numqueues == MAX_MACVTAP_QUEUES)
-		goto out;
+		return -EBUSY;
 
-	err = 0;
 	rcu_assign_pointer(q->vlan, vlan);
 	rcu_assign_pointer(vlan->taps[vlan->numvtaps], q);
 	sock_hold(&q->sk);
@@ -136,9 +134,7 @@ static int macvtap_set_queue(struct net_
 	vlan->numvtaps++;
 	vlan->numqueues++;
 
-out:
-	rtnl_unlock();
-	return err;
+	return 0;
 }
 
 static int macvtap_disable_queue(struct macvtap_queue *q)
@@ -454,11 +450,12 @@ static void macvtap_sock_destruct(struct
 static int macvtap_open(struct inode *inode, struct file *file)
 {
 	struct net *net = current->nsproxy->net_ns;
-	struct net_device *dev = dev_get_by_macvtap_minor(iminor(inode));
+	struct net_device *dev;
 	struct macvtap_queue *q;
-	int err;
+	int err = -ENODEV;
 
-	err = -ENODEV;
+	rtnl_lock();
+	dev = dev_get_by_macvtap_minor(iminor(inode));
 	if (!dev)
 		goto out;
 
@@ -498,6 +495,7 @@ out:
 	if (dev)
 		dev_put(dev);
 
+	rtnl_unlock();
 	return err;
 }
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/net/usb/r8152.c linux-libre-3.17-gnu/drivers/net/usb/r8152.c
--- linux-libre-3.17-rc7-gnu/drivers/net/usb/r8152.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/net/usb/r8152.c	2014-10-05 15:23:04.000000000 -0400
@@ -24,7 +24,7 @@
 #include <net/ip6_checksum.h>
 
 /* Version Information */
-#define DRIVER_VERSION "v1.06.0 (2014/03/03)"
+#define DRIVER_VERSION "v1.06.1 (2014/10/01)"
 #define DRIVER_AUTHOR "Realtek linux nic maintainers <nic_swsd@realtek.com>"
 #define DRIVER_DESC "Realtek RTL8152/RTL8153 Based USB Ethernet Adapters"
 #define MODULENAME "r8152"
@@ -1949,10 +1949,34 @@ static void rxdy_gated_en(struct r8152 *
 	ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data);
 }
 
+static int rtl_start_rx(struct r8152 *tp)
+{
+	int i, ret = 0;
+
+	INIT_LIST_HEAD(&tp->rx_done);
+	for (i = 0; i < RTL8152_MAX_RX; i++) {
+		INIT_LIST_HEAD(&tp->rx_info[i].list);
+		ret = r8152_submit_rx(tp, &tp->rx_info[i], GFP_KERNEL);
+		if (ret)
+			break;
+	}
+
+	return ret;
+}
+
+static int rtl_stop_rx(struct r8152 *tp)
+{
+	int i;
+
+	for (i = 0; i < RTL8152_MAX_RX; i++)
+		usb_kill_urb(tp->rx_info[i].urb);
+
+	return 0;
+}
+
 static int rtl_enable(struct r8152 *tp)
 {
 	u32 ocp_data;
-	int i, ret;
 
 	r8152b_reset_packet_filter(tp);
 
@@ -1962,14 +1986,7 @@ static int rtl_enable(struct r8152 *tp)
 
 	rxdy_gated_en(tp, false);
 
-	INIT_LIST_HEAD(&tp->rx_done);
-	ret = 0;
-	for (i = 0; i < RTL8152_MAX_RX; i++) {
-		INIT_LIST_HEAD(&tp->rx_info[i].list);
-		ret |= r8152_submit_rx(tp, &tp->rx_info[i], GFP_KERNEL);
-	}
-
-	return ret;
+	return rtl_start_rx(tp);
 }
 
 static int rtl8152_enable(struct r8152 *tp)
@@ -2053,8 +2070,7 @@ static void rtl_disable(struct r8152 *tp
 		mdelay(1);
 	}
 
-	for (i = 0; i < RTL8152_MAX_RX; i++)
-		usb_kill_urb(tp->rx_info[i].urb);
+	rtl_stop_rx(tp);
 
 	rtl8152_nic_reset(tp);
 }
@@ -2185,28 +2201,6 @@ static void rtl_phy_reset(struct r8152 *
 	}
 }
 
-static void rtl_clear_bp(struct r8152 *tp)
-{
-	ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_0, 0);
-	ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_2, 0);
-	ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_4, 0);
-	ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_6, 0);
-	ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_0, 0);
-	ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_2, 0);
-	ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_4, 0);
-	ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_6, 0);
-	mdelay(3);
-	ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_BA, 0);
-	ocp_write_word(tp, MCU_TYPE_USB, USB_BP_BA, 0);
-}
-
-static void r8153_clear_bp(struct r8152 *tp)
-{
-	ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
-	ocp_write_byte(tp, MCU_TYPE_USB, USB_BP_EN, 0);
-	rtl_clear_bp(tp);
-}
-
 static void r8153_teredo_off(struct r8152 *tp)
 {
 	u32 ocp_data;
@@ -2249,8 +2243,6 @@ static void r8152b_hw_phy_cfg(struct r81
 		r8152_mdio_write(tp, MII_BMCR, data);
 	}
 
-	rtl_clear_bp(tp);
-
 	set_bit(PHY_RESET, &tp->flags);
 }
 
@@ -2401,8 +2393,6 @@ static void r8153_hw_phy_cfg(struct r815
 		r8152_mdio_write(tp, MII_BMCR, data);
 	}
 
-	r8153_clear_bp(tp);
-
 	if (tp->version == RTL_VER_03) {
 		data = ocp_reg_read(tp, OCP_EEE_CFG);
 		data &= ~CTAP_SHORT_EN;
@@ -3083,13 +3073,14 @@ static int rtl8152_suspend(struct usb_in
 		clear_bit(WORK_ENABLE, &tp->flags);
 		usb_kill_urb(tp->intr_urb);
 		cancel_delayed_work_sync(&tp->schedule);
+		tasklet_disable(&tp->tl);
 		if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
+			rtl_stop_rx(tp);
 			rtl_runtime_suspend_enable(tp, true);
 		} else {
-			tasklet_disable(&tp->tl);
 			tp->rtl_ops.down(tp);
-			tasklet_enable(&tp->tl);
 		}
+		tasklet_enable(&tp->tl);
 	}
 
 	return 0;
@@ -3108,17 +3099,18 @@ static int rtl8152_resume(struct usb_int
 		if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
 			rtl_runtime_suspend_enable(tp, false);
 			clear_bit(SELECTIVE_SUSPEND, &tp->flags);
+			set_bit(WORK_ENABLE, &tp->flags);
 			if (tp->speed & LINK_STATUS)
-				tp->rtl_ops.disable(tp);
+				rtl_start_rx(tp);
 		} else {
 			tp->rtl_ops.up(tp);
 			rtl8152_set_speed(tp, AUTONEG_ENABLE,
 				tp->mii.supports_gmii ? SPEED_1000 : SPEED_100,
 				DUPLEX_FULL);
+			tp->speed = 0;
+			netif_carrier_off(tp->netdev);
+			set_bit(WORK_ENABLE, &tp->flags);
 		}
-		tp->speed = 0;
-		netif_carrier_off(tp->netdev);
-		set_bit(WORK_ENABLE, &tp->flags);
 		usb_submit_urb(tp->intr_urb, GFP_KERNEL);
 	}
 
@@ -3405,7 +3397,7 @@ static void rtl8153_unload(struct r8152
 	if (test_bit(RTL8152_UNPLUG, &tp->flags))
 		return;
 
-	r8153_power_cut_en(tp, true);
+	r8153_power_cut_en(tp, false);
 }
 
 static int rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id)
@@ -3558,7 +3550,11 @@ static void rtl8152_disconnect(struct us
 
 	usb_set_intfdata(intf, NULL);
 	if (tp) {
-		set_bit(RTL8152_UNPLUG, &tp->flags);
+		struct usb_device *udev = tp->udev;
+
+		if (udev->state == USB_STATE_NOTATTACHED)
+			set_bit(RTL8152_UNPLUG, &tp->flags);
+
 		tasklet_kill(&tp->tl);
 		unregister_netdev(tp->netdev);
 		tp->rtl_ops.unload(tp);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/parisc/superio.c linux-libre-3.17-gnu/drivers/parisc/superio.c
--- linux-libre-3.17-rc7-gnu/drivers/parisc/superio.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/parisc/superio.c	2014-10-05 15:23:04.000000000 -0400
@@ -395,7 +395,8 @@ static void __init superio_serial_init(v
 	serial_port.iotype	= UPIO_PORT;
 	serial_port.type	= PORT_16550A;
 	serial_port.uartclk	= 115200*16;
-	serial_port.fifosize	= 16;
+	serial_port.flags	= UPF_FIXED_PORT | UPF_FIXED_TYPE |
+				  UPF_BOOT_AUTOCONF;
 
 	/* serial port #1 */
 	serial_port.iobase	= sio_dev.sp1_base;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c linux-libre-3.17-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
--- linux-libre-3.17-rc7-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c	2014-10-05 15:23:04.000000000 -0400
@@ -1647,7 +1647,7 @@ static int cxgbi_inet6addr_handler(struc
 	if (event_dev->priv_flags & IFF_802_1Q_VLAN)
 		event_dev = vlan_dev_real_dev(event_dev);
 
-	cdev = cxgbi_device_find_by_netdev(event_dev, NULL);
+	cdev = cxgbi_device_find_by_netdev_rcu(event_dev, NULL);
 
 	if (!cdev)
 		return ret;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/scsi/cxgbi/libcxgbi.c linux-libre-3.17-gnu/drivers/scsi/cxgbi/libcxgbi.c
--- linux-libre-3.17-rc7-gnu/drivers/scsi/cxgbi/libcxgbi.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/scsi/cxgbi/libcxgbi.c	2014-10-05 15:23:04.000000000 -0400
@@ -57,6 +57,9 @@ MODULE_PARM_DESC(dbg_level, "libiscsi de
 static LIST_HEAD(cdev_list);
 static DEFINE_MUTEX(cdev_mutex);
 
+static LIST_HEAD(cdev_rcu_list);
+static DEFINE_SPINLOCK(cdev_rcu_lock);
+
 int cxgbi_device_portmap_create(struct cxgbi_device *cdev, unsigned int base,
 				unsigned int max_conn)
 {
@@ -142,6 +145,10 @@ struct cxgbi_device *cxgbi_device_regist
 	list_add_tail(&cdev->list_head, &cdev_list);
 	mutex_unlock(&cdev_mutex);
 
+	spin_lock(&cdev_rcu_lock);
+	list_add_tail_rcu(&cdev->rcu_node, &cdev_rcu_list);
+	spin_unlock(&cdev_rcu_lock);
+
 	log_debug(1 << CXGBI_DBG_DEV,
 		"cdev 0x%p, p# %u.\n", cdev, nports);
 	return cdev;
@@ -153,9 +160,16 @@ void cxgbi_device_unregister(struct cxgb
 	log_debug(1 << CXGBI_DBG_DEV,
 		"cdev 0x%p, p# %u,%s.\n",
 		cdev, cdev->nports, cdev->nports ? cdev->ports[0]->name : "");
+
 	mutex_lock(&cdev_mutex);
 	list_del(&cdev->list_head);
 	mutex_unlock(&cdev_mutex);
+
+	spin_lock(&cdev_rcu_lock);
+	list_del_rcu(&cdev->rcu_node);
+	spin_unlock(&cdev_rcu_lock);
+	synchronize_rcu();
+
 	cxgbi_device_destroy(cdev);
 }
 EXPORT_SYMBOL_GPL(cxgbi_device_unregister);
@@ -167,12 +181,9 @@ void cxgbi_device_unregister_all(unsigne
 	mutex_lock(&cdev_mutex);
 	list_for_each_entry_safe(cdev, tmp, &cdev_list, list_head) {
 		if ((cdev->flags & flag) == flag) {
-			log_debug(1 << CXGBI_DBG_DEV,
-				"cdev 0x%p, p# %u,%s.\n",
-				cdev, cdev->nports, cdev->nports ?
-				 cdev->ports[0]->name : "");
-			list_del(&cdev->list_head);
-			cxgbi_device_destroy(cdev);
+			mutex_unlock(&cdev_mutex);
+			cxgbi_device_unregister(cdev);
+			mutex_lock(&cdev_mutex);
 		}
 	}
 	mutex_unlock(&cdev_mutex);
@@ -191,6 +202,7 @@ struct cxgbi_device *cxgbi_device_find_b
 		}
 	}
 	mutex_unlock(&cdev_mutex);
+
 	log_debug(1 << CXGBI_DBG_DEV,
 		"lldev 0x%p, NO match found.\n", lldev);
 	return NULL;
@@ -230,6 +242,39 @@ struct cxgbi_device *cxgbi_device_find_b
 }
 EXPORT_SYMBOL_GPL(cxgbi_device_find_by_netdev);
 
+struct cxgbi_device *cxgbi_device_find_by_netdev_rcu(struct net_device *ndev,
+						     int *port)
+{
+	struct net_device *vdev = NULL;
+	struct cxgbi_device *cdev;
+	int i;
+
+	if (ndev->priv_flags & IFF_802_1Q_VLAN) {
+		vdev = ndev;
+		ndev = vlan_dev_real_dev(ndev);
+		pr_info("vlan dev %s -> %s.\n", vdev->name, ndev->name);
+	}
+
+	rcu_read_lock();
+	list_for_each_entry_rcu(cdev, &cdev_rcu_list, rcu_node) {
+		for (i = 0; i < cdev->nports; i++) {
+			if (ndev == cdev->ports[i]) {
+				cdev->hbas[i]->vdev = vdev;
+				rcu_read_unlock();
+				if (port)
+					*port = i;
+				return cdev;
+			}
+		}
+	}
+	rcu_read_unlock();
+
+	log_debug(1 << CXGBI_DBG_DEV,
+		  "ndev 0x%p, %s, NO match found.\n", ndev, ndev->name);
+	return NULL;
+}
+EXPORT_SYMBOL_GPL(cxgbi_device_find_by_netdev_rcu);
+
 static struct cxgbi_device *cxgbi_device_find_by_mac(struct net_device *ndev,
 						     int *port)
 {
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/scsi/cxgbi/libcxgbi.h linux-libre-3.17-gnu/drivers/scsi/cxgbi/libcxgbi.h
--- linux-libre-3.17-rc7-gnu/drivers/scsi/cxgbi/libcxgbi.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/scsi/cxgbi/libcxgbi.h	2014-10-05 15:23:04.000000000 -0400
@@ -527,6 +527,7 @@ struct cxgbi_ports_map {
 #define CXGBI_FLAG_IPV4_SET		0x10
 struct cxgbi_device {
 	struct list_head list_head;
+	struct list_head rcu_node;
 	unsigned int flags;
 	struct net_device **ports;
 	void *lldev;
@@ -709,6 +710,8 @@ void cxgbi_device_unregister(struct cxgb
 void cxgbi_device_unregister_all(unsigned int flag);
 struct cxgbi_device *cxgbi_device_find_by_lldev(void *);
 struct cxgbi_device *cxgbi_device_find_by_netdev(struct net_device *, int *);
+struct cxgbi_device *cxgbi_device_find_by_netdev_rcu(struct net_device *,
+						     int *);
 int cxgbi_hbas_add(struct cxgbi_device *, u64, unsigned int,
 			struct scsi_host_template *,
 			struct scsi_transport_template *);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/drivers/usb/storage/uas.c linux-libre-3.17-gnu/drivers/usb/storage/uas.c
--- linux-libre-3.17-rc7-gnu/drivers/usb/storage/uas.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/drivers/usb/storage/uas.c	2014-10-05 15:23:04.000000000 -0400
@@ -970,6 +970,13 @@ static struct scsi_host_template uas_hos
 	.cmd_per_lun = 1,	/* until we override it */
 	.skip_settle_delay = 1,
 	.ordered_tag = 1,
+
+	/*
+	 * The uas drivers expects tags not to be bigger than the maximum
+	 * per-device queue depth, which is not true with the blk-mq tag
+	 * allocator.
+	 */
+	.disable_blk_mq = true,
 };
 
 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/fs/cifs/file.c linux-libre-3.17-gnu/fs/cifs/file.c
--- linux-libre-3.17-rc7-gnu/fs/cifs/file.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/fs/cifs/file.c	2014-10-05 15:23:04.000000000 -0400
@@ -3568,15 +3568,9 @@ static int cifs_readpages(struct file *f
 				lru_cache_add_file(page);
 				unlock_page(page);
 				page_cache_release(page);
-				if (rc == -EAGAIN)
-					list_add_tail(&page->lru, &tmplist);
 			}
+			/* Fallback to the readpage in error/reconnect cases */
 			kref_put(&rdata->refcount, cifs_readdata_release);
-			if (rc == -EAGAIN) {
-				/* Re-add pages to the page_list and retry */
-				list_splice(&tmplist, page_list);
-				continue;
-			}
 			break;
 		}
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/fs/cifs/smb1ops.c linux-libre-3.17-gnu/fs/cifs/smb1ops.c
--- linux-libre-3.17-rc7-gnu/fs/cifs/smb1ops.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/fs/cifs/smb1ops.c	2014-10-05 15:23:04.000000000 -0400
@@ -586,7 +586,7 @@ cifs_query_path_info(const unsigned int
 		tmprc = CIFS_open(xid, &oparms, &oplock, NULL);
 		if (tmprc == -EOPNOTSUPP)
 			*symlink = true;
-		else
+		else if (tmprc == 0)
 			CIFSSMBClose(xid, tcon, fid.netfid);
 	}
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/fs/cifs/smb2maperror.c linux-libre-3.17-gnu/fs/cifs/smb2maperror.c
--- linux-libre-3.17-rc7-gnu/fs/cifs/smb2maperror.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/fs/cifs/smb2maperror.c	2014-10-05 15:23:04.000000000 -0400
@@ -256,6 +256,8 @@ static const struct status_to_posix_erro
 	{STATUS_DLL_MIGHT_BE_INCOMPATIBLE, -EIO,
 	"STATUS_DLL_MIGHT_BE_INCOMPATIBLE"},
 	{STATUS_STOPPED_ON_SYMLINK, -EOPNOTSUPP, "STATUS_STOPPED_ON_SYMLINK"},
+	{STATUS_IO_REPARSE_TAG_NOT_HANDLED, -EOPNOTSUPP,
+	"STATUS_REPARSE_NOT_HANDLED"},
 	{STATUS_DEVICE_REQUIRES_CLEANING, -EIO,
 	"STATUS_DEVICE_REQUIRES_CLEANING"},
 	{STATUS_DEVICE_DOOR_OPEN, -EIO, "STATUS_DEVICE_DOOR_OPEN"},
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/fs/nfsd/nfs4xdr.c linux-libre-3.17-gnu/fs/nfsd/nfs4xdr.c
--- linux-libre-3.17-rc7-gnu/fs/nfsd/nfs4xdr.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/fs/nfsd/nfs4xdr.c	2014-10-05 15:23:04.000000000 -0400
@@ -3104,7 +3104,8 @@ static __be32 nfsd4_encode_splice_read(
 
 	buf->page_len = maxcount;
 	buf->len += maxcount;
-	xdr->page_ptr += (maxcount + PAGE_SIZE - 1) / PAGE_SIZE;
+	xdr->page_ptr += (buf->page_base + maxcount + PAGE_SIZE - 1)
+							/ PAGE_SIZE;
 
 	/* Use rest of head for padding and remaining ops: */
 	buf->tail[0].iov_base = xdr->p;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/fs/ocfs2/dlm/dlmmaster.c linux-libre-3.17-gnu/fs/ocfs2/dlm/dlmmaster.c
--- linux-libre-3.17-rc7-gnu/fs/ocfs2/dlm/dlmmaster.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/fs/ocfs2/dlm/dlmmaster.c	2014-10-05 15:23:04.000000000 -0400
@@ -2039,6 +2039,10 @@ kill:
 	     "and killing the other node now!  This node is OK and can continue.\n");
 	__dlm_print_one_lock_resource(res);
 	spin_unlock(&res->spinlock);
+	spin_lock(&dlm->master_lock);
+	if (mle)
+		__dlm_put_mle(mle);
+	spin_unlock(&dlm->master_lock);
 	spin_unlock(&dlm->spinlock);
 	*ret_data = (void *)res;
 	dlm_put(dlm);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/include/net/ip6_fib.h linux-libre-3.17-gnu/include/net/ip6_fib.h
--- linux-libre-3.17-rc7-gnu/include/net/ip6_fib.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/include/net/ip6_fib.h	2014-10-05 15:23:04.000000000 -0400
@@ -114,16 +114,13 @@ struct rt6_info {
 	u32				rt6i_flags;
 	struct rt6key			rt6i_src;
 	struct rt6key			rt6i_prefsrc;
-	u32				rt6i_metric;
 
 	struct inet6_dev		*rt6i_idev;
 	unsigned long			_rt6i_peer;
 
-	u32				rt6i_genid;
-
+	u32				rt6i_metric;
 	/* more non-fragment space at head required */
 	unsigned short			rt6i_nfheader_len;
-
 	u8				rt6i_protocol;
 };
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/include/net/net_namespace.h linux-libre-3.17-gnu/include/net/net_namespace.h
--- linux-libre-3.17-rc7-gnu/include/net/net_namespace.h	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/include/net/net_namespace.h	2014-10-05 15:23:04.000000000 -0400
@@ -352,26 +352,12 @@ static inline void rt_genid_bump_ipv4(st
 	atomic_inc(&net->ipv4.rt_genid);
 }
 
-#if IS_ENABLED(CONFIG_IPV6)
-static inline int rt_genid_ipv6(struct net *net)
-{
-	return atomic_read(&net->ipv6.rt_genid);
-}
-
-static inline void rt_genid_bump_ipv6(struct net *net)
-{
-	atomic_inc(&net->ipv6.rt_genid);
-}
-#else
-static inline int rt_genid_ipv6(struct net *net)
-{
-	return 0;
-}
-
+extern void (*__fib6_flush_trees)(struct net *net);
 static inline void rt_genid_bump_ipv6(struct net *net)
 {
+	if (__fib6_flush_trees)
+		__fib6_flush_trees(net);
 }
-#endif
 
 #if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
 static inline struct netns_ieee802154_lowpan *
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/init/Kconfig linux-libre-3.17-gnu/init/Kconfig
--- linux-libre-3.17-rc7-gnu/init/Kconfig	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/init/Kconfig	2014-10-05 15:23:04.000000000 -0400
@@ -811,6 +811,7 @@ config LOG_BUF_SHIFT
 	int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
 	range 12 21
 	default 17
+	depends on PRINTK
 	help
 	  Select the minimal kernel log buffer size as a power of 2.
 	  The final size is affected by LOG_CPU_MAX_BUF_SHIFT config
@@ -830,6 +831,7 @@ config LOG_CPU_MAX_BUF_SHIFT
 	range 0 21
 	default 12 if !BASE_SMALL
 	default 0 if BASE_SMALL
+	depends on PRINTK
 	help
 	  This option allows to increase the default ring buffer size
 	  according to the number of CPUs. The value defines the contribution
@@ -1475,6 +1477,7 @@ config FUTEX
 
 config HAVE_FUTEX_CMPXCHG
 	bool
+	depends on FUTEX
 	help
 	  Architectures should select this if futex_atomic_cmpxchg_inatomic()
 	  is implemented and always working. This removes a couple of runtime
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/kernel/events/core.c linux-libre-3.17-gnu/kernel/events/core.c
--- linux-libre-3.17-rc7-gnu/kernel/events/core.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/kernel/events/core.c	2014-10-05 15:23:04.000000000 -0400
@@ -7948,8 +7948,10 @@ int perf_event_init_task(struct task_str
 
 	for_each_task_context_nr(ctxn) {
 		ret = perf_event_init_context(child, ctxn);
-		if (ret)
+		if (ret) {
+			perf_event_free_task(child);
 			return ret;
+		}
 	}
 
 	return 0;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/kernel/fork.c linux-libre-3.17-gnu/kernel/fork.c
--- linux-libre-3.17-rc7-gnu/kernel/fork.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/kernel/fork.c	2014-10-05 15:23:04.000000000 -0400
@@ -1360,7 +1360,7 @@ static struct task_struct *copy_process(
 		goto bad_fork_cleanup_policy;
 	retval = audit_alloc(p);
 	if (retval)
-		goto bad_fork_cleanup_policy;
+		goto bad_fork_cleanup_perf;
 	/* copy all the process information */
 	shm_init_task(p);
 	retval = copy_semundo(clone_flags, p);
@@ -1566,8 +1566,9 @@ bad_fork_cleanup_semundo:
 	exit_sem(p);
 bad_fork_cleanup_audit:
 	audit_free(p);
-bad_fork_cleanup_policy:
+bad_fork_cleanup_perf:
 	perf_event_free_task(p);
+bad_fork_cleanup_policy:
 #ifdef CONFIG_NUMA
 	mpol_put(p->mempolicy);
 bad_fork_cleanup_threadgroup_lock:
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/kernel/trace/ring_buffer.c linux-libre-3.17-gnu/kernel/trace/ring_buffer.c
--- linux-libre-3.17-rc7-gnu/kernel/trace/ring_buffer.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/kernel/trace/ring_buffer.c	2014-10-05 15:23:04.000000000 -0400
@@ -3359,7 +3359,7 @@ static void rb_iter_reset(struct ring_bu
 	iter->head = cpu_buffer->reader_page->read;
 
 	iter->cache_reader_page = iter->head_page;
-	iter->cache_read = iter->head;
+	iter->cache_read = cpu_buffer->read;
 
 	if (iter->head)
 		iter->read_stamp = cpu_buffer->read_stamp;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/lib/rhashtable.c linux-libre-3.17-gnu/lib/rhashtable.c
--- linux-libre-3.17-rc7-gnu/lib/rhashtable.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/lib/rhashtable.c	2014-10-05 15:23:04.000000000 -0400
@@ -588,13 +588,13 @@ EXPORT_SYMBOL_GPL(rhashtable_init);
  * rhashtable_destroy - destroy hash table
  * @ht:		the hash table to destroy
  *
- * Frees the bucket array.
+ * Frees the bucket array. This function is not rcu safe, therefore the caller
+ * has to make sure that no resizing may happen by unpublishing the hashtable
+ * and waiting for the quiescent cycle before releasing the bucket array.
  */
 void rhashtable_destroy(const struct rhashtable *ht)
 {
-	const struct bucket_table *tbl = rht_dereference(ht->tbl, ht);
-
-	bucket_table_free(tbl);
+	bucket_table_free(ht->tbl);
 }
 EXPORT_SYMBOL_GPL(rhashtable_destroy);
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/MAINTAINERS linux-libre-3.17-gnu/MAINTAINERS
--- linux-libre-3.17-rc7-gnu/MAINTAINERS	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/MAINTAINERS	2014-10-05 15:23:04.000000000 -0400
@@ -1665,6 +1665,12 @@ M:	Nicolas Ferre <nicolas.ferre@atmel.co
 S:	Supported
 F:	drivers/tty/serial/atmel_serial.c
 
+ATMEL Audio ALSA driver
+M:	Bo Shen <voice.shen@atmel.com>
+L:	alsa-devel@alsa-project.org (moderated for non-subscribers)
+S:	Supported
+F:	sound/soc/atmel
+
 ATMEL DMA DRIVER
 M:	Nicolas Ferre <nicolas.ferre@atmel.com>
 L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -2098,7 +2104,7 @@ S:	Supported
 F:	drivers/scsi/bfa/
 
 BROCADE BNA 10 GIGABIT ETHERNET DRIVER
-M:	Rasesh Mody <rmody@brocade.com>
+M:	Rasesh Mody <rasesh.mody@qlogic.com>
 L:	netdev@vger.kernel.org
 S:	Supported
 F:	drivers/net/ethernet/brocade/bna/
@@ -5478,7 +5484,7 @@ F:	drivers/macintosh/
 LINUX FOR POWERPC EMBEDDED MPC5XXX
 M:	Anatolij Gustschin <agust@denx.de>
 L:	linuxppc-dev@lists.ozlabs.org
-T:	git git://git.denx.de/linux-2.6-agust.git
+T:	git git://git.denx.de/linux-denx-agust.git
 S:	Maintained
 F:	arch/powerpc/platforms/512x/
 F:	arch/powerpc/platforms/52xx/
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/Makefile linux-libre-3.17-gnu/Makefile
--- linux-libre-3.17-rc7-gnu/Makefile	2014-09-28 21:25:03.000000000 -0400
+++ linux-libre-3.17-gnu/Makefile	2014-10-05 16:42:14.000000000 -0400
@@ -1,7 +1,7 @@
 VERSION = 3
 PATCHLEVEL = 17
 SUBLEVEL = 0
-EXTRAVERSION = -rc7-gnu
+EXTRAVERSION =-gnu
 NAME = Shuffling Zombie Juror
 
 # *DOCUMENTATION*
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/mm/huge_memory.c linux-libre-3.17-gnu/mm/huge_memory.c
--- linux-libre-3.17-rc7-gnu/mm/huge_memory.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/mm/huge_memory.c	2014-10-05 15:23:04.000000000 -0400
@@ -1795,14 +1795,17 @@ static int __split_huge_page_map(struct
 		for (i = 0; i < HPAGE_PMD_NR; i++, haddr += PAGE_SIZE) {
 			pte_t *pte, entry;
 			BUG_ON(PageCompound(page+i));
+			/*
+			 * Note that pmd_numa is not transferred deliberately
+			 * to avoid any possibility that pte_numa leaks to
+			 * a PROT_NONE VMA by accident.
+			 */
 			entry = mk_pte(page + i, vma->vm_page_prot);
 			entry = maybe_mkwrite(pte_mkdirty(entry), vma);
 			if (!pmd_write(*pmd))
 				entry = pte_wrprotect(entry);
 			if (!pmd_young(*pmd))
 				entry = pte_mkold(entry);
-			if (pmd_numa(*pmd))
-				entry = pte_mknuma(entry);
 			pte = pte_offset_map(&_pmd, haddr);
 			BUG_ON(!pte_none(*pte));
 			set_pte_at(mm, haddr, pte, entry);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/mm/memcontrol.c linux-libre-3.17-gnu/mm/memcontrol.c
--- linux-libre-3.17-rc7-gnu/mm/memcontrol.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/mm/memcontrol.c	2014-10-05 15:23:04.000000000 -0400
@@ -292,6 +292,9 @@ struct mem_cgroup {
 	/* vmpressure notifications */
 	struct vmpressure vmpressure;
 
+	/* css_online() has been completed */
+	int initialized;
+
 	/*
 	 * the counter to account for mem+swap usage.
 	 */
@@ -1099,10 +1102,21 @@ skip_node:
 	 * skipping css reference should be safe.
 	 */
 	if (next_css) {
-		if ((next_css == &root->css) ||
-		    ((next_css->flags & CSS_ONLINE) &&
-		     css_tryget_online(next_css)))
-			return mem_cgroup_from_css(next_css);
+		struct mem_cgroup *memcg = mem_cgroup_from_css(next_css);
+
+		if (next_css == &root->css)
+			return memcg;
+
+		if (css_tryget_online(next_css)) {
+			/*
+			 * Make sure the memcg is initialized:
+			 * mem_cgroup_css_online() orders the the
+			 * initialization against setting the flag.
+			 */
+			if (smp_load_acquire(&memcg->initialized))
+				return memcg;
+			css_put(next_css);
+		}
 
 		prev_css = next_css;
 		goto skip_node;
@@ -5549,6 +5563,7 @@ mem_cgroup_css_online(struct cgroup_subs
 {
 	struct mem_cgroup *memcg = mem_cgroup_from_css(css);
 	struct mem_cgroup *parent = mem_cgroup_from_css(css->parent);
+	int ret;
 
 	if (css->id > MEM_CGROUP_ID_MAX)
 		return -ENOSPC;
@@ -5585,7 +5600,18 @@ mem_cgroup_css_online(struct cgroup_subs
 	}
 	mutex_unlock(&memcg_create_mutex);
 
-	return memcg_init_kmem(memcg, &memory_cgrp_subsys);
+	ret = memcg_init_kmem(memcg, &memory_cgrp_subsys);
+	if (ret)
+		return ret;
+
+	/*
+	 * Make sure the memcg is initialized: mem_cgroup_iter()
+	 * orders reading memcg->initialized against its callers
+	 * reading the memcg members.
+	 */
+	smp_store_release(&memcg->initialized, 1);
+
+	return 0;
 }
 
 /*
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/mm/migrate.c linux-libre-3.17-gnu/mm/migrate.c
--- linux-libre-3.17-rc7-gnu/mm/migrate.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/mm/migrate.c	2014-10-05 15:23:04.000000000 -0400
@@ -146,8 +146,11 @@ static int remove_migration_pte(struct p
 	pte = pte_mkold(mk_pte(new, vma->vm_page_prot));
 	if (pte_swp_soft_dirty(*ptep))
 		pte = pte_mksoft_dirty(pte);
+
+	/* Recheck VMA as permissions can change since migration started  */
 	if (is_write_migration_entry(entry))
-		pte = pte_mkwrite(pte);
+		pte = maybe_mkwrite(pte, vma);
+
 #ifdef CONFIG_HUGETLB_PAGE
 	if (PageHuge(new)) {
 		pte = pte_mkhuge(pte);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/mm/page_alloc.c linux-libre-3.17-gnu/mm/page_alloc.c
--- linux-libre-3.17-rc7-gnu/mm/page_alloc.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/mm/page_alloc.c	2014-10-05 15:23:04.000000000 -0400
@@ -1612,7 +1612,7 @@ again:
 	}
 
 	__mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order));
-	if (zone_page_state(zone, NR_ALLOC_BATCH) == 0 &&
+	if (atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH]) <= 0 &&
 	    !zone_is_fair_depleted(zone))
 		zone_set_flag(zone, ZONE_FAIR_DEPLETED);
 
@@ -5701,9 +5701,8 @@ static void __setup_per_zone_wmarks(void
 		zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1);
 
 		__mod_zone_page_state(zone, NR_ALLOC_BATCH,
-				      high_wmark_pages(zone) -
-				      low_wmark_pages(zone) -
-				      zone_page_state(zone, NR_ALLOC_BATCH));
+			high_wmark_pages(zone) - low_wmark_pages(zone) -
+			atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH]));
 
 		setup_zone_migrate_reserve(zone);
 		spin_unlock_irqrestore(&zone->lock, flags);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/core/skbuff.c linux-libre-3.17-gnu/net/core/skbuff.c
--- linux-libre-3.17-rc7-gnu/net/core/skbuff.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/core/skbuff.c	2014-10-05 15:23:04.000000000 -0400
@@ -3152,6 +3152,9 @@ int skb_gro_receive(struct sk_buff **hea
 		NAPI_GRO_CB(skb)->free = NAPI_GRO_FREE_STOLEN_HEAD;
 		goto done;
 	}
+	/* switch back to head shinfo */
+	pinfo = skb_shinfo(p);
+
 	if (pinfo->frag_list)
 		goto merge;
 	if (skb_gro_len(p) != pinfo->gso_size)
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv4/ip_tunnel.c linux-libre-3.17-gnu/net/ipv4/ip_tunnel.c
--- linux-libre-3.17-rc7-gnu/net/ipv4/ip_tunnel.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv4/ip_tunnel.c	2014-10-05 15:23:04.000000000 -0400
@@ -764,9 +764,14 @@ int ip_tunnel_ioctl(struct net_device *d
 
 		t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type);
 
-		if (!t && (cmd == SIOCADDTUNNEL)) {
-			t = ip_tunnel_create(net, itn, p);
-			err = PTR_ERR_OR_ZERO(t);
+		if (cmd == SIOCADDTUNNEL) {
+			if (!t) {
+				t = ip_tunnel_create(net, itn, p);
+				err = PTR_ERR_OR_ZERO(t);
+				break;
+			}
+
+			err = -EEXIST;
 			break;
 		}
 		if (dev != itn->fb_tunnel_dev && cmd == SIOCCHGTUNNEL) {
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv4/route.c linux-libre-3.17-gnu/net/ipv4/route.c
--- linux-libre-3.17-rc7-gnu/net/ipv4/route.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv4/route.c	2014-10-05 15:23:04.000000000 -0400
@@ -746,7 +746,7 @@ static void __ip_do_redirect(struct rtab
 	}
 
 	n = ipv4_neigh_lookup(&rt->dst, NULL, &new_gw);
-	if (n) {
+	if (!IS_ERR(n)) {
 		if (!(n->nud_state & NUD_VALID)) {
 			neigh_event_send(n, NULL);
 		} else {
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv6/addrconf.c linux-libre-3.17-gnu/net/ipv6/addrconf.c
--- linux-libre-3.17-rc7-gnu/net/ipv6/addrconf.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv6/addrconf.c	2014-10-05 15:23:04.000000000 -0400
@@ -4780,10 +4780,11 @@ static void __ipv6_ifa_notify(int event,
 
 		if (ip6_del_rt(ifp->rt))
 			dst_free(&ifp->rt->dst);
+
+		rt_genid_bump_ipv6(net);
 		break;
 	}
 	atomic_inc(&net->ipv6.dev_addr_genid);
-	rt_genid_bump_ipv6(net);
 }
 
 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv6/addrconf_core.c linux-libre-3.17-gnu/net/ipv6/addrconf_core.c
--- linux-libre-3.17-rc7-gnu/net/ipv6/addrconf_core.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv6/addrconf_core.c	2014-10-05 15:23:04.000000000 -0400
@@ -8,6 +8,13 @@
 #include <net/addrconf.h>
 #include <net/ip.h>
 
+/* if ipv6 module registers this function is used by xfrm to force all
+ * sockets to relookup their nodes - this is fairly expensive, be
+ * careful
+ */
+void (*__fib6_flush_trees)(struct net *);
+EXPORT_SYMBOL(__fib6_flush_trees);
+
 #define IPV6_ADDR_SCOPE_TYPE(scope)	((scope) << 16)
 
 static inline unsigned int ipv6_addr_scope2type(unsigned int scope)
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv6/ip6_fib.c linux-libre-3.17-gnu/net/ipv6/ip6_fib.c
--- linux-libre-3.17-rc7-gnu/net/ipv6/ip6_fib.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv6/ip6_fib.c	2014-10-05 15:23:04.000000000 -0400
@@ -1605,6 +1605,24 @@ static void fib6_prune_clones(struct net
 	fib6_clean_tree(net, fn, fib6_prune_clone, 1, NULL);
 }
 
+static int fib6_update_sernum(struct rt6_info *rt, void *arg)
+{
+	__u32 sernum = *(__u32 *)arg;
+
+	if (rt->rt6i_node &&
+	    rt->rt6i_node->fn_sernum != sernum)
+		rt->rt6i_node->fn_sernum = sernum;
+
+	return 0;
+}
+
+static void fib6_flush_trees(struct net *net)
+{
+	__u32 new_sernum = fib6_new_sernum();
+
+	fib6_clean_all(net, fib6_update_sernum, &new_sernum);
+}
+
 /*
  *	Garbage collection
  */
@@ -1788,6 +1806,8 @@ int __init fib6_init(void)
 			      NULL);
 	if (ret)
 		goto out_unregister_subsys;
+
+	__fib6_flush_trees = fib6_flush_trees;
 out:
 	return ret;
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv6/ip6_gre.c linux-libre-3.17-gnu/net/ipv6/ip6_gre.c
--- linux-libre-3.17-rc7-gnu/net/ipv6/ip6_gre.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv6/ip6_gre.c	2014-10-05 15:23:04.000000000 -0400
@@ -314,6 +314,8 @@ static struct ip6_tnl *ip6gre_tunnel_loc
 	struct ip6gre_net *ign = net_generic(net, ip6gre_net_id);
 
 	t = ip6gre_tunnel_find(net, parms, ARPHRD_IP6GRE);
+	if (t && create)
+		return NULL;
 	if (t || !create)
 		return t;
 
@@ -1724,4 +1726,5 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("D. Kozlov (xeb@mail.ru)");
 MODULE_DESCRIPTION("GRE over IPv6 tunneling device");
 MODULE_ALIAS_RTNL_LINK("ip6gre");
+MODULE_ALIAS_RTNL_LINK("ip6gretap");
 MODULE_ALIAS_NETDEV("ip6gre0");
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv6/ip6_tunnel.c linux-libre-3.17-gnu/net/ipv6/ip6_tunnel.c
--- linux-libre-3.17-rc7-gnu/net/ipv6/ip6_tunnel.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv6/ip6_tunnel.c	2014-10-05 15:23:04.000000000 -0400
@@ -364,8 +364,12 @@ static struct ip6_tnl *ip6_tnl_locate(st
 	     (t = rtnl_dereference(*tp)) != NULL;
 	     tp = &t->next) {
 		if (ipv6_addr_equal(local, &t->parms.laddr) &&
-		    ipv6_addr_equal(remote, &t->parms.raddr))
+		    ipv6_addr_equal(remote, &t->parms.raddr)) {
+			if (create)
+				return NULL;
+
 			return t;
+		}
 	}
 	if (!create)
 		return NULL;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv6/ip6_vti.c linux-libre-3.17-gnu/net/ipv6/ip6_vti.c
--- linux-libre-3.17-rc7-gnu/net/ipv6/ip6_vti.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv6/ip6_vti.c	2014-10-05 15:23:04.000000000 -0400
@@ -253,8 +253,12 @@ static struct ip6_tnl *vti6_locate(struc
 	     (t = rtnl_dereference(*tp)) != NULL;
 	     tp = &t->next) {
 		if (ipv6_addr_equal(local, &t->parms.laddr) &&
-		    ipv6_addr_equal(remote, &t->parms.raddr))
+		    ipv6_addr_equal(remote, &t->parms.raddr)) {
+			if (create)
+				return NULL;
+
 			return t;
+		}
 	}
 	if (!create)
 		return NULL;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/ipv6/route.c linux-libre-3.17-gnu/net/ipv6/route.c
--- linux-libre-3.17-rc7-gnu/net/ipv6/route.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/ipv6/route.c	2014-10-05 15:23:04.000000000 -0400
@@ -314,7 +314,6 @@ static inline struct rt6_info *ip6_dst_a
 
 		memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst));
 		rt6_init_peer(rt, table ? &table->tb6_peers : net->ipv6.peers);
-		rt->rt6i_genid = rt_genid_ipv6(net);
 		INIT_LIST_HEAD(&rt->rt6i_siblings);
 	}
 	return rt;
@@ -1098,9 +1097,6 @@ static struct dst_entry *ip6_dst_check(s
 	 * DST_OBSOLETE_FORCE_CHK which forces validation calls down
 	 * into this function always.
 	 */
-	if (rt->rt6i_genid != rt_genid_ipv6(dev_net(rt->dst.dev)))
-		return NULL;
-
 	if (!rt->rt6i_node || (rt->rt6i_node->fn_sernum != cookie))
 		return NULL;
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/netfilter/Kconfig linux-libre-3.17-gnu/net/netfilter/Kconfig
--- linux-libre-3.17-rc7-gnu/net/netfilter/Kconfig	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/netfilter/Kconfig	2014-10-05 15:23:04.000000000 -0400
@@ -847,6 +847,7 @@ config NETFILTER_XT_TARGET_TPROXY
 	tristate '"TPROXY" target transparent proxying support'
 	depends on NETFILTER_XTABLES
 	depends on NETFILTER_ADVANCED
+	depends on (IPV6 || IPV6=n)
 	depends on IP_NF_MANGLE
 	select NF_DEFRAG_IPV4
 	select NF_DEFRAG_IPV6 if IP6_NF_IPTABLES
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/netfilter/nfnetlink.c linux-libre-3.17-gnu/net/netfilter/nfnetlink.c
--- linux-libre-3.17-rc7-gnu/net/netfilter/nfnetlink.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/netfilter/nfnetlink.c	2014-10-05 15:23:04.000000000 -0400
@@ -222,6 +222,51 @@ replay:
 	}
 }
 
+struct nfnl_err {
+	struct list_head	head;
+	struct nlmsghdr		*nlh;
+	int			err;
+};
+
+static int nfnl_err_add(struct list_head *list, struct nlmsghdr *nlh, int err)
+{
+	struct nfnl_err *nfnl_err;
+
+	nfnl_err = kmalloc(sizeof(struct nfnl_err), GFP_KERNEL);
+	if (nfnl_err == NULL)
+		return -ENOMEM;
+
+	nfnl_err->nlh = nlh;
+	nfnl_err->err = err;
+	list_add_tail(&nfnl_err->head, list);
+
+	return 0;
+}
+
+static void nfnl_err_del(struct nfnl_err *nfnl_err)
+{
+	list_del(&nfnl_err->head);
+	kfree(nfnl_err);
+}
+
+static void nfnl_err_reset(struct list_head *err_list)
+{
+	struct nfnl_err *nfnl_err, *next;
+
+	list_for_each_entry_safe(nfnl_err, next, err_list, head)
+		nfnl_err_del(nfnl_err);
+}
+
+static void nfnl_err_deliver(struct list_head *err_list, struct sk_buff *skb)
+{
+	struct nfnl_err *nfnl_err, *next;
+
+	list_for_each_entry_safe(nfnl_err, next, err_list, head) {
+		netlink_ack(skb, nfnl_err->nlh, nfnl_err->err);
+		nfnl_err_del(nfnl_err);
+	}
+}
+
 static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh,
 				u_int16_t subsys_id)
 {
@@ -230,6 +275,7 @@ static void nfnetlink_rcv_batch(struct s
 	const struct nfnetlink_subsystem *ss;
 	const struct nfnl_callback *nc;
 	bool success = true, done = false;
+	static LIST_HEAD(err_list);
 	int err;
 
 	if (subsys_id >= NFNL_SUBSYS_COUNT)
@@ -287,6 +333,7 @@ replay:
 		type = nlh->nlmsg_type;
 		if (type == NFNL_MSG_BATCH_BEGIN) {
 			/* Malformed: Batch begin twice */
+			nfnl_err_reset(&err_list);
 			success = false;
 			goto done;
 		} else if (type == NFNL_MSG_BATCH_END) {
@@ -333,6 +380,7 @@ replay:
 			 * original skb.
 			 */
 			if (err == -EAGAIN) {
+				nfnl_err_reset(&err_list);
 				ss->abort(skb);
 				nfnl_unlock(subsys_id);
 				kfree_skb(nskb);
@@ -341,11 +389,24 @@ replay:
 		}
 ack:
 		if (nlh->nlmsg_flags & NLM_F_ACK || err) {
+			/* Errors are delivered once the full batch has been
+			 * processed, this avoids that the same error is
+			 * reported several times when replaying the batch.
+			 */
+			if (nfnl_err_add(&err_list, nlh, err) < 0) {
+				/* We failed to enqueue an error, reset the
+				 * list of errors and send OOM to userspace
+				 * pointing to the batch header.
+				 */
+				nfnl_err_reset(&err_list);
+				netlink_ack(skb, nlmsg_hdr(oskb), -ENOMEM);
+				success = false;
+				goto done;
+			}
 			/* We don't stop processing the batch on errors, thus,
 			 * userspace gets all the errors that the batch
 			 * triggers.
 			 */
-			netlink_ack(skb, nlh, err);
 			if (err)
 				success = false;
 		}
@@ -361,6 +422,7 @@ done:
 	else
 		ss->abort(skb);
 
+	nfnl_err_deliver(&err_list, oskb);
 	nfnl_unlock(subsys_id);
 	kfree_skb(nskb);
 }
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/netfilter/nft_hash.c linux-libre-3.17-gnu/net/netfilter/nft_hash.c
--- linux-libre-3.17-rc7-gnu/net/netfilter/nft_hash.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/netfilter/nft_hash.c	2014-10-05 15:23:04.000000000 -0400
@@ -180,15 +180,17 @@ static int nft_hash_init(const struct nf
 static void nft_hash_destroy(const struct nft_set *set)
 {
 	const struct rhashtable *priv = nft_set_priv(set);
-	const struct bucket_table *tbl;
+	const struct bucket_table *tbl = priv->tbl;
 	struct nft_hash_elem *he, *next;
 	unsigned int i;
 
-	tbl = rht_dereference(priv->tbl, priv);
-	for (i = 0; i < tbl->size; i++)
-		rht_for_each_entry_safe(he, next, tbl->buckets[i], priv, node)
+	for (i = 0; i < tbl->size; i++) {
+		for (he = rht_entry(tbl->buckets[i], struct nft_hash_elem, node);
+		     he != NULL; he = next) {
+			next = rht_entry(he->node.next, struct nft_hash_elem, node);
 			nft_hash_elem_destroy(set, he);
-
+		}
+	}
 	rhashtable_destroy(priv);
 }
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/netfilter/nft_rbtree.c linux-libre-3.17-gnu/net/netfilter/nft_rbtree.c
--- linux-libre-3.17-rc7-gnu/net/netfilter/nft_rbtree.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/netfilter/nft_rbtree.c	2014-10-05 15:23:04.000000000 -0400
@@ -234,13 +234,11 @@ static void nft_rbtree_destroy(const str
 	struct nft_rbtree_elem *rbe;
 	struct rb_node *node;
 
-	spin_lock_bh(&nft_rbtree_lock);
 	while ((node = priv->root.rb_node) != NULL) {
 		rb_erase(node, &priv->root);
 		rbe = rb_entry(node, struct nft_rbtree_elem, node);
 		nft_rbtree_elem_destroy(set, rbe);
 	}
-	spin_unlock_bh(&nft_rbtree_lock);
 }
 
 static bool nft_rbtree_estimate(const struct nft_set_desc *desc, u32 features,
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/net/sched/ematch.c linux-libre-3.17-gnu/net/sched/ematch.c
--- linux-libre-3.17-rc7-gnu/net/sched/ematch.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/net/sched/ematch.c	2014-10-05 15:23:04.000000000 -0400
@@ -526,9 +526,11 @@ pop_stack:
 		match_idx = stack[--stackp];
 		cur_match = tcf_em_get_match(tree, match_idx);
 
-		if (tcf_em_early_end(cur_match, res))
+		if (tcf_em_early_end(cur_match, res)) {
+			if (tcf_em_is_inverted(cur_match))
+				res = !res;
 			goto pop_stack;
-		else {
+		} else {
 			match_idx++;
 			goto proceed;
 		}
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/sound/soc/codecs/rt286.c linux-libre-3.17-gnu/sound/soc/codecs/rt286.c
--- linux-libre-3.17-rc7-gnu/sound/soc/codecs/rt286.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/sound/soc/codecs/rt286.c	2014-10-05 15:23:04.000000000 -0400
@@ -51,7 +51,7 @@ static struct reg_default rt286_index_de
 	{ 0x04, 0xaf01 },
 	{ 0x08, 0x000d },
 	{ 0x09, 0xd810 },
-	{ 0x0a, 0x0060 },
+	{ 0x0a, 0x0120 },
 	{ 0x0b, 0x0000 },
 	{ 0x0d, 0x2800 },
 	{ 0x0f, 0x0000 },
@@ -60,7 +60,7 @@ static struct reg_default rt286_index_de
 	{ 0x33, 0x0208 },
 	{ 0x49, 0x0004 },
 	{ 0x4f, 0x50e9 },
-	{ 0x50, 0x2c00 },
+	{ 0x50, 0x2000 },
 	{ 0x63, 0x2902 },
 	{ 0x67, 0x1111 },
 	{ 0x68, 0x1016 },
@@ -104,7 +104,6 @@ static const struct reg_default rt286_re
 	{ 0x02170700, 0x00000000 },
 	{ 0x02270100, 0x00000000 },
 	{ 0x02370100, 0x00000000 },
-	{ 0x02040000, 0x00004002 },
 	{ 0x01870700, 0x00000020 },
 	{ 0x00830000, 0x000000c3 },
 	{ 0x00930000, 0x000000c3 },
@@ -192,7 +191,6 @@ static int rt286_hw_write(void *context,
 	/*handle index registers*/
 	if (reg <= 0xff) {
 		rt286_hw_write(client, RT286_COEF_INDEX, reg);
-		reg = RT286_PROC_COEF;
 		for (i = 0; i < INDEX_CACHE_SIZE; i++) {
 			if (reg == rt286->index_cache[i].reg) {
 				rt286->index_cache[i].def = value;
@@ -200,6 +198,7 @@ static int rt286_hw_write(void *context,
 			}
 
 		}
+		reg = RT286_PROC_COEF;
 	}
 
 	data[0] = (reg >> 24) & 0xff;
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/sound/soc/codecs/ssm2602.c linux-libre-3.17-gnu/sound/soc/codecs/ssm2602.c
--- linux-libre-3.17-rc7-gnu/sound/soc/codecs/ssm2602.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/sound/soc/codecs/ssm2602.c	2014-10-05 15:23:04.000000000 -0400
@@ -647,7 +647,7 @@ int ssm2602_probe(struct device *dev, en
 		return -ENOMEM;
 
 	dev_set_drvdata(dev, ssm2602);
-	ssm2602->type = SSM2602;
+	ssm2602->type = type;
 	ssm2602->regmap = regmap;
 
 	return snd_soc_register_codec(dev, &soc_codec_dev_ssm2602,
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/sound/soc/fsl/fsl_ssi.c linux-libre-3.17-gnu/sound/soc/fsl/fsl_ssi.c
--- linux-libre-3.17-rc7-gnu/sound/soc/fsl/fsl_ssi.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/sound/soc/fsl/fsl_ssi.c	2014-10-05 15:23:04.000000000 -0400
@@ -748,8 +748,9 @@ static int fsl_ssi_hw_free(struct snd_pc
 	return 0;
 }
 
-static int _fsl_ssi_set_dai_fmt(struct fsl_ssi_private *ssi_private,
-		unsigned int fmt)
+static int _fsl_ssi_set_dai_fmt(struct device *dev,
+				struct fsl_ssi_private *ssi_private,
+				unsigned int fmt)
 {
 	struct regmap *regs = ssi_private->regs;
 	u32 strcr = 0, stcr, srcr, scr, mask;
@@ -758,7 +759,7 @@ static int _fsl_ssi_set_dai_fmt(struct f
 	ssi_private->dai_fmt = fmt;
 
 	if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) {
-		dev_err(&ssi_private->pdev->dev, "baudclk is missing which is necessary for master mode\n");
+		dev_err(dev, "baudclk is missing which is necessary for master mode\n");
 		return -EINVAL;
 	}
 
@@ -913,7 +914,7 @@ static int fsl_ssi_set_dai_fmt(struct sn
 {
 	struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
 
-	return _fsl_ssi_set_dai_fmt(ssi_private, fmt);
+	return _fsl_ssi_set_dai_fmt(cpu_dai->dev, ssi_private, fmt);
 }
 
 /**
@@ -1387,7 +1388,8 @@ static int fsl_ssi_probe(struct platform
 
 done:
 	if (ssi_private->dai_fmt)
-		_fsl_ssi_set_dai_fmt(ssi_private, ssi_private->dai_fmt);
+		_fsl_ssi_set_dai_fmt(&pdev->dev, ssi_private,
+				     ssi_private->dai_fmt);
 
 	return 0;
 
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/sound/soc/soc-compress.c linux-libre-3.17-gnu/sound/soc/soc-compress.c
--- linux-libre-3.17-rc7-gnu/sound/soc/soc-compress.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/sound/soc/soc-compress.c	2014-10-05 15:23:04.000000000 -0400
@@ -102,13 +102,11 @@ static int soc_compr_open_fe(struct snd_
 	fe->dpcm[stream].runtime = fe_substream->runtime;
 
 	ret = dpcm_path_get(fe, stream, &list);
-	if (ret < 0) {
-		mutex_unlock(&fe->card->mutex);
+	if (ret < 0)
 		goto fe_err;
-	} else if (ret == 0) {
+	else if (ret == 0)
 		dev_dbg(fe->dev, "ASoC: %s no valid %s route\n",
 			fe->dai_link->name, stream ? "capture" : "playback");
-	}
 
 	/* calculate valid and active FE <-> BE dpcms */
 	dpcm_process_paths(fe, stream, &list, 1);
diff -druNp --no-dereference linux-libre-3.17-rc7-gnu/sound/soc/soc-core.c linux-libre-3.17-gnu/sound/soc/soc-core.c
--- linux-libre-3.17-rc7-gnu/sound/soc/soc-core.c	2014-09-28 17:29:07.000000000 -0400
+++ linux-libre-3.17-gnu/sound/soc/soc-core.c	2014-10-05 15:23:04.000000000 -0400
@@ -3203,7 +3203,7 @@ int snd_soc_bytes_put(struct snd_kcontro
 	unsigned int val, mask;
 	void *data;
 
-	if (!component->regmap)
+	if (!component->regmap || !params->num_regs)
 		return -EINVAL;
 
 	len = params->num_regs * component->val_bytes;
