diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/arm/boot/dts/imx53-qsb.dts linux-libre-4.8.11-gnu/arch/arm/boot/dts/imx53-qsb.dts
--- linux-libre-4.8.10-gnu/arch/arm/boot/dts/imx53-qsb.dts	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/arm/boot/dts/imx53-qsb.dts	2016-11-26 03:57:13.000000000 -0500
@@ -64,8 +64,8 @@
 			};
 
 			ldo3_reg: ldo3 {
-				regulator-min-microvolt = <600000>;
-				regulator-max-microvolt = <1800000>;
+				regulator-min-microvolt = <1725000>;
+				regulator-max-microvolt = <3300000>;
 				regulator-always-on;
 			};
 
@@ -76,8 +76,8 @@
 			};
 
 			ldo5_reg: ldo5 {
-				regulator-min-microvolt = <1725000>;
-				regulator-max-microvolt = <3300000>;
+				regulator-min-microvolt = <1200000>;
+				regulator-max-microvolt = <3600000>;
 				regulator-always-on;
 			};
 
@@ -100,14 +100,14 @@
 			};
 
 			ldo9_reg: ldo9 {
-				regulator-min-microvolt = <1200000>;
+				regulator-min-microvolt = <1250000>;
 				regulator-max-microvolt = <3600000>;
 				regulator-always-on;
 			};
 
 			ldo10_reg: ldo10 {
-				regulator-min-microvolt = <1250000>;
-				regulator-max-microvolt = <3650000>;
+				regulator-min-microvolt = <1200000>;
+				regulator-max-microvolt = <3600000>;
 				regulator-always-on;
 			};
 		};
diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/arm64/include/asm/perf_event.h linux-libre-4.8.11-gnu/arch/arm64/include/asm/perf_event.h
--- linux-libre-4.8.10-gnu/arch/arm64/include/asm/perf_event.h	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/arm64/include/asm/perf_event.h	2016-11-26 03:57:13.000000000 -0500
@@ -46,7 +46,15 @@
 #define	ARMV8_PMU_EVTYPE_MASK	0xc800ffff	/* Mask for writable bits */
 #define	ARMV8_PMU_EVTYPE_EVENT	0xffff		/* Mask for EVENT bits */
 
-#define ARMV8_PMU_EVTYPE_EVENT_SW_INCR	0	/* Software increment event */
+/*
+ * PMUv3 event types: required events
+ */
+#define ARMV8_PMUV3_PERFCTR_SW_INCR				0x00
+#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL			0x03
+#define ARMV8_PMUV3_PERFCTR_L1D_CACHE				0x04
+#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED				0x10
+#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES				0x11
+#define ARMV8_PMUV3_PERFCTR_BR_PRED				0x12
 
 /*
  * Event filters for PMUv3
diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/arm64/kernel/perf_event.c linux-libre-4.8.11-gnu/arch/arm64/kernel/perf_event.c
--- linux-libre-4.8.10-gnu/arch/arm64/kernel/perf_event.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/arm64/kernel/perf_event.c	2016-11-26 03:57:13.000000000 -0500
@@ -30,17 +30,9 @@
 
 /*
  * ARMv8 PMUv3 Performance Events handling code.
- * Common event types.
+ * Common event types (some are defined in asm/perf_event.h).
  */
 
-/* Required events. */
-#define ARMV8_PMUV3_PERFCTR_SW_INCR				0x00
-#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL			0x03
-#define ARMV8_PMUV3_PERFCTR_L1D_CACHE				0x04
-#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED				0x10
-#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES				0x11
-#define ARMV8_PMUV3_PERFCTR_BR_PRED				0x12
-
 /* At least one of the following is required. */
 #define ARMV8_PMUV3_PERFCTR_INST_RETIRED			0x08
 #define ARMV8_PMUV3_PERFCTR_INST_SPEC				0x1B
diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/arm64/kvm/sys_regs.c linux-libre-4.8.11-gnu/arch/arm64/kvm/sys_regs.c
--- linux-libre-4.8.10-gnu/arch/arm64/kvm/sys_regs.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/arm64/kvm/sys_regs.c	2016-11-26 03:57:13.000000000 -0500
@@ -602,8 +602,14 @@ static bool access_pmu_evcntr(struct kvm
 
 			idx = ARMV8_PMU_CYCLE_IDX;
 		} else {
-			BUG();
+			return false;
 		}
+	} else if (r->CRn == 0 && r->CRm == 9) {
+		/* PMCCNTR */
+		if (pmu_access_event_counter_el0_disabled(vcpu))
+			return false;
+
+		idx = ARMV8_PMU_CYCLE_IDX;
 	} else if (r->CRn == 14 && (r->CRm & 12) == 8) {
 		/* PMEVCNTRn_EL0 */
 		if (pmu_access_event_counter_el0_disabled(vcpu))
@@ -611,7 +617,7 @@ static bool access_pmu_evcntr(struct kvm
 
 		idx = ((r->CRm & 3) << 3) | (r->Op2 & 7);
 	} else {
-		BUG();
+		return false;
 	}
 
 	if (!pmu_counter_idx_valid(vcpu, idx))
diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/powerpc/kernel/setup_64.c linux-libre-4.8.11-gnu/arch/powerpc/kernel/setup_64.c
--- linux-libre-4.8.10-gnu/arch/powerpc/kernel/setup_64.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/powerpc/kernel/setup_64.c	2016-11-26 03:57:13.000000000 -0500
@@ -226,17 +226,25 @@ static void __init configure_exceptions(
 		if (firmware_has_feature(FW_FEATURE_OPAL))
 			opal_configure_cores();
 
-		/* Enable AIL if supported, and we are in hypervisor mode */
-		if (early_cpu_has_feature(CPU_FTR_HVMODE) &&
-		    early_cpu_has_feature(CPU_FTR_ARCH_207S)) {
-			unsigned long lpcr = mfspr(SPRN_LPCR);
-			mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
-		}
+		/* AIL on native is done in cpu_ready_for_interrupts() */
 	}
 }
 
 static void cpu_ready_for_interrupts(void)
 {
+	/*
+	 * Enable AIL if supported, and we are in hypervisor mode. This
+	 * is called once for every processor.
+	 *
+	 * If we are not in hypervisor mode the job is done once for
+	 * the whole partition in configure_exceptions().
+	 */
+	if (early_cpu_has_feature(CPU_FTR_HVMODE) &&
+	    early_cpu_has_feature(CPU_FTR_ARCH_207S)) {
+		unsigned long lpcr = mfspr(SPRN_LPCR);
+		mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
+	}
+
 	/* Set IR and DR in PACA MSR */
 	get_paca()->kernel_msr = MSR_KERNEL;
 }
diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/x86/kernel/cpu/amd.c linux-libre-4.8.11-gnu/arch/x86/kernel/cpu/amd.c
--- linux-libre-4.8.10-gnu/arch/x86/kernel/cpu/amd.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/x86/kernel/cpu/amd.c	2016-11-26 03:57:13.000000000 -0500
@@ -347,7 +347,6 @@ static void amd_detect_cmp(struct cpuinf
 #ifdef CONFIG_SMP
 	unsigned bits;
 	int cpu = smp_processor_id();
-	unsigned int socket_id, core_complex_id;
 
 	bits = c->x86_coreid_bits;
 	/* Low order bits define the core id (index of core in socket) */
@@ -365,10 +364,7 @@ static void amd_detect_cmp(struct cpuinf
 	 if (c->x86 != 0x17 || !cpuid_edx(0x80000006))
 		return;
 
-	socket_id	= (c->apicid >> bits) - 1;
-	core_complex_id	= (c->apicid & ((1 << bits) - 1)) >> 3;
-
-	per_cpu(cpu_llc_id, cpu) = (socket_id << 3) | core_complex_id;
+	per_cpu(cpu_llc_id, cpu) = c->apicid >> 3;
 #endif
 }
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/x86/kvm/x86.c linux-libre-4.8.11-gnu/arch/x86/kvm/x86.c
--- linux-libre-4.8.10-gnu/arch/x86/kvm/x86.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/x86/kvm/x86.c	2016-11-26 03:57:13.000000000 -0500
@@ -210,7 +210,18 @@ static void kvm_on_user_return(struct us
 	struct kvm_shared_msrs *locals
 		= container_of(urn, struct kvm_shared_msrs, urn);
 	struct kvm_shared_msr_values *values;
+	unsigned long flags;
 
+	/*
+	 * Disabling irqs at this point since the following code could be
+	 * interrupted and executed through kvm_arch_hardware_disable()
+	 */
+	local_irq_save(flags);
+	if (locals->registered) {
+		locals->registered = false;
+		user_return_notifier_unregister(urn);
+	}
+	local_irq_restore(flags);
 	for (slot = 0; slot < shared_msrs_global.nr; ++slot) {
 		values = &locals->values[slot];
 		if (values->host != values->curr) {
@@ -218,8 +229,6 @@ static void kvm_on_user_return(struct us
 			values->curr = values->host;
 		}
 	}
-	locals->registered = false;
-	user_return_notifier_unregister(urn);
 }
 
 static void shared_msr_update(unsigned slot, u32 msr)
@@ -3372,6 +3381,7 @@ long kvm_arch_vcpu_ioctl(struct file *fi
 	};
 	case KVM_SET_VAPIC_ADDR: {
 		struct kvm_vapic_addr va;
+		int idx;
 
 		r = -EINVAL;
 		if (!lapic_in_kernel(vcpu))
@@ -3379,7 +3389,9 @@ long kvm_arch_vcpu_ioctl(struct file *fi
 		r = -EFAULT;
 		if (copy_from_user(&va, argp, sizeof va))
 			goto out;
+		idx = srcu_read_lock(&vcpu->kvm->srcu);
 		r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr);
+		srcu_read_unlock(&vcpu->kvm->srcu, idx);
 		break;
 	}
 	case KVM_X86_SETUP_MCE: {
diff -druNp --no-dereference linux-libre-4.8.10-gnu/arch/x86/purgatory/Makefile linux-libre-4.8.11-gnu/arch/x86/purgatory/Makefile
--- linux-libre-4.8.10-gnu/arch/x86/purgatory/Makefile	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/arch/x86/purgatory/Makefile	2016-11-26 03:57:13.000000000 -0500
@@ -16,6 +16,7 @@ KCOV_INSTRUMENT := n
 
 KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -MD -Os -mcmodel=large
 KBUILD_CFLAGS += -m$(BITS)
+KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
 
 $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE
 		$(call if_changed,ld)
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/base/power/main.c linux-libre-4.8.11-gnu/drivers/base/power/main.c
--- linux-libre-4.8.10-gnu/drivers/base/power/main.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/base/power/main.c	2016-11-26 03:57:13.000000000 -0500
@@ -1027,6 +1027,8 @@ static int __device_suspend_noirq(struct
 	TRACE_DEVICE(dev);
 	TRACE_SUSPEND(0);
 
+	dpm_wait_for_children(dev, async);
+
 	if (async_error)
 		goto Complete;
 
@@ -1038,8 +1040,6 @@ static int __device_suspend_noirq(struct
 	if (dev->power.syscore || dev->power.direct_complete)
 		goto Complete;
 
-	dpm_wait_for_children(dev, async);
-
 	if (dev->pm_domain) {
 		info = "noirq power domain ";
 		callback = pm_noirq_op(&dev->pm_domain->ops, state);
@@ -1174,6 +1174,8 @@ static int __device_suspend_late(struct
 
 	__pm_runtime_disable(dev, false);
 
+	dpm_wait_for_children(dev, async);
+
 	if (async_error)
 		goto Complete;
 
@@ -1185,8 +1187,6 @@ static int __device_suspend_late(struct
 	if (dev->power.syscore || dev->power.direct_complete)
 		goto Complete;
 
-	dpm_wait_for_children(dev, async);
-
 	if (dev->pm_domain) {
 		info = "late power domain ";
 		callback = pm_late_early_op(&dev->pm_domain->ops, state);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/clk/imx/clk-pllv3.c linux-libre-4.8.11-gnu/drivers/clk/imx/clk-pllv3.c
--- linux-libre-4.8.10-gnu/drivers/clk/imx/clk-pllv3.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/clk/imx/clk-pllv3.c	2016-11-26 03:57:13.000000000 -0500
@@ -223,7 +223,7 @@ static unsigned long clk_pllv3_av_recalc
 	temp64 *= mfn;
 	do_div(temp64, mfd);
 
-	return (parent_rate * div) + (u32)temp64;
+	return parent_rate * div + (unsigned long)temp64;
 }
 
 static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
@@ -247,7 +247,11 @@ static long clk_pllv3_av_round_rate(stru
 	do_div(temp64, parent_rate);
 	mfn = temp64;
 
-	return parent_rate * div + parent_rate * mfn / mfd;
+	temp64 = (u64)parent_rate;
+	temp64 *= mfn;
+	do_div(temp64, mfd);
+
+	return parent_rate * div + (unsigned long)temp64;
 }
 
 static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/clk/mmp/clk-of-mmp2.c linux-libre-4.8.11-gnu/drivers/clk/mmp/clk-of-mmp2.c
--- linux-libre-4.8.10-gnu/drivers/clk/mmp/clk-of-mmp2.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/clk/mmp/clk-of-mmp2.c	2016-11-26 03:57:13.000000000 -0500
@@ -313,7 +313,7 @@ static void __init mmp2_clk_init(struct
 	}
 
 	pxa_unit->apmu_base = of_iomap(np, 1);
-	if (!pxa_unit->mpmu_base) {
+	if (!pxa_unit->apmu_base) {
 		pr_err("failed to map apmu registers\n");
 		return;
 	}
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/clk/mmp/clk-of-pxa168.c linux-libre-4.8.11-gnu/drivers/clk/mmp/clk-of-pxa168.c
--- linux-libre-4.8.10-gnu/drivers/clk/mmp/clk-of-pxa168.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/clk/mmp/clk-of-pxa168.c	2016-11-26 03:57:13.000000000 -0500
@@ -262,7 +262,7 @@ static void __init pxa168_clk_init(struc
 	}
 
 	pxa_unit->apmu_base = of_iomap(np, 1);
-	if (!pxa_unit->mpmu_base) {
+	if (!pxa_unit->apmu_base) {
 		pr_err("failed to map apmu registers\n");
 		return;
 	}
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/clk/mmp/clk-of-pxa910.c linux-libre-4.8.11-gnu/drivers/clk/mmp/clk-of-pxa910.c
--- linux-libre-4.8.10-gnu/drivers/clk/mmp/clk-of-pxa910.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/clk/mmp/clk-of-pxa910.c	2016-11-26 03:57:13.000000000 -0500
@@ -282,7 +282,7 @@ static void __init pxa910_clk_init(struc
 	}
 
 	pxa_unit->apmu_base = of_iomap(np, 1);
-	if (!pxa_unit->mpmu_base) {
+	if (!pxa_unit->apmu_base) {
 		pr_err("failed to map apmu registers\n");
 		return;
 	}
@@ -294,7 +294,7 @@ static void __init pxa910_clk_init(struc
 	}
 
 	pxa_unit->apbcp_base = of_iomap(np, 3);
-	if (!pxa_unit->mpmu_base) {
+	if (!pxa_unit->apbcp_base) {
 		pr_err("failed to map apbcp registers\n");
 		return;
 	}
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/crypto/caam/caamalg.c linux-libre-4.8.11-gnu/drivers/crypto/caam/caamalg.c
--- linux-libre-4.8.10-gnu/drivers/crypto/caam/caamalg.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/crypto/caam/caamalg.c	2016-11-26 03:57:13.000000000 -0500
@@ -4542,6 +4542,15 @@ static int __init caam_algapi_init(void)
 		if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
 				continue;
 
+		/*
+		 * Check support for AES modes not available
+		 * on LP devices.
+		 */
+		if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP)
+			if ((alg->class1_alg_type & OP_ALG_AAI_MASK) ==
+			     OP_ALG_AAI_XTS)
+				continue;
+
 		t_alg = caam_alg_alloc(alg);
 		if (IS_ERR(t_alg)) {
 			err = PTR_ERR(t_alg);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpio/gpiolib.c linux-libre-4.8.11-gnu/drivers/gpio/gpiolib.c
--- linux-libre-4.8.10-gnu/drivers/gpio/gpiolib.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpio/gpiolib.c	2016-11-26 03:57:13.000000000 -0500
@@ -2667,8 +2667,11 @@ int gpiochip_lock_as_irq(struct gpio_chi
 	if (IS_ERR(desc))
 		return PTR_ERR(desc);
 
-	/* Flush direction if something changed behind our back */
-	if (chip->get_direction) {
+	/*
+	 * If it's fast: flush the direction setting if something changed
+	 * behind our back
+	 */
+	if (!chip->can_sleep && chip->get_direction) {
 		int dir = chip->get_direction(chip, offset);
 
 		if (dir)
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpio/gpio-pca953x.c linux-libre-4.8.11-gnu/drivers/gpio/gpio-pca953x.c
--- linux-libre-4.8.10-gnu/drivers/gpio/gpio-pca953x.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpio/gpio-pca953x.c	2016-11-26 03:57:13.000000000 -0500
@@ -372,14 +372,15 @@ static void pca953x_gpio_set_multiple(st
 		break;
 	}
 
-	memcpy(reg_val, chip->reg_output, NBANK(chip));
 	mutex_lock(&chip->i2c_lock);
+	memcpy(reg_val, chip->reg_output, NBANK(chip));
 	for(bank=0; bank<NBANK(chip); bank++) {
 		unsigned bankmask = mask[bank / sizeof(*mask)] >>
 				    ((bank % sizeof(*mask)) * 8);
 		if(bankmask) {
 			unsigned bankval  = bits[bank / sizeof(*bits)] >>
 					    ((bank % sizeof(*bits)) * 8);
+			bankval &= bankmask;
 			reg_val[bank] = (reg_val[bank] & ~bankmask) | bankval;
 		}
 	}
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c linux-libre-4.8.11-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
--- linux-libre-4.8.10-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c	2016-11-26 03:57:13.000000000 -0500
@@ -132,7 +132,7 @@ static int amdgpu_bo_list_set(struct amd
 		entry->priority = min(info[i].bo_priority,
 				      AMDGPU_BO_LIST_MAX_PRIORITY);
 		entry->tv.bo = &entry->robj->tbo;
-		entry->tv.shared = true;
+		entry->tv.shared = !entry->robj->prime_shared_count;
 
 		if (entry->robj->prefered_domains == AMDGPU_GEM_DOMAIN_GDS)
 			gds_obj = entry->robj;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu.h linux-libre-4.8.11-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu.h
--- linux-libre-4.8.10-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu.h	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu.h	2016-11-26 03:57:13.000000000 -0500
@@ -492,6 +492,7 @@ struct amdgpu_bo {
 	u64				metadata_flags;
 	void				*metadata;
 	u32				metadata_size;
+	unsigned			prime_shared_count;
 	/* list of all virtual address to which this bo
 	 * is associated to
 	 */
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c linux-libre-4.8.11-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
--- linux-libre-4.8.10-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c	2016-11-26 03:57:13.000000000 -0500
@@ -74,20 +74,36 @@ amdgpu_gem_prime_import_sg_table(struct
 	if (ret)
 		return ERR_PTR(ret);
 
+	bo->prime_shared_count = 1;
 	return &bo->gem_base;
 }
 
 int amdgpu_gem_prime_pin(struct drm_gem_object *obj)
 {
 	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
-	int ret = 0;
+	long ret = 0;
 
 	ret = amdgpu_bo_reserve(bo, false);
 	if (unlikely(ret != 0))
 		return ret;
 
+	/*
+	 * Wait for all shared fences to complete before we switch to future
+	 * use of exclusive fence on this prime shared bo.
+	 */
+	ret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
+						  MAX_SCHEDULE_TIMEOUT);
+	if (unlikely(ret < 0)) {
+		DRM_DEBUG_PRIME("Fence wait failed: %li\n", ret);
+		amdgpu_bo_unreserve(bo);
+		return ret;
+	}
+
 	/* pin buffer into GTT */
 	ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL);
+	if (likely(ret == 0))
+		bo->prime_shared_count++;
+
 	amdgpu_bo_unreserve(bo);
 	return ret;
 }
@@ -102,6 +118,8 @@ void amdgpu_gem_prime_unpin(struct drm_g
 		return;
 
 	amdgpu_bo_unpin(bo);
+	if (bo->prime_shared_count)
+		bo->prime_shared_count--;
 	amdgpu_bo_unreserve(bo);
 }
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpu/drm/i915/intel_bios.c linux-libre-4.8.11-gnu/drivers/gpu/drm/i915/intel_bios.c
--- linux-libre-4.8.10-gnu/drivers/gpu/drm/i915/intel_bios.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpu/drm/i915/intel_bios.c	2016-11-26 03:57:13.000000000 -0500
@@ -1143,7 +1143,7 @@ static void parse_ddi_port(struct drm_i9
 	if (!child)
 		return;
 
-	aux_channel = child->raw[25];
+	aux_channel = child->common.aux_channel;
 	ddc_pin = child->common.ddc_pin;
 
 	is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING;
@@ -1673,7 +1673,8 @@ bool intel_bios_is_port_edp(struct drm_i
 	return false;
 }
 
-bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum port port)
+static bool child_dev_is_dp_dual_mode(const union child_device_config *p_child,
+				      enum port port)
 {
 	static const struct {
 		u16 dp, hdmi;
@@ -1687,22 +1688,35 @@ bool intel_bios_is_port_dp_dual_mode(str
 		[PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, },
 		[PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, },
 	};
-	int i;
 
 	if (port == PORT_A || port >= ARRAY_SIZE(port_mapping))
 		return false;
 
-	if (!dev_priv->vbt.child_dev_num)
+	if ((p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) !=
+	    (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS))
 		return false;
 
+	if (p_child->common.dvo_port == port_mapping[port].dp)
+		return true;
+
+	/* Only accept a HDMI dvo_port as DP++ if it has an AUX channel */
+	if (p_child->common.dvo_port == port_mapping[port].hdmi &&
+	    p_child->common.aux_channel != 0)
+		return true;
+
+	return false;
+}
+
+bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv,
+				     enum port port)
+{
+	int i;
+
 	for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
 		const union child_device_config *p_child =
 			&dev_priv->vbt.child_dev[i];
 
-		if ((p_child->common.dvo_port == port_mapping[port].dp ||
-		     p_child->common.dvo_port == port_mapping[port].hdmi) &&
-		    (p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) ==
-		    (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS))
+		if (child_dev_is_dp_dual_mode(p_child, port))
 			return true;
 	}
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpu/drm/i915/intel_dp.c linux-libre-4.8.11-gnu/drivers/gpu/drm/i915/intel_dp.c
--- linux-libre-4.8.10-gnu/drivers/gpu/drm/i915/intel_dp.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpu/drm/i915/intel_dp.c	2016-11-26 03:57:13.000000000 -0500
@@ -4323,21 +4323,11 @@ static enum drm_connector_status
 intel_dp_detect(struct drm_connector *connector, bool force)
 {
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
-	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-	struct intel_encoder *intel_encoder = &intel_dig_port->base;
 	enum drm_connector_status status = connector->status;
 
 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 		      connector->base.id, connector->name);
 
-	if (intel_dp->is_mst) {
-		/* MST devices are disconnected from a monitor POV */
-		intel_dp_unset_edid(intel_dp);
-		if (intel_encoder->type != INTEL_OUTPUT_EDP)
-			intel_encoder->type = INTEL_OUTPUT_DP;
-		return connector_status_disconnected;
-	}
-
 	/* If full detect is not performed yet, do a full detect */
 	if (!intel_dp->detect_done)
 		status = intel_dp_long_pulse(intel_dp->attached_connector);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/gpu/drm/i915/intel_vbt_defs.h linux-libre-4.8.11-gnu/drivers/gpu/drm/i915/intel_vbt_defs.h
--- linux-libre-4.8.10-gnu/drivers/gpu/drm/i915/intel_vbt_defs.h	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/gpu/drm/i915/intel_vbt_defs.h	2016-11-26 03:57:13.000000000 -0500
@@ -280,7 +280,8 @@ struct common_child_dev_config {
 	u8 dp_support:1;
 	u8 tmds_support:1;
 	u8 support_reserved:5;
-	u8 not_common3[12];
+	u8 aux_channel;
+	u8 not_common3[11];
 	u8 iboost_level;
 } __packed;
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/i2c/Kconfig linux-libre-4.8.11-gnu/drivers/i2c/Kconfig
--- linux-libre-4.8.10-gnu/drivers/i2c/Kconfig	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/i2c/Kconfig	2016-11-26 03:57:13.000000000 -0500
@@ -59,7 +59,6 @@ config I2C_CHARDEV
 
 config I2C_MUX
 	tristate "I2C bus multiplexing support"
-	depends on HAS_IOMEM
 	help
 	  Say Y here if you want the I2C core to support the ability to
 	  handle multiplexed I2C bus topologies, by presenting each
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/i2c/muxes/i2c-mux-pca954x.c linux-libre-4.8.11-gnu/drivers/i2c/muxes/i2c-mux-pca954x.c
--- linux-libre-4.8.10-gnu/drivers/i2c/muxes/i2c-mux-pca954x.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/i2c/muxes/i2c-mux-pca954x.c	2016-11-26 03:57:13.000000000 -0500
@@ -247,9 +247,9 @@ static int pca954x_probe(struct i2c_clie
 				/* discard unconfigured channels */
 				break;
 			idle_disconnect_pd = pdata->modes[num].deselect_on_exit;
-			data->deselect |= (idle_disconnect_pd
-					   || idle_disconnect_dt) << num;
 		}
+		data->deselect |= (idle_disconnect_pd ||
+				   idle_disconnect_dt) << num;
 
 		ret = i2c_mux_add_adapter(muxc, force, num, class);
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/i2c/muxes/Kconfig linux-libre-4.8.11-gnu/drivers/i2c/muxes/Kconfig
--- linux-libre-4.8.10-gnu/drivers/i2c/muxes/Kconfig	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/i2c/muxes/Kconfig	2016-11-26 03:57:13.000000000 -0500
@@ -63,6 +63,7 @@ config I2C_MUX_PINCTRL
 
 config I2C_MUX_REG
 	tristate "Register-based I2C multiplexer"
+	depends on HAS_IOMEM
 	help
 	  If you say yes to this option, support will be included for a
 	  register based I2C multiplexer. This driver provides access to
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/core/cm.c linux-libre-4.8.11-gnu/drivers/infiniband/core/cm.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/core/cm.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/core/cm.c	2016-11-26 03:57:13.000000000 -0500
@@ -80,6 +80,8 @@ static struct ib_cm {
 	__be32 random_id_operand;
 	struct list_head timewait_list;
 	struct workqueue_struct *wq;
+	/* Sync on cm change port state */
+	spinlock_t state_lock;
 } cm;
 
 /* Counter indexes ordered by attribute ID */
@@ -161,6 +163,8 @@ struct cm_port {
 	struct ib_mad_agent *mad_agent;
 	struct kobject port_obj;
 	u8 port_num;
+	struct list_head cm_priv_prim_list;
+	struct list_head cm_priv_altr_list;
 	struct cm_counter_group counter_group[CM_COUNTER_GROUPS];
 };
 
@@ -241,6 +245,12 @@ struct cm_id_private {
 	u8 service_timeout;
 	u8 target_ack_delay;
 
+	struct list_head prim_list;
+	struct list_head altr_list;
+	/* Indicates that the send port mad is registered and av is set */
+	int prim_send_port_not_ready;
+	int altr_send_port_not_ready;
+
 	struct list_head work_list;
 	atomic_t work_count;
 };
@@ -259,20 +269,47 @@ static int cm_alloc_msg(struct cm_id_pri
 	struct ib_mad_agent *mad_agent;
 	struct ib_mad_send_buf *m;
 	struct ib_ah *ah;
+	struct cm_av *av;
+	unsigned long flags, flags2;
+	int ret = 0;
 
+	/* don't let the port to be released till the agent is down */
+	spin_lock_irqsave(&cm.state_lock, flags2);
+	spin_lock_irqsave(&cm.lock, flags);
+	if (!cm_id_priv->prim_send_port_not_ready)
+		av = &cm_id_priv->av;
+	else if (!cm_id_priv->altr_send_port_not_ready &&
+		 (cm_id_priv->alt_av.port))
+		av = &cm_id_priv->alt_av;
+	else {
+		pr_info("%s: not valid CM id\n", __func__);
+		ret = -ENODEV;
+		spin_unlock_irqrestore(&cm.lock, flags);
+		goto out;
+	}
+	spin_unlock_irqrestore(&cm.lock, flags);
+	/* Make sure the port haven't released the mad yet */
 	mad_agent = cm_id_priv->av.port->mad_agent;
-	ah = ib_create_ah(mad_agent->qp->pd, &cm_id_priv->av.ah_attr);
-	if (IS_ERR(ah))
-		return PTR_ERR(ah);
+	if (!mad_agent) {
+		pr_info("%s: not a valid MAD agent\n", __func__);
+		ret = -ENODEV;
+		goto out;
+	}
+	ah = ib_create_ah(mad_agent->qp->pd, &av->ah_attr);
+	if (IS_ERR(ah)) {
+		ret = PTR_ERR(ah);
+		goto out;
+	}
 
 	m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn,
-			       cm_id_priv->av.pkey_index,
+			       av->pkey_index,
 			       0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
 			       GFP_ATOMIC,
 			       IB_MGMT_BASE_VERSION);
 	if (IS_ERR(m)) {
 		ib_destroy_ah(ah);
-		return PTR_ERR(m);
+		ret = PTR_ERR(m);
+		goto out;
 	}
 
 	/* Timeout set by caller if response is expected. */
@@ -282,7 +319,10 @@ static int cm_alloc_msg(struct cm_id_pri
 	atomic_inc(&cm_id_priv->refcount);
 	m->context[0] = cm_id_priv;
 	*msg = m;
-	return 0;
+
+out:
+	spin_unlock_irqrestore(&cm.state_lock, flags2);
+	return ret;
 }
 
 static int cm_alloc_response_msg(struct cm_port *port,
@@ -352,7 +392,8 @@ static void cm_init_av_for_response(stru
 			   grh, &av->ah_attr);
 }
 
-static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
+static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av,
+			      struct cm_id_private *cm_id_priv)
 {
 	struct cm_device *cm_dev;
 	struct cm_port *port = NULL;
@@ -387,7 +428,17 @@ static int cm_init_av_by_path(struct ib_
 			     &av->ah_attr);
 	av->timeout = path->packet_life_time + 1;
 
-	return 0;
+	spin_lock_irqsave(&cm.lock, flags);
+	if (&cm_id_priv->av == av)
+		list_add_tail(&cm_id_priv->prim_list, &port->cm_priv_prim_list);
+	else if (&cm_id_priv->alt_av == av)
+		list_add_tail(&cm_id_priv->altr_list, &port->cm_priv_altr_list);
+	else
+		ret = -EINVAL;
+
+	spin_unlock_irqrestore(&cm.lock, flags);
+
+	return ret;
 }
 
 static int cm_alloc_id(struct cm_id_private *cm_id_priv)
@@ -677,6 +728,8 @@ struct ib_cm_id *ib_create_cm_id(struct
 	spin_lock_init(&cm_id_priv->lock);
 	init_completion(&cm_id_priv->comp);
 	INIT_LIST_HEAD(&cm_id_priv->work_list);
+	INIT_LIST_HEAD(&cm_id_priv->prim_list);
+	INIT_LIST_HEAD(&cm_id_priv->altr_list);
 	atomic_set(&cm_id_priv->work_count, -1);
 	atomic_set(&cm_id_priv->refcount, 1);
 	return &cm_id_priv->id;
@@ -892,6 +945,15 @@ retest:
 		break;
 	}
 
+	spin_lock_irq(&cm.lock);
+	if (!list_empty(&cm_id_priv->altr_list) &&
+	    (!cm_id_priv->altr_send_port_not_ready))
+		list_del(&cm_id_priv->altr_list);
+	if (!list_empty(&cm_id_priv->prim_list) &&
+	    (!cm_id_priv->prim_send_port_not_ready))
+		list_del(&cm_id_priv->prim_list);
+	spin_unlock_irq(&cm.lock);
+
 	cm_free_id(cm_id->local_id);
 	cm_deref_id(cm_id_priv);
 	wait_for_completion(&cm_id_priv->comp);
@@ -1192,12 +1254,13 @@ int ib_send_cm_req(struct ib_cm_id *cm_i
 		goto out;
 	}
 
-	ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
+	ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av,
+				 cm_id_priv);
 	if (ret)
 		goto error1;
 	if (param->alternate_path) {
 		ret = cm_init_av_by_path(param->alternate_path,
-					 &cm_id_priv->alt_av);
+					 &cm_id_priv->alt_av, cm_id_priv);
 		if (ret)
 			goto error1;
 	}
@@ -1653,7 +1716,8 @@ static int cm_req_handler(struct cm_work
 			dev_put(gid_attr.ndev);
 		}
 		work->path[0].gid_type = gid_attr.gid_type;
-		ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
+		ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av,
+					 cm_id_priv);
 	}
 	if (ret) {
 		int err = ib_get_cached_gid(work->port->cm_dev->ib_device,
@@ -1672,7 +1736,8 @@ static int cm_req_handler(struct cm_work
 		goto rejected;
 	}
 	if (req_msg->alt_local_lid) {
-		ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av);
+		ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av,
+					 cm_id_priv);
 		if (ret) {
 			ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID,
 				       &work->path[0].sgid,
@@ -2727,7 +2792,8 @@ int ib_send_cm_lap(struct ib_cm_id *cm_i
 		goto out;
 	}
 
-	ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av);
+	ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av,
+				 cm_id_priv);
 	if (ret)
 		goto out;
 	cm_id_priv->alt_av.timeout =
@@ -2839,7 +2905,8 @@ static int cm_lap_handler(struct cm_work
 	cm_init_av_for_response(work->port, work->mad_recv_wc->wc,
 				work->mad_recv_wc->recv_buf.grh,
 				&cm_id_priv->av);
-	cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av);
+	cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av,
+			   cm_id_priv);
 	ret = atomic_inc_and_test(&cm_id_priv->work_count);
 	if (!ret)
 		list_add_tail(&work->list, &cm_id_priv->work_list);
@@ -3031,7 +3098,7 @@ int ib_send_cm_sidr_req(struct ib_cm_id
 		return -EINVAL;
 
 	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
-	ret = cm_init_av_by_path(param->path, &cm_id_priv->av);
+	ret = cm_init_av_by_path(param->path, &cm_id_priv->av, cm_id_priv);
 	if (ret)
 		goto out;
 
@@ -3468,7 +3535,9 @@ out:
 static int cm_migrate(struct ib_cm_id *cm_id)
 {
 	struct cm_id_private *cm_id_priv;
+	struct cm_av tmp_av;
 	unsigned long flags;
+	int tmp_send_port_not_ready;
 	int ret = 0;
 
 	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
@@ -3477,7 +3546,14 @@ static int cm_migrate(struct ib_cm_id *c
 	    (cm_id->lap_state == IB_CM_LAP_UNINIT ||
 	     cm_id->lap_state == IB_CM_LAP_IDLE)) {
 		cm_id->lap_state = IB_CM_LAP_IDLE;
+		/* Swap address vector */
+		tmp_av = cm_id_priv->av;
 		cm_id_priv->av = cm_id_priv->alt_av;
+		cm_id_priv->alt_av = tmp_av;
+		/* Swap port send ready state */
+		tmp_send_port_not_ready = cm_id_priv->prim_send_port_not_ready;
+		cm_id_priv->prim_send_port_not_ready = cm_id_priv->altr_send_port_not_ready;
+		cm_id_priv->altr_send_port_not_ready = tmp_send_port_not_ready;
 	} else
 		ret = -EINVAL;
 	spin_unlock_irqrestore(&cm_id_priv->lock, flags);
@@ -3888,6 +3964,9 @@ static void cm_add_one(struct ib_device
 		port->cm_dev = cm_dev;
 		port->port_num = i;
 
+		INIT_LIST_HEAD(&port->cm_priv_prim_list);
+		INIT_LIST_HEAD(&port->cm_priv_altr_list);
+
 		ret = cm_create_port_fs(port);
 		if (ret)
 			goto error1;
@@ -3945,6 +4024,8 @@ static void cm_remove_one(struct ib_devi
 {
 	struct cm_device *cm_dev = client_data;
 	struct cm_port *port;
+	struct cm_id_private *cm_id_priv;
+	struct ib_mad_agent *cur_mad_agent;
 	struct ib_port_modify port_modify = {
 		.clr_port_cap_mask = IB_PORT_CM_SUP
 	};
@@ -3968,15 +4049,27 @@ static void cm_remove_one(struct ib_devi
 
 		port = cm_dev->port[i-1];
 		ib_modify_port(ib_device, port->port_num, 0, &port_modify);
+		/* Mark all the cm_id's as not valid */
+		spin_lock_irq(&cm.lock);
+		list_for_each_entry(cm_id_priv, &port->cm_priv_altr_list, altr_list)
+			cm_id_priv->altr_send_port_not_ready = 1;
+		list_for_each_entry(cm_id_priv, &port->cm_priv_prim_list, prim_list)
+			cm_id_priv->prim_send_port_not_ready = 1;
+		spin_unlock_irq(&cm.lock);
 		/*
 		 * We flush the queue here after the going_down set, this
 		 * verify that no new works will be queued in the recv handler,
 		 * after that we can call the unregister_mad_agent
 		 */
 		flush_workqueue(cm.wq);
-		ib_unregister_mad_agent(port->mad_agent);
+		spin_lock_irq(&cm.state_lock);
+		cur_mad_agent = port->mad_agent;
+		port->mad_agent = NULL;
+		spin_unlock_irq(&cm.state_lock);
+		ib_unregister_mad_agent(cur_mad_agent);
 		cm_remove_port_fs(port);
 	}
+
 	device_unregister(cm_dev->device);
 	kfree(cm_dev);
 }
@@ -3989,6 +4082,7 @@ static int __init ib_cm_init(void)
 	INIT_LIST_HEAD(&cm.device_list);
 	rwlock_init(&cm.device_lock);
 	spin_lock_init(&cm.lock);
+	spin_lock_init(&cm.state_lock);
 	cm.listen_service_table = RB_ROOT;
 	cm.listen_service_id = be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID);
 	cm.remote_id_table = RB_ROOT;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/core/umem.c linux-libre-4.8.11-gnu/drivers/infiniband/core/umem.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/core/umem.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/core/umem.c	2016-11-26 03:57:13.000000000 -0500
@@ -174,7 +174,7 @@ struct ib_umem *ib_umem_get(struct ib_uc
 
 	cur_base = addr & PAGE_MASK;
 
-	if (npages == 0) {
+	if (npages == 0 || npages > UINT_MAX) {
 		ret = -EINVAL;
 		goto out;
 	}
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/core/uverbs_main.c linux-libre-4.8.11-gnu/drivers/infiniband/core/uverbs_main.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/core/uverbs_main.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/core/uverbs_main.c	2016-11-26 03:57:13.000000000 -0500
@@ -262,12 +262,9 @@ static int ib_uverbs_cleanup_ucontext(st
 			container_of(uobj, struct ib_uqp_object, uevent.uobject);
 
 		idr_remove_uobj(&ib_uverbs_qp_idr, uobj);
-		if (qp != qp->real_qp) {
-			ib_close_qp(qp);
-		} else {
+		if (qp == qp->real_qp)
 			ib_uverbs_detach_umcast(qp, uqp);
-			ib_destroy_qp(qp);
-		}
+		ib_destroy_qp(qp);
 		ib_uverbs_release_uevent(file, &uqp->uevent);
 		kfree(uqp);
 	}
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/hw/hfi1/rc.c linux-libre-4.8.11-gnu/drivers/infiniband/hw/hfi1/rc.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/hw/hfi1/rc.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/hw/hfi1/rc.c	2016-11-26 03:57:13.000000000 -0500
@@ -87,7 +87,7 @@ void hfi1_add_rnr_timer(struct rvt_qp *q
 	struct hfi1_qp_priv *priv = qp->priv;
 
 	qp->s_flags |= RVT_S_WAIT_RNR;
-	qp->s_timer.expires = jiffies + usecs_to_jiffies(to);
+	priv->s_rnr_timer.expires = jiffies + usecs_to_jiffies(to);
 	add_timer(&priv->s_rnr_timer);
 }
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/hw/hfi1/user_sdma.c linux-libre-4.8.11-gnu/drivers/infiniband/hw/hfi1/user_sdma.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/hw/hfi1/user_sdma.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/hw/hfi1/user_sdma.c	2016-11-26 03:57:13.000000000 -0500
@@ -1152,7 +1152,7 @@ static int pin_vector_pages(struct user_
 	rb_node = hfi1_mmu_rb_extract(pq->handler,
 				      (unsigned long)iovec->iov.iov_base,
 				      iovec->iov.iov_len);
-	if (rb_node && !IS_ERR(rb_node))
+	if (rb_node)
 		node = container_of(rb_node, struct sdma_mmu_node, rb);
 	else
 		rb_node = NULL;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx4/ah.c linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx4/ah.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx4/ah.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx4/ah.c	2016-11-26 03:57:13.000000000 -0500
@@ -102,7 +102,10 @@ static struct ib_ah *create_iboe_ah(stru
 	if (vlan_tag < 0x1000)
 		vlan_tag |= (ah_attr->sl & 7) << 13;
 	ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24));
-	ah->av.eth.gid_index = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index);
+	ret = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index);
+	if (ret < 0)
+		return ERR_PTR(ret);
+	ah->av.eth.gid_index = ret;
 	ah->av.eth.vlan = cpu_to_be16(vlan_tag);
 	ah->av.eth.hop_limit = ah_attr->grh.hop_limit;
 	if (ah_attr->static_rate) {
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx4/cq.c linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx4/cq.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx4/cq.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx4/cq.c	2016-11-26 03:57:13.000000000 -0500
@@ -253,11 +253,14 @@ struct ib_cq *mlx4_ib_create_cq(struct i
 	if (context)
 		if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof (__u32))) {
 			err = -EFAULT;
-			goto err_dbmap;
+			goto err_cq_free;
 		}
 
 	return &cq->ibcq;
 
+err_cq_free:
+	mlx4_cq_free(dev->dev, &cq->mcq);
+
 err_dbmap:
 	if (context)
 		mlx4_ib_db_unmap_user(to_mucontext(context), &cq->db);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx5/cq.c linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx5/cq.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx5/cq.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx5/cq.c	2016-11-26 03:57:13.000000000 -0500
@@ -917,8 +917,7 @@ struct ib_cq *mlx5_ib_create_cq(struct i
 		if (err)
 			goto err_create;
 	} else {
-		/* for now choose 64 bytes till we have a proper interface */
-		cqe_size = 64;
+		cqe_size = cache_line_size() == 128 ? 128 : 64;
 		err = create_cq_kernel(dev, cq, entries, cqe_size, &cqb,
 				       &index, &inlen);
 		if (err)
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx5/main.c linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx5/main.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx5/main.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx5/main.c	2016-11-26 03:57:13.000000000 -0500
@@ -2100,14 +2100,14 @@ static void mlx5_ib_event(struct mlx5_co
 {
 	struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context;
 	struct ib_event ibev;
-
+	bool fatal = false;
 	u8 port = 0;
 
 	switch (event) {
 	case MLX5_DEV_EVENT_SYS_ERROR:
-		ibdev->ib_active = false;
 		ibev.event = IB_EVENT_DEVICE_FATAL;
 		mlx5_ib_handle_internal_error(ibdev);
+		fatal = true;
 		break;
 
 	case MLX5_DEV_EVENT_PORT_UP:
@@ -2154,6 +2154,9 @@ static void mlx5_ib_event(struct mlx5_co
 
 	if (ibdev->ib_active)
 		ib_dispatch_event(&ibev);
+
+	if (fatal)
+		ibdev->ib_active = false;
 }
 
 static void get_ext_port_caps(struct mlx5_ib_dev *dev)
@@ -2835,7 +2838,7 @@ static void *mlx5_ib_add(struct mlx5_cor
 	}
 	err = init_node_data(dev);
 	if (err)
-		goto err_dealloc;
+		goto err_free_port;
 
 	mutex_init(&dev->flow_db.lock);
 	mutex_init(&dev->cap_mask_mutex);
@@ -2845,7 +2848,7 @@ static void *mlx5_ib_add(struct mlx5_cor
 	if (ll == IB_LINK_LAYER_ETHERNET) {
 		err = mlx5_enable_roce(dev);
 		if (err)
-			goto err_dealloc;
+			goto err_free_port;
 	}
 
 	err = create_dev_resources(&dev->devr);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx5/qp.c linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx5/qp.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/hw/mlx5/qp.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/hw/mlx5/qp.c	2016-11-26 03:57:13.000000000 -0500
@@ -2037,8 +2037,8 @@ struct ib_qp *mlx5_ib_create_qp(struct i
 
 		mlx5_ib_dbg(dev, "ib qpnum 0x%x, mlx qpn 0x%x, rcqn 0x%x, scqn 0x%x\n",
 			    qp->ibqp.qp_num, qp->trans_qp.base.mqp.qpn,
-			    to_mcq(init_attr->recv_cq)->mcq.cqn,
-			    to_mcq(init_attr->send_cq)->mcq.cqn);
+			    init_attr->recv_cq ? to_mcq(init_attr->recv_cq)->mcq.cqn : -1,
+			    init_attr->send_cq ? to_mcq(init_attr->send_cq)->mcq.cqn : -1);
 
 		qp->trans_qp.xrcdn = xrcdn;
 
@@ -4702,6 +4702,14 @@ struct ib_rwq_ind_table *mlx5_ib_create_
 				 udata->inlen))
 		return ERR_PTR(-EOPNOTSUPP);
 
+	if (init_attr->log_ind_tbl_size >
+	    MLX5_CAP_GEN(dev->mdev, log_max_rqt_size)) {
+		mlx5_ib_dbg(dev, "log_ind_tbl_size = %d is bigger than supported = %d\n",
+			    init_attr->log_ind_tbl_size,
+			    MLX5_CAP_GEN(dev->mdev, log_max_rqt_size));
+		return ERR_PTR(-EINVAL);
+	}
+
 	min_resp_len = offsetof(typeof(resp), reserved) + sizeof(resp.reserved);
 	if (udata->outlen && udata->outlen < min_resp_len)
 		return ERR_PTR(-EINVAL);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/sw/rdmavt/dma.c linux-libre-4.8.11-gnu/drivers/infiniband/sw/rdmavt/dma.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/sw/rdmavt/dma.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/sw/rdmavt/dma.c	2016-11-26 03:57:13.000000000 -0500
@@ -90,9 +90,6 @@ static u64 rvt_dma_map_page(struct ib_de
 	if (WARN_ON(!valid_dma_direction(direction)))
 		return BAD_DMA_ADDRESS;
 
-	if (offset + size > PAGE_SIZE)
-		return BAD_DMA_ADDRESS;
-
 	addr = (u64)page_address(page);
 	if (addr)
 		addr += offset;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_net.c linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_net.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_net.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_net.c	2016-11-26 03:57:13.000000000 -0500
@@ -243,10 +243,8 @@ static struct socket *rxe_setup_udp_tunn
 {
 	int err;
 	struct socket *sock;
-	struct udp_port_cfg udp_cfg;
-	struct udp_tunnel_sock_cfg tnl_cfg;
-
-	memset(&udp_cfg, 0, sizeof(udp_cfg));
+	struct udp_port_cfg udp_cfg = {0};
+	struct udp_tunnel_sock_cfg tnl_cfg = {0};
 
 	if (ipv6) {
 		udp_cfg.family = AF_INET6;
@@ -264,10 +262,8 @@ static struct socket *rxe_setup_udp_tunn
 		return ERR_PTR(err);
 	}
 
-	tnl_cfg.sk_user_data = NULL;
 	tnl_cfg.encap_type = 1;
 	tnl_cfg.encap_rcv = rxe_udp_encap_recv;
-	tnl_cfg.encap_destroy = NULL;
 
 	/* Setup UDP tunnel */
 	setup_udp_tunnel_sock(net, sock, &tnl_cfg);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_qp.c linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_qp.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_qp.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_qp.c	2016-11-26 03:57:13.000000000 -0500
@@ -522,6 +522,7 @@ static void rxe_qp_reset(struct rxe_qp *
 	if (qp->sq.queue) {
 		__rxe_do_task(&qp->comp.task);
 		__rxe_do_task(&qp->req.task);
+		rxe_queue_reset(qp->sq.queue);
 	}
 
 	/* cleanup attributes */
@@ -573,6 +574,7 @@ void rxe_qp_error(struct rxe_qp *qp)
 {
 	qp->req.state = QP_STATE_ERROR;
 	qp->resp.state = QP_STATE_ERROR;
+	qp->attr.qp_state = IB_QPS_ERR;
 
 	/* drain work and packet queues */
 	rxe_run_task(&qp->resp.task, 1);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_queue.c linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_queue.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_queue.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_queue.c	2016-11-26 03:57:13.000000000 -0500
@@ -84,6 +84,15 @@ err1:
 	return -EINVAL;
 }
 
+inline void rxe_queue_reset(struct rxe_queue *q)
+{
+	/* queue is comprised from header and the memory
+	 * of the actual queue. See "struct rxe_queue_buf" in rxe_queue.h
+	 * reset only the queue itself and not the management header
+	 */
+	memset(q->buf->data, 0, q->buf_size - sizeof(struct rxe_queue_buf));
+}
+
 struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe,
 				 int *num_elem,
 				 unsigned int elem_size)
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_queue.h linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_queue.h
--- linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_queue.h	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_queue.h	2016-11-26 03:57:13.000000000 -0500
@@ -84,6 +84,8 @@ int do_mmap_info(struct rxe_dev *rxe,
 		 size_t buf_size,
 		 struct rxe_mmap_info **ip_p);
 
+void rxe_queue_reset(struct rxe_queue *q);
+
 struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe,
 				 int *num_elem,
 				 unsigned int elem_size);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_req.c linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_req.c
--- linux-libre-4.8.10-gnu/drivers/infiniband/sw/rxe/rxe_req.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/infiniband/sw/rxe/rxe_req.c	2016-11-26 03:57:13.000000000 -0500
@@ -695,7 +695,8 @@ next_wqe:
 						       qp->req.wqe_index);
 			wqe->state = wqe_state_done;
 			wqe->status = IB_WC_SUCCESS;
-			goto complete;
+			__rxe_do_task(&qp->comp.task);
+			return 0;
 		}
 		payload = mtu;
 	}
@@ -744,13 +745,17 @@ err:
 	wqe->status = IB_WC_LOC_PROT_ERR;
 	wqe->state = wqe_state_error;
 
-complete:
-	if (qp_type(qp) != IB_QPT_RC) {
-		while (rxe_completer(qp) == 0)
-			;
-	}
-
-	return 0;
+	/*
+	 * IBA Spec. Section 10.7.3.1 SIGNALED COMPLETIONS
+	 * ---------8<---------8<-------------
+	 * ...Note that if a completion error occurs, a Work Completion
+	 * will always be generated, even if the signaling
+	 * indicator requests an Unsignaled Completion.
+	 * ---------8<---------8<-------------
+	 */
+	wqe->wr.send_flags |= IB_SEND_SIGNALED;
+	__rxe_do_task(&qp->comp.task);
+	return -EAGAIN;
 
 exit:
 	return -EAGAIN;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/mfd/intel-lpss.c linux-libre-4.8.11-gnu/drivers/mfd/intel-lpss.c
--- linux-libre-4.8.10-gnu/drivers/mfd/intel-lpss.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/mfd/intel-lpss.c	2016-11-26 03:57:13.000000000 -0500
@@ -502,9 +502,6 @@ int intel_lpss_suspend(struct device *de
 	for (i = 0; i < LPSS_PRIV_REG_COUNT; i++)
 		lpss->priv_ctx[i] = readl(lpss->priv + i * 4);
 
-	/* Put the device into reset state */
-	writel(0, lpss->priv + LPSS_PRIV_RESETS);
-
 	return 0;
 }
 EXPORT_SYMBOL_GPL(intel_lpss_suspend);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/mfd/mfd-core.c linux-libre-4.8.11-gnu/drivers/mfd/mfd-core.c
--- linux-libre-4.8.10-gnu/drivers/mfd/mfd-core.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/mfd/mfd-core.c	2016-11-26 03:57:13.000000000 -0500
@@ -399,6 +399,8 @@ int mfd_clone_cell(const char *cell, con
 					clones[i]);
 	}
 
+	put_device(dev);
+
 	return 0;
 }
 EXPORT_SYMBOL(mfd_clone_cell);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/mfd/stmpe.c linux-libre-4.8.11-gnu/drivers/mfd/stmpe.c
--- linux-libre-4.8.10-gnu/drivers/mfd/stmpe.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/mfd/stmpe.c	2016-11-26 03:57:13.000000000 -0500
@@ -761,6 +761,8 @@ static int stmpe1801_reset(struct stmpe
 	if (ret < 0)
 		return ret;
 
+	msleep(10);
+
 	timeout = jiffies + msecs_to_jiffies(100);
 	while (time_before(jiffies, timeout)) {
 		ret = __stmpe_reg_read(stmpe, STMPE1801_REG_SYS_CTRL);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/virtio_net.c linux-libre-4.8.11-gnu/drivers/net/virtio_net.c
--- linux-libre-4.8.10-gnu/drivers/net/virtio_net.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/virtio_net.c	2016-11-26 03:57:13.000000000 -0500
@@ -2010,23 +2010,33 @@ static struct virtio_device_id id_table[
 	{ 0 },
 };
 
+#define VIRTNET_FEATURES \
+	VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, \
+	VIRTIO_NET_F_MAC, \
+	VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, \
+	VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, \
+	VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, \
+	VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, \
+	VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \
+	VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, \
+	VIRTIO_NET_F_CTRL_MAC_ADDR, \
+	VIRTIO_NET_F_MTU
+
 static unsigned int features[] = {
-	VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM,
-	VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC,
-	VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
-	VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
-	VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO,
-	VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
-	VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
-	VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
-	VIRTIO_NET_F_CTRL_MAC_ADDR,
+	VIRTNET_FEATURES,
+};
+
+static unsigned int features_legacy[] = {
+	VIRTNET_FEATURES,
+	VIRTIO_NET_F_GSO,
 	VIRTIO_F_ANY_LAYOUT,
-	VIRTIO_NET_F_MTU,
 };
 
 static struct virtio_driver virtio_net_driver = {
 	.feature_table = features,
 	.feature_table_size = ARRAY_SIZE(features),
+	.feature_table_legacy = features_legacy,
+	.feature_table_size_legacy = ARRAY_SIZE(features_legacy),
 	.driver.name =	KBUILD_MODNAME,
 	.driver.owner =	THIS_MODULE,
 	.id_table =	id_table,
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/d3.c linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/d3.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/d3.c	2016-11-26 03:57:13.000000000 -0500
@@ -1087,6 +1087,15 @@ iwl_mvm_netdetect_config(struct iwl_mvm
 		ret = iwl_mvm_switch_to_d3(mvm);
 		if (ret)
 			return ret;
+	} else {
+		/* In theory, we wouldn't have to stop a running sched
+		 * scan in order to start another one (for
+		 * net-detect).  But in practice this doesn't seem to
+		 * work properly, so stop any running sched_scan now.
+		 */
+		ret = iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED, true);
+		if (ret)
+			return ret;
 	}
 
 	/* rfkill release can be either for wowlan or netdetect */
@@ -2088,6 +2097,16 @@ static int __iwl_mvm_resume(struct iwl_m
 	iwl_mvm_update_changed_regdom(mvm);
 
 	if (mvm->net_detect) {
+		/* If this is a non-unified image, we restart the FW,
+		 * so no need to stop the netdetect scan.  If that
+		 * fails, continue and try to get the wake-up reasons,
+		 * but trigger a HW restart by keeping a failure code
+		 * in ret.
+		 */
+		if (unified_image)
+			ret = iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_NETDETECT,
+						false);
+
 		iwl_mvm_query_netdetect_reasons(mvm, vif);
 		/* has unlocked the mutex, so skip that */
 		goto out;
@@ -2271,7 +2290,8 @@ static void iwl_mvm_d3_test_disconn_work
 static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file)
 {
 	struct iwl_mvm *mvm = inode->i_private;
-	int remaining_time = 10;
+	bool unified_image = fw_has_capa(&mvm->fw->ucode_capa,
+					 IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG);
 
 	mvm->d3_test_active = false;
 
@@ -2282,17 +2302,21 @@ static int iwl_mvm_d3_test_release(struc
 	mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
 
 	iwl_abort_notification_waits(&mvm->notif_wait);
-	ieee80211_restart_hw(mvm->hw);
+	if (!unified_image) {
+		int remaining_time = 10;
 
-	/* wait for restart and disconnect all interfaces */
-	while (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
-	       remaining_time > 0) {
-		remaining_time--;
-		msleep(1000);
-	}
+		ieee80211_restart_hw(mvm->hw);
 
-	if (remaining_time == 0)
-		IWL_ERR(mvm, "Timed out waiting for HW restart to finish!\n");
+		/* wait for restart and disconnect all interfaces */
+		while (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
+		       remaining_time > 0) {
+			remaining_time--;
+			msleep(1000);
+		}
+
+		if (remaining_time == 0)
+			IWL_ERR(mvm, "Timed out waiting for HW restart!\n");
+	}
 
 	ieee80211_iterate_active_interfaces_atomic(
 		mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c	2016-11-26 03:57:13.000000000 -0500
@@ -4097,7 +4097,6 @@ void iwl_mvm_sync_rx_queues_internal(str
 				     struct iwl_mvm_internal_rxq_notif *notif,
 				     u32 size)
 {
-	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(notif_waitq);
 	u32 qmask = BIT(mvm->trans->num_rx_queues) - 1;
 	int ret;
 
@@ -4119,7 +4118,7 @@ void iwl_mvm_sync_rx_queues_internal(str
 	}
 
 	if (notif->sync)
-		ret = wait_event_timeout(notif_waitq,
+		ret = wait_event_timeout(mvm->rx_sync_waitq,
 					 atomic_read(&mvm->queue_sync_counter) == 0,
 					 HZ);
 	WARN_ON_ONCE(!ret);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h	2016-11-26 03:57:13.000000000 -0500
@@ -932,6 +932,7 @@ struct iwl_mvm {
 	/* sync d0i3_tx queue and IWL_MVM_STATUS_IN_D0I3 status flag */
 	spinlock_t d0i3_tx_lock;
 	wait_queue_head_t d0i3_exit_waitq;
+	wait_queue_head_t rx_sync_waitq;
 
 	/* BT-Coex */
 	struct iwl_bt_coex_profile_notif last_bt_notif;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/ops.c linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/ops.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/ops.c	2016-11-26 03:57:13.000000000 -0500
@@ -618,6 +618,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *
 	spin_lock_init(&mvm->refs_lock);
 	skb_queue_head_init(&mvm->d0i3_tx);
 	init_waitqueue_head(&mvm->d0i3_exit_waitq);
+	init_waitqueue_head(&mvm->rx_sync_waitq);
 
 	atomic_set(&mvm->queue_sync_counter, 0);
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c	2016-11-26 03:57:13.000000000 -0500
@@ -545,7 +545,8 @@ void iwl_mvm_rx_queue_notif(struct iwl_m
 				  "Received expired RX queue sync message\n");
 			return;
 		}
-		atomic_dec(&mvm->queue_sync_counter);
+		if (!atomic_dec_return(&mvm->queue_sync_counter))
+			wake_up(&mvm->rx_sync_waitq);
 	}
 
 	switch (internal_notif->type) {
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/scan.c linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/mvm/scan.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/mvm/scan.c	2016-11-26 03:57:13.000000000 -0500
@@ -1185,6 +1185,9 @@ static int iwl_mvm_num_scans(struct iwl_
 
 static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type)
 {
+	bool unified_image = fw_has_capa(&mvm->fw->ucode_capa,
+					 IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG);
+
 	/* This looks a bit arbitrary, but the idea is that if we run
 	 * out of possible simultaneous scans and the userspace is
 	 * trying to run a scan type that is already running, we
@@ -1211,12 +1214,30 @@ static int iwl_mvm_check_running_scans(s
 			return -EBUSY;
 		return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR, true);
 	case IWL_MVM_SCAN_NETDETECT:
-		/* No need to stop anything for net-detect since the
-		 * firmware is restarted anyway.  This way, any sched
-		 * scans that were running will be restarted when we
-		 * resume.
-		*/
-		return 0;
+		/* For non-unified images, there's no need to stop
+		 * anything for net-detect since the firmware is
+		 * restarted anyway.  This way, any sched scans that
+		 * were running will be restarted when we resume.
+		 */
+		if (!unified_image)
+			return 0;
+
+		/* If this is a unified image and we ran out of scans,
+		 * we need to stop something.  Prefer stopping regular
+		 * scans, because the results are useless at this
+		 * point, and we should be able to keep running
+		 * another scheduled scan while suspended.
+		 */
+		if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK)
+			return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR,
+						 true);
+		if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK)
+			return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED,
+						 true);
+
+		/* fall through, something is wrong if no scan was
+		 * running but we ran out of scans.
+		 */
 	default:
 		WARN_ON(1);
 		break;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c	2016-11-26 03:57:13.000000000 -0500
@@ -526,48 +526,64 @@ static const struct pci_device_id iwl_hw
 MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
 
 #ifdef CONFIG_ACPI
-#define SPL_METHOD		"SPLC"
-#define SPL_DOMAINTYPE_MODULE	BIT(0)
-#define SPL_DOMAINTYPE_WIFI	BIT(1)
-#define SPL_DOMAINTYPE_WIGIG	BIT(2)
-#define SPL_DOMAINTYPE_RFEM	BIT(3)
+#define ACPI_SPLC_METHOD	"SPLC"
+#define ACPI_SPLC_DOMAIN_WIFI	(0x07)
 
-static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx)
+static u64 splc_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splc)
 {
-	union acpi_object *limits, *domain_type, *power_limit;
+	union acpi_object *data_pkg, *dflt_pwr_limit;
+	int i;
 
-	if (splx->type != ACPI_TYPE_PACKAGE ||
-	    splx->package.count != 2 ||
-	    splx->package.elements[0].type != ACPI_TYPE_INTEGER ||
-	    splx->package.elements[0].integer.value != 0) {
-		IWL_ERR(trans, "Unsupported splx structure\n");
+	/* We need at least two elements, one for the revision and one
+	 * for the data itself.  Also check that the revision is
+	 * supported (currently only revision 0).
+	*/
+	if (splc->type != ACPI_TYPE_PACKAGE ||
+	    splc->package.count < 2 ||
+	    splc->package.elements[0].type != ACPI_TYPE_INTEGER ||
+	    splc->package.elements[0].integer.value != 0) {
+		IWL_DEBUG_INFO(trans,
+			       "Unsupported structure returned by the SPLC method.  Ignoring.\n");
 		return 0;
 	}
 
-	limits = &splx->package.elements[1];
-	if (limits->type != ACPI_TYPE_PACKAGE ||
-	    limits->package.count < 2 ||
-	    limits->package.elements[0].type != ACPI_TYPE_INTEGER ||
-	    limits->package.elements[1].type != ACPI_TYPE_INTEGER) {
-		IWL_ERR(trans, "Invalid limits element\n");
-		return 0;
+	/* loop through all the packages to find the one for WiFi */
+	for (i = 1; i < splc->package.count; i++) {
+		union acpi_object *domain;
+
+		data_pkg = &splc->package.elements[i];
+
+		/* Skip anything that is not a package with the right
+		 * amount of elements (i.e. at least 2 integers).
+		 */
+		if (data_pkg->type != ACPI_TYPE_PACKAGE ||
+		    data_pkg->package.count < 2 ||
+		    data_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
+		    data_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
+			continue;
+
+		domain = &data_pkg->package.elements[0];
+		if (domain->integer.value == ACPI_SPLC_DOMAIN_WIFI)
+			break;
+
+		data_pkg = NULL;
 	}
 
-	domain_type = &limits->package.elements[0];
-	power_limit = &limits->package.elements[1];
-	if (!(domain_type->integer.value & SPL_DOMAINTYPE_WIFI)) {
-		IWL_DEBUG_INFO(trans, "WiFi power is not limited\n");
+	if (!data_pkg) {
+		IWL_DEBUG_INFO(trans,
+			       "No element for the WiFi domain returned by the SPLC method.\n");
 		return 0;
 	}
 
-	return power_limit->integer.value;
+	dflt_pwr_limit = &data_pkg->package.elements[1];
+	return dflt_pwr_limit->integer.value;
 }
 
 static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev)
 {
 	acpi_handle pxsx_handle;
 	acpi_handle handle;
-	struct acpi_buffer splx = {ACPI_ALLOCATE_BUFFER, NULL};
+	struct acpi_buffer splc = {ACPI_ALLOCATE_BUFFER, NULL};
 	acpi_status status;
 
 	pxsx_handle = ACPI_HANDLE(&pdev->dev);
@@ -578,23 +594,24 @@ static void set_dflt_pwr_limit(struct iw
 	}
 
 	/* Get the method's handle */
-	status = acpi_get_handle(pxsx_handle, (acpi_string)SPL_METHOD, &handle);
+	status = acpi_get_handle(pxsx_handle, (acpi_string)ACPI_SPLC_METHOD,
+				 &handle);
 	if (ACPI_FAILURE(status)) {
-		IWL_DEBUG_INFO(trans, "SPL method not found\n");
+		IWL_DEBUG_INFO(trans, "SPLC method not found\n");
 		return;
 	}
 
 	/* Call SPLC with no arguments */
-	status = acpi_evaluate_object(handle, NULL, NULL, &splx);
+	status = acpi_evaluate_object(handle, NULL, NULL, &splc);
 	if (ACPI_FAILURE(status)) {
 		IWL_ERR(trans, "SPLC invocation failed (0x%x)\n", status);
 		return;
 	}
 
-	trans->dflt_pwr_limit = splx_get_pwr_limit(trans, splx.pointer);
+	trans->dflt_pwr_limit = splc_get_pwr_limit(trans, splc.pointer);
 	IWL_DEBUG_INFO(trans, "Default power limit set to %lld\n",
 		       trans->dflt_pwr_limit);
-	kfree(splx.pointer);
+	kfree(splc.pointer);
 }
 
 #else /* CONFIG_ACPI */
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
--- linux-libre-4.8.10-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c	2016-11-26 03:57:13.000000000 -0500
@@ -522,6 +522,7 @@ error:
 static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq,
 			      int slots_num, u32 txq_id)
 {
+	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
 	int ret;
 
 	txq->need_update = false;
@@ -536,6 +537,13 @@ static int iwl_pcie_txq_init(struct iwl_
 		return ret;
 
 	spin_lock_init(&txq->lock);
+
+	if (txq_id == trans_pcie->cmd_queue) {
+		static struct lock_class_key iwl_pcie_cmd_queue_lock_class;
+
+		lockdep_set_class(&txq->lock, &iwl_pcie_cmd_queue_lock_class);
+	}
+
 	__skb_queue_head_init(&txq->overflow_q);
 
 	/*
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/rtc/rtc-omap.c linux-libre-4.8.11-gnu/drivers/rtc/rtc-omap.c
--- linux-libre-4.8.10-gnu/drivers/rtc/rtc-omap.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/rtc/rtc-omap.c	2016-11-26 03:57:13.000000000 -0500
@@ -109,6 +109,7 @@
 /* OMAP_RTC_OSC_REG bit fields: */
 #define OMAP_RTC_OSC_32KCLK_EN		BIT(6)
 #define OMAP_RTC_OSC_SEL_32KCLK_SRC	BIT(3)
+#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE	BIT(4)
 
 /* OMAP_RTC_IRQWAKEEN bit fields: */
 #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN	BIT(1)
@@ -646,8 +647,9 @@ static int omap_rtc_probe(struct platfor
 	 */
 	if (rtc->has_ext_clk) {
 		reg = rtc_read(rtc, OMAP_RTC_OSC_REG);
-		rtc_write(rtc, OMAP_RTC_OSC_REG,
-			  reg | OMAP_RTC_OSC_SEL_32KCLK_SRC);
+		reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE;
+		reg |= OMAP_RTC_OSC_32KCLK_EN | OMAP_RTC_OSC_SEL_32KCLK_SRC;
+		rtc_writel(rtc, OMAP_RTC_OSC_REG, reg);
 	}
 
 	rtc->type->lock(rtc);
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/uwb/lc-rc.c linux-libre-4.8.11-gnu/drivers/uwb/lc-rc.c
--- linux-libre-4.8.10-gnu/drivers/uwb/lc-rc.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/uwb/lc-rc.c	2016-11-26 03:57:13.000000000 -0500
@@ -56,8 +56,11 @@ static struct uwb_rc *uwb_rc_find_by_ind
 	struct uwb_rc *rc = NULL;
 
 	dev = class_find_device(&uwb_rc_class, NULL, &index, uwb_rc_index_match);
-	if (dev)
+	if (dev) {
 		rc = dev_get_drvdata(dev);
+		put_device(dev);
+	}
+
 	return rc;
 }
 
@@ -467,7 +470,9 @@ struct uwb_rc *__uwb_rc_try_get(struct u
 	if (dev) {
 		rc = dev_get_drvdata(dev);
 		__uwb_rc_get(rc);
+		put_device(dev);
 	}
+
 	return rc;
 }
 EXPORT_SYMBOL_GPL(__uwb_rc_try_get);
@@ -520,8 +525,11 @@ struct uwb_rc *uwb_rc_get_by_grandpa(con
 
 	dev = class_find_device(&uwb_rc_class, NULL, grandpa_dev,
 				find_rc_grandpa);
-	if (dev)
+	if (dev) {
 		rc = dev_get_drvdata(dev);
+		put_device(dev);
+	}
+
 	return rc;
 }
 EXPORT_SYMBOL_GPL(uwb_rc_get_by_grandpa);
@@ -553,8 +561,10 @@ struct uwb_rc *uwb_rc_get_by_dev(const s
 	struct uwb_rc *rc = NULL;
 
 	dev = class_find_device(&uwb_rc_class, NULL, addr, find_rc_dev);
-	if (dev)
+	if (dev) {
 		rc = dev_get_drvdata(dev);
+		put_device(dev);
+	}
 
 	return rc;
 }
diff -druNp --no-dereference linux-libre-4.8.10-gnu/drivers/uwb/pal.c linux-libre-4.8.11-gnu/drivers/uwb/pal.c
--- linux-libre-4.8.10-gnu/drivers/uwb/pal.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/drivers/uwb/pal.c	2016-11-26 03:57:13.000000000 -0500
@@ -97,6 +97,8 @@ static bool uwb_rc_class_device_exists(s
 
 	dev = class_find_device(&uwb_rc_class, NULL, target_rc,	find_rc);
 
+	put_device(dev);
+
 	return (dev != NULL);
 }
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/fs/ext4/ext4.h linux-libre-4.8.11-gnu/fs/ext4/ext4.h
--- linux-libre-4.8.10-gnu/fs/ext4/ext4.h	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/fs/ext4/ext4.h	2016-11-26 03:57:13.000000000 -0500
@@ -235,6 +235,7 @@ struct ext4_io_submit {
 #define	EXT4_MAX_BLOCK_SIZE		65536
 #define EXT4_MIN_BLOCK_LOG_SIZE		10
 #define EXT4_MAX_BLOCK_LOG_SIZE		16
+#define EXT4_MAX_CLUSTER_LOG_SIZE	30
 #ifdef __KERNEL__
 # define EXT4_BLOCK_SIZE(s)		((s)->s_blocksize)
 #else
diff -druNp --no-dereference linux-libre-4.8.10-gnu/fs/ext4/super.c linux-libre-4.8.11-gnu/fs/ext4/super.c
--- linux-libre-4.8.10-gnu/fs/ext4/super.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/fs/ext4/super.c	2016-11-26 03:57:13.000000000 -0500
@@ -3518,7 +3518,15 @@ static int ext4_fill_super(struct super_
 	if (blocksize < EXT4_MIN_BLOCK_SIZE ||
 	    blocksize > EXT4_MAX_BLOCK_SIZE) {
 		ext4_msg(sb, KERN_ERR,
-		       "Unsupported filesystem blocksize %d", blocksize);
+		       "Unsupported filesystem blocksize %d (%d log_block_size)",
+			 blocksize, le32_to_cpu(es->s_log_block_size));
+		goto failed_mount;
+	}
+	if (le32_to_cpu(es->s_log_block_size) >
+	    (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
+		ext4_msg(sb, KERN_ERR,
+			 "Invalid log block size: %u",
+			 le32_to_cpu(es->s_log_block_size));
 		goto failed_mount;
 	}
 
@@ -3650,6 +3658,13 @@ static int ext4_fill_super(struct super_
 				 "block size (%d)", clustersize, blocksize);
 			goto failed_mount;
 		}
+		if (le32_to_cpu(es->s_log_cluster_size) >
+		    (EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
+			ext4_msg(sb, KERN_ERR,
+				 "Invalid log cluster size: %u",
+				 le32_to_cpu(es->s_log_cluster_size));
+			goto failed_mount;
+		}
 		sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) -
 			le32_to_cpu(es->s_log_block_size);
 		sbi->s_clusters_per_group =
diff -druNp --no-dereference linux-libre-4.8.10-gnu/fs/fuse/file.c linux-libre-4.8.11-gnu/fs/fuse/file.c
--- linux-libre-4.8.10-gnu/fs/fuse/file.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/fs/fuse/file.c	2016-11-26 03:57:13.000000000 -0500
@@ -1985,6 +1985,10 @@ static int fuse_write_end(struct file *f
 {
 	struct inode *inode = page->mapping->host;
 
+	/* Haven't copied anything?  Skip zeroing, size extending, dirtying. */
+	if (!copied)
+		goto unlock;
+
 	if (!PageUptodate(page)) {
 		/* Zero any unwritten bytes at the end of the page */
 		size_t endoff = (pos + copied) & ~PAGE_MASK;
@@ -1995,6 +1999,8 @@ static int fuse_write_end(struct file *f
 
 	fuse_write_update_size(inode, pos + copied);
 	set_page_dirty(page);
+
+unlock:
 	unlock_page(page);
 	put_page(page);
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/include/linux/sunrpc/svc_xprt.h linux-libre-4.8.11-gnu/include/linux/sunrpc/svc_xprt.h
--- linux-libre-4.8.10-gnu/include/linux/sunrpc/svc_xprt.h	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/include/linux/sunrpc/svc_xprt.h	2016-11-26 03:57:13.000000000 -0500
@@ -25,6 +25,7 @@ struct svc_xprt_ops {
 	void		(*xpo_detach)(struct svc_xprt *);
 	void		(*xpo_free)(struct svc_xprt *);
 	int		(*xpo_secure_port)(struct svc_rqst *);
+	void		(*xpo_kill_temp_xprt)(struct svc_xprt *);
 };
 
 struct svc_xprt_class {
diff -druNp --no-dereference linux-libre-4.8.10-gnu/kernel/irq/manage.c linux-libre-4.8.11-gnu/kernel/irq/manage.c
--- linux-libre-4.8.10-gnu/kernel/irq/manage.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/kernel/irq/manage.c	2016-11-26 03:57:13.000000000 -0500
@@ -1341,12 +1341,12 @@ __setup_irq(unsigned int irq, struct irq
 
 	} else if (new->flags & IRQF_TRIGGER_MASK) {
 		unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK;
-		unsigned int omsk = irq_settings_get_trigger_mask(desc);
+		unsigned int omsk = irqd_get_trigger_type(&desc->irq_data);
 
 		if (nmsk != omsk)
 			/* hope the handler works with current  trigger mode */
 			pr_warn("irq %d uses trigger mode %u; requested %u\n",
-				irq, nmsk, omsk);
+				irq, omsk, nmsk);
 	}
 
 	*old_ptr = new;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/kernel/power/suspend_test.c linux-libre-4.8.11-gnu/kernel/power/suspend_test.c
--- linux-libre-4.8.10-gnu/kernel/power/suspend_test.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/kernel/power/suspend_test.c	2016-11-26 03:57:13.000000000 -0500
@@ -203,8 +203,10 @@ static int __init test_suspend(void)
 
 	/* RTCs have initialized by now too ... can we use one? */
 	dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm);
-	if (dev)
+	if (dev) {
 		rtc = rtc_class_open(dev_name(dev));
+		put_device(dev);
+	}
 	if (!rtc) {
 		printk(warn_no_rtc);
 		return 0;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/kernel/trace/ftrace.c linux-libre-4.8.11-gnu/kernel/trace/ftrace.c
--- linux-libre-4.8.10-gnu/kernel/trace/ftrace.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/kernel/trace/ftrace.c	2016-11-26 03:57:13.000000000 -0500
@@ -1856,6 +1856,10 @@ static int __ftrace_hash_update_ipmodify
 
 	/* Update rec->flags */
 	do_for_each_ftrace_rec(pg, rec) {
+
+		if (rec->flags & FTRACE_FL_DISABLED)
+			continue;
+
 		/* We need to update only differences of filter_hash */
 		in_old = !!ftrace_lookup_ip(old_hash, rec->ip);
 		in_new = !!ftrace_lookup_ip(new_hash, rec->ip);
@@ -1878,6 +1882,10 @@ rollback:
 
 	/* Roll back what we did above */
 	do_for_each_ftrace_rec(pg, rec) {
+
+		if (rec->flags & FTRACE_FL_DISABLED)
+			continue;
+
 		if (rec == end)
 			goto err_out;
 
@@ -2391,6 +2399,10 @@ void __weak ftrace_replace_code(int enab
 		return;
 
 	do_for_each_ftrace_rec(pg, rec) {
+
+		if (rec->flags & FTRACE_FL_DISABLED)
+			continue;
+
 		failed = __ftrace_replace_code(rec, enable);
 		if (failed) {
 			ftrace_bug(failed, rec);
@@ -2757,7 +2769,7 @@ static int ftrace_shutdown(struct ftrace
 		struct dyn_ftrace *rec;
 
 		do_for_each_ftrace_rec(pg, rec) {
-			if (FTRACE_WARN_ON_ONCE(rec->flags))
+			if (FTRACE_WARN_ON_ONCE(rec->flags & ~FTRACE_FL_DISABLED))
 				pr_warn("  %pS flags:%lx\n",
 					(void *)rec->ip, rec->flags);
 		} while_for_each_ftrace_rec();
@@ -3592,6 +3604,10 @@ match_records(struct ftrace_hash *hash,
 		goto out_unlock;
 
 	do_for_each_ftrace_rec(pg, rec) {
+
+		if (rec->flags & FTRACE_FL_DISABLED)
+			continue;
+
 		if (ftrace_match_record(rec, &func_g, mod_match, exclude_mod)) {
 			ret = enter_record(hash, rec, clear_filter);
 			if (ret < 0) {
@@ -3787,6 +3803,9 @@ register_ftrace_function_probe(char *glo
 
 	do_for_each_ftrace_rec(pg, rec) {
 
+		if (rec->flags & FTRACE_FL_DISABLED)
+			continue;
+
 		if (!ftrace_match_record(rec, &func_g, NULL, 0))
 			continue;
 
@@ -4679,6 +4698,9 @@ ftrace_set_func(unsigned long *array, in
 
 	do_for_each_ftrace_rec(pg, rec) {
 
+		if (rec->flags & FTRACE_FL_DISABLED)
+			continue;
+
 		if (ftrace_match_record(rec, &func_g, NULL, 0)) {
 			/* if it is in the array */
 			exists = false;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/kernel/trace/Makefile linux-libre-4.8.11-gnu/kernel/trace/Makefile
--- linux-libre-4.8.10-gnu/kernel/trace/Makefile	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/kernel/trace/Makefile	2016-11-26 03:57:13.000000000 -0500
@@ -1,8 +1,4 @@
 
-# We are fully aware of the dangers of __builtin_return_address()
-FRAME_CFLAGS := $(call cc-disable-warning,frame-address)
-KBUILD_CFLAGS += $(FRAME_CFLAGS)
-
 # Do not instrument the tracer itself:
 
 ifdef CONFIG_FUNCTION_TRACER
diff -druNp --no-dereference linux-libre-4.8.10-gnu/Makefile linux-libre-4.8.11-gnu/Makefile
--- linux-libre-4.8.10-gnu/Makefile	2016-11-21 08:41:06.000000000 -0500
+++ linux-libre-4.8.11-gnu/Makefile	2016-11-26 20:38:47.000000000 -0500
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 8
-SUBLEVEL = 10
+SUBLEVEL = 11
 EXTRAVERSION = -gnu
 NAME = Psychotic Stoned Sheep
 
@@ -399,11 +399,12 @@ KBUILD_CFLAGS   := -Wall -Wundef -Wstric
 		   -fno-strict-aliasing -fno-common \
 		   -Werror-implicit-function-declaration \
 		   -Wno-format-security \
-		   -std=gnu89
+		   -std=gnu89 $(call cc-option,-fno-PIE)
+
 
 KBUILD_AFLAGS_KERNEL :=
 KBUILD_CFLAGS_KERNEL :=
-KBUILD_AFLAGS   := -D__ASSEMBLY__
+KBUILD_AFLAGS   := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
 KBUILD_AFLAGS_MODULE  := -DMODULE
 KBUILD_CFLAGS_MODULE  := -DMODULE
 KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
@@ -621,6 +622,7 @@ include arch/$(SRCARCH)/Makefile
 
 KBUILD_CFLAGS	+= $(call cc-option,-fno-delete-null-pointer-checks,)
 KBUILD_CFLAGS	+= $(call cc-disable-warning,maybe-uninitialized,)
+KBUILD_CFLAGS	+= $(call cc-disable-warning,frame-address,)
 
 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
 KBUILD_CFLAGS	+= -Os
diff -druNp --no-dereference linux-libre-4.8.10-gnu/mm/Makefile linux-libre-4.8.11-gnu/mm/Makefile
--- linux-libre-4.8.10-gnu/mm/Makefile	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/mm/Makefile	2016-11-26 03:57:13.000000000 -0500
@@ -21,9 +21,6 @@ KCOV_INSTRUMENT_memcontrol.o := n
 KCOV_INSTRUMENT_mmzone.o := n
 KCOV_INSTRUMENT_vmstat.o := n
 
-# Since __builtin_frame_address does work as used, disable the warning.
-CFLAGS_usercopy.o += $(call cc-disable-warning, frame-address)
-
 mmu-y			:= nommu.o
 mmu-$(CONFIG_MMU)	:= gup.o highmem.o memory.o mincore.o \
 			   mlock.o mmap.o mprotect.o mremap.o msync.o rmap.o \
diff -druNp --no-dereference linux-libre-4.8.10-gnu/net/can/bcm.c linux-libre-4.8.11-gnu/net/can/bcm.c
--- linux-libre-4.8.10-gnu/net/can/bcm.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/net/can/bcm.c	2016-11-26 03:57:13.000000000 -0500
@@ -1549,24 +1549,31 @@ static int bcm_connect(struct socket *so
 	struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
 	struct sock *sk = sock->sk;
 	struct bcm_sock *bo = bcm_sk(sk);
+	int ret = 0;
 
 	if (len < sizeof(*addr))
 		return -EINVAL;
 
-	if (bo->bound)
-		return -EISCONN;
+	lock_sock(sk);
+
+	if (bo->bound) {
+		ret = -EISCONN;
+		goto fail;
+	}
 
 	/* bind a device to this socket */
 	if (addr->can_ifindex) {
 		struct net_device *dev;
 
 		dev = dev_get_by_index(&init_net, addr->can_ifindex);
-		if (!dev)
-			return -ENODEV;
-
+		if (!dev) {
+			ret = -ENODEV;
+			goto fail;
+		}
 		if (dev->type != ARPHRD_CAN) {
 			dev_put(dev);
-			return -ENODEV;
+			ret = -ENODEV;
+			goto fail;
 		}
 
 		bo->ifindex = dev->ifindex;
@@ -1577,17 +1584,24 @@ static int bcm_connect(struct socket *so
 		bo->ifindex = 0;
 	}
 
-	bo->bound = 1;
-
 	if (proc_dir) {
 		/* unique socket address as filename */
 		sprintf(bo->procname, "%lu", sock_i_ino(sk));
 		bo->bcm_proc_read = proc_create_data(bo->procname, 0644,
 						     proc_dir,
 						     &bcm_proc_fops, sk);
+		if (!bo->bcm_proc_read) {
+			ret = -ENOMEM;
+			goto fail;
+		}
 	}
 
-	return 0;
+	bo->bound = 1;
+
+fail:
+	release_sock(sk);
+
+	return ret;
 }
 
 static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
diff -druNp --no-dereference linux-libre-4.8.10-gnu/net/netfilter/nft_dynset.c linux-libre-4.8.11-gnu/net/netfilter/nft_dynset.c
--- linux-libre-4.8.10-gnu/net/netfilter/nft_dynset.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/net/netfilter/nft_dynset.c	2016-11-26 03:57:13.000000000 -0500
@@ -143,7 +143,8 @@ static int nft_dynset_init(const struct
 	if (tb[NFTA_DYNSET_TIMEOUT] != NULL) {
 		if (!(set->flags & NFT_SET_TIMEOUT))
 			return -EINVAL;
-		timeout = be64_to_cpu(nla_get_be64(tb[NFTA_DYNSET_TIMEOUT]));
+		timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64(
+						tb[NFTA_DYNSET_TIMEOUT])));
 	}
 
 	priv->sreg_key = nft_parse_register(tb[NFTA_DYNSET_SREG_KEY]);
@@ -230,7 +231,8 @@ static int nft_dynset_dump(struct sk_buf
 		goto nla_put_failure;
 	if (nla_put_string(skb, NFTA_DYNSET_SET_NAME, priv->set->name))
 		goto nla_put_failure;
-	if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT, cpu_to_be64(priv->timeout),
+	if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT,
+			 cpu_to_be64(jiffies_to_msecs(priv->timeout)),
 			 NFTA_DYNSET_PAD))
 		goto nla_put_failure;
 	if (priv->expr && nft_expr_dump(skb, NFTA_DYNSET_EXPR, priv->expr))
diff -druNp --no-dereference linux-libre-4.8.10-gnu/net/sunrpc/svcsock.c linux-libre-4.8.11-gnu/net/sunrpc/svcsock.c
--- linux-libre-4.8.10-gnu/net/sunrpc/svcsock.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/net/sunrpc/svcsock.c	2016-11-26 03:57:13.000000000 -0500
@@ -438,6 +438,21 @@ static int svc_tcp_has_wspace(struct svc
 	return !test_bit(SOCK_NOSPACE, &svsk->sk_sock->flags);
 }
 
+static void svc_tcp_kill_temp_xprt(struct svc_xprt *xprt)
+{
+	struct svc_sock *svsk;
+	struct socket *sock;
+	struct linger no_linger = {
+		.l_onoff = 1,
+		.l_linger = 0,
+	};
+
+	svsk = container_of(xprt, struct svc_sock, sk_xprt);
+	sock = svsk->sk_sock;
+	kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER,
+			  (char *)&no_linger, sizeof(no_linger));
+}
+
 /*
  * See net/ipv6/ip_sockglue.c : ip_cmsg_recv_pktinfo
  */
@@ -648,6 +663,10 @@ static struct svc_xprt *svc_udp_accept(s
 	return NULL;
 }
 
+static void svc_udp_kill_temp_xprt(struct svc_xprt *xprt)
+{
+}
+
 static struct svc_xprt *svc_udp_create(struct svc_serv *serv,
 				       struct net *net,
 				       struct sockaddr *sa, int salen,
@@ -667,6 +686,7 @@ static struct svc_xprt_ops svc_udp_ops =
 	.xpo_has_wspace = svc_udp_has_wspace,
 	.xpo_accept = svc_udp_accept,
 	.xpo_secure_port = svc_sock_secure_port,
+	.xpo_kill_temp_xprt = svc_udp_kill_temp_xprt,
 };
 
 static struct svc_xprt_class svc_udp_class = {
@@ -1242,6 +1262,7 @@ static struct svc_xprt_ops svc_tcp_ops =
 	.xpo_has_wspace = svc_tcp_has_wspace,
 	.xpo_accept = svc_tcp_accept,
 	.xpo_secure_port = svc_sock_secure_port,
+	.xpo_kill_temp_xprt = svc_tcp_kill_temp_xprt,
 };
 
 static struct svc_xprt_class svc_tcp_class = {
diff -druNp --no-dereference linux-libre-4.8.10-gnu/net/sunrpc/svc_xprt.c linux-libre-4.8.11-gnu/net/sunrpc/svc_xprt.c
--- linux-libre-4.8.10-gnu/net/sunrpc/svc_xprt.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/net/sunrpc/svc_xprt.c	2016-11-26 03:57:13.000000000 -0500
@@ -1002,14 +1002,8 @@ static void svc_age_temp_xprts(unsigned
 void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr)
 {
 	struct svc_xprt *xprt;
-	struct svc_sock *svsk;
-	struct socket *sock;
 	struct list_head *le, *next;
 	LIST_HEAD(to_be_closed);
-	struct linger no_linger = {
-		.l_onoff = 1,
-		.l_linger = 0,
-	};
 
 	spin_lock_bh(&serv->sv_lock);
 	list_for_each_safe(le, next, &serv->sv_tempsocks) {
@@ -1027,10 +1021,7 @@ void svc_age_temp_xprts_now(struct svc_s
 		list_del_init(le);
 		xprt = list_entry(le, struct svc_xprt, xpt_list);
 		dprintk("svc_age_temp_xprts_now: closing %p\n", xprt);
-		svsk = container_of(xprt, struct svc_sock, sk_xprt);
-		sock = svsk->sk_sock;
-		kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER,
-				  (char *)&no_linger, sizeof(no_linger));
+		xprt->xpt_ops->xpo_kill_temp_xprt(xprt);
 		svc_close_xprt(xprt);
 	}
 }
diff -druNp --no-dereference linux-libre-4.8.10-gnu/net/sunrpc/xprtrdma/svc_rdma_transport.c linux-libre-4.8.11-gnu/net/sunrpc/xprtrdma/svc_rdma_transport.c
--- linux-libre-4.8.10-gnu/net/sunrpc/xprtrdma/svc_rdma_transport.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/net/sunrpc/xprtrdma/svc_rdma_transport.c	2016-11-26 03:57:13.000000000 -0500
@@ -67,6 +67,7 @@ static void svc_rdma_detach(struct svc_x
 static void svc_rdma_free(struct svc_xprt *xprt);
 static int svc_rdma_has_wspace(struct svc_xprt *xprt);
 static int svc_rdma_secure_port(struct svc_rqst *);
+static void svc_rdma_kill_temp_xprt(struct svc_xprt *);
 
 static struct svc_xprt_ops svc_rdma_ops = {
 	.xpo_create = svc_rdma_create,
@@ -79,6 +80,7 @@ static struct svc_xprt_ops svc_rdma_ops
 	.xpo_has_wspace = svc_rdma_has_wspace,
 	.xpo_accept = svc_rdma_accept,
 	.xpo_secure_port = svc_rdma_secure_port,
+	.xpo_kill_temp_xprt = svc_rdma_kill_temp_xprt,
 };
 
 struct svc_xprt_class svc_rdma_class = {
@@ -1285,6 +1287,10 @@ static int svc_rdma_secure_port(struct s
 	return 1;
 }
 
+static void svc_rdma_kill_temp_xprt(struct svc_xprt *xprt)
+{
+}
+
 int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
 {
 	struct ib_send_wr *bad_wr, *n_wr;
diff -druNp --no-dereference linux-libre-4.8.10-gnu/scripts/gcc-x86_64-has-stack-protector.sh linux-libre-4.8.11-gnu/scripts/gcc-x86_64-has-stack-protector.sh
--- linux-libre-4.8.10-gnu/scripts/gcc-x86_64-has-stack-protector.sh	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/scripts/gcc-x86_64-has-stack-protector.sh	2016-11-26 03:57:13.000000000 -0500
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
+echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
 if [ "$?" -eq "0" ] ; then
 	echo y
 else
diff -druNp --no-dereference linux-libre-4.8.10-gnu/sound/pci/hda/patch_realtek.c linux-libre-4.8.11-gnu/sound/pci/hda/patch_realtek.c
--- linux-libre-4.8.10-gnu/sound/pci/hda/patch_realtek.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/sound/pci/hda/patch_realtek.c	2016-11-26 03:57:13.000000000 -0500
@@ -6905,8 +6905,6 @@ static const struct hda_fixup alc662_fix
 		.v.pins = (const struct hda_pintbl[]) {
 			{ 0x15, 0x40f000f0 }, /* disabled */
 			{ 0x16, 0x40f000f0 }, /* disabled */
-			{ 0x18, 0x01014011 }, /* LO */
-			{ 0x1a, 0x01014012 }, /* LO */
 			{ }
 		}
 	},
diff -druNp --no-dereference linux-libre-4.8.10-gnu/sound/pci/hda/thinkpad_helper.c linux-libre-4.8.11-gnu/sound/pci/hda/thinkpad_helper.c
--- linux-libre-4.8.10-gnu/sound/pci/hda/thinkpad_helper.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/sound/pci/hda/thinkpad_helper.c	2016-11-26 03:57:13.000000000 -0500
@@ -13,7 +13,8 @@ static void (*old_vmaster_hook)(void *,
 static bool is_thinkpad(struct hda_codec *codec)
 {
 	return (codec->core.subsystem_id >> 16 == 0x17aa) &&
-	       (acpi_dev_found("LEN0068") || acpi_dev_found("IBM0068"));
+	       (acpi_dev_found("LEN0068") || acpi_dev_found("LEN0268") ||
+		acpi_dev_found("IBM0068"));
 }
 
 static void update_tpacpi_mute_led(void *private_data, int enabled)
diff -druNp --no-dereference linux-libre-4.8.10-gnu/sound/usb/card.c linux-libre-4.8.11-gnu/sound/usb/card.c
--- linux-libre-4.8.10-gnu/sound/usb/card.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/sound/usb/card.c	2016-11-26 03:57:13.000000000 -0500
@@ -315,7 +315,8 @@ static int snd_usb_audio_free(struct snd
 		snd_usb_endpoint_free(ep);
 
 	mutex_destroy(&chip->mutex);
-	dev_set_drvdata(&chip->dev->dev, NULL);
+	if (!atomic_read(&chip->shutdown))
+		dev_set_drvdata(&chip->dev->dev, NULL);
 	kfree(chip);
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.8.10-gnu/tools/perf/util/hist.c linux-libre-4.8.11-gnu/tools/perf/util/hist.c
--- linux-libre-4.8.10-gnu/tools/perf/util/hist.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/tools/perf/util/hist.c	2016-11-26 03:57:13.000000000 -0500
@@ -1596,18 +1596,18 @@ static void hists__hierarchy_output_reso
 		if (prog)
 			ui_progress__update(prog, 1);
 
+		hists->nr_entries++;
+		if (!he->filtered) {
+			hists->nr_non_filtered_entries++;
+			hists__calc_col_len(hists, he);
+		}
+
 		if (!he->leaf) {
 			hists__hierarchy_output_resort(hists, prog,
 						       &he->hroot_in,
 						       &he->hroot_out,
 						       min_callchain_hits,
 						       use_callchain);
-			hists->nr_entries++;
-			if (!he->filtered) {
-				hists->nr_non_filtered_entries++;
-				hists__calc_col_len(hists, he);
-			}
-
 			continue;
 		}
 
diff -druNp --no-dereference linux-libre-4.8.10-gnu/virt/kvm/arm/pmu.c linux-libre-4.8.11-gnu/virt/kvm/arm/pmu.c
--- linux-libre-4.8.10-gnu/virt/kvm/arm/pmu.c	2016-11-21 04:11:59.000000000 -0500
+++ linux-libre-4.8.11-gnu/virt/kvm/arm/pmu.c	2016-11-26 03:57:13.000000000 -0500
@@ -305,7 +305,7 @@ void kvm_pmu_software_increment(struct k
 			continue;
 		type = vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i)
 		       & ARMV8_PMU_EVTYPE_EVENT;
-		if ((type == ARMV8_PMU_EVTYPE_EVENT_SW_INCR)
+		if ((type == ARMV8_PMUV3_PERFCTR_SW_INCR)
 		    && (enable & BIT(i))) {
 			reg = vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1;
 			reg = lower_32_bits(reg);
@@ -379,7 +379,8 @@ void kvm_pmu_set_counter_event_type(stru
 	eventsel = data & ARMV8_PMU_EVTYPE_EVENT;
 
 	/* Software increment event does't need to be backed by a perf event */
-	if (eventsel == ARMV8_PMU_EVTYPE_EVENT_SW_INCR)
+	if (eventsel == ARMV8_PMUV3_PERFCTR_SW_INCR &&
+	    select_idx != ARMV8_PMU_CYCLE_IDX)
 		return;
 
 	memset(&attr, 0, sizeof(struct perf_event_attr));
@@ -391,7 +392,8 @@ void kvm_pmu_set_counter_event_type(stru
 	attr.exclude_kernel = data & ARMV8_PMU_EXCLUDE_EL1 ? 1 : 0;
 	attr.exclude_hv = 1; /* Don't count EL2 events */
 	attr.exclude_host = 1; /* Don't count host events */
-	attr.config = eventsel;
+	attr.config = (select_idx == ARMV8_PMU_CYCLE_IDX) ?
+		ARMV8_PMUV3_PERFCTR_CPU_CYCLES : eventsel;
 
 	counter = kvm_pmu_get_counter_value(vcpu, select_idx);
 	/* The initial sample period (overflow count) of an event. */
