diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/arm64/kvm/guest.c linux-libre-3.16.75-gnu/arch/arm64/kvm/guest.c
--- linux-libre-3.16.74-gnu/arch/arm64/kvm/guest.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/arm64/kvm/guest.c	2019-10-05 11:20:10.000000000 -0400
@@ -46,9 +46,8 @@ static u64 core_reg_offset_from_id(u64 i
 	return id & ~(KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_ARM_CORE);
 }
 
-static int validate_core_offset(const struct kvm_one_reg *reg)
+static int core_reg_size_from_offset(u64 off)
 {
-	u64 off = core_reg_offset_from_id(reg->id);
 	int size;
 
 	switch (off) {
@@ -78,13 +77,26 @@ static int validate_core_offset(const st
 		return -EINVAL;
 	}
 
-	if (KVM_REG_SIZE(reg->id) == size &&
-	    IS_ALIGNED(off, size / sizeof(__u32)))
-		return 0;
+	if (IS_ALIGNED(off, size / sizeof(__u32)))
+		return size;
 
 	return -EINVAL;
 }
 
+static int validate_core_offset(const struct kvm_one_reg *reg)
+{
+	u64 off = core_reg_offset_from_id(reg->id);
+	int size = core_reg_size_from_offset(off);
+
+	if (size < 0)
+		return -EINVAL;
+
+	if (KVM_REG_SIZE(reg->id) != size)
+		return -EINVAL;
+
+	return 0;
+}
+
 static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
 {
 	/*
@@ -197,10 +209,33 @@ unsigned long kvm_arm_num_regs(struct kv
 int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
 {
 	unsigned int i;
-	const u64 core_reg = KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE;
 
 	for (i = 0; i < sizeof(struct kvm_regs) / sizeof(__u32); i++) {
-		if (put_user(core_reg | i, uindices))
+		u64 reg = KVM_REG_ARM64 | KVM_REG_ARM_CORE | i;
+		int size = core_reg_size_from_offset(i);
+
+		if (size < 0)
+			continue;
+
+		switch (size) {
+		case sizeof(__u32):
+			reg |= KVM_REG_SIZE_U32;
+			break;
+
+		case sizeof(__u64):
+			reg |= KVM_REG_SIZE_U64;
+			break;
+
+		case sizeof(__uint128_t):
+			reg |= KVM_REG_SIZE_U128;
+			break;
+
+		default:
+			WARN_ON(1);
+			continue;
+		}
+
+		if (put_user(reg, uindices))
 			return -EFAULT;
 		uindices++;
 	}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/mips/mm/tlbex.c linux-libre-3.16.75-gnu/arch/mips/mm/tlbex.c
--- linux-libre-3.16.74-gnu/arch/mips/mm/tlbex.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/mips/mm/tlbex.c	2019-10-05 11:20:10.000000000 -0400
@@ -374,6 +374,7 @@ static struct work_registers build_get_w
 static void build_restore_work_registers(u32 **p)
 {
 	if (scratch_reg >= 0) {
+		uasm_i_ehb(p);
 		UASM_i_MFC0(p, 1, c0_kscratch(), scratch_reg);
 		return;
 	}
@@ -665,10 +666,12 @@ static void build_restore_pagemask(u32 *
 			uasm_i_mtc0(p, 0, C0_PAGEMASK);
 			uasm_il_b(p, r, lid);
 		}
-		if (scratch_reg >= 0)
+		if (scratch_reg >= 0) {
+			uasm_i_ehb(p);
 			UASM_i_MFC0(p, 1, c0_kscratch(), scratch_reg);
-		else
+		} else {
 			UASM_i_LW(p, 1, scratchpad_offset(0), 0);
+		}
 	} else {
 		/* Reset default page size */
 		if (PM_DEFAULT_MASK >> 16) {
@@ -906,10 +909,12 @@ build_get_pgd_vmalloc64(u32 **p, struct
 		uasm_i_jr(p, ptr);
 
 		if (mode == refill_scratch) {
-			if (scratch_reg >= 0)
+			if (scratch_reg >= 0) {
+				uasm_i_ehb(p);
 				UASM_i_MFC0(p, 1, c0_kscratch(), scratch_reg);
-			else
+			} else {
 				UASM_i_LW(p, 1, scratchpad_offset(0), 0);
+			}
 		} else {
 			uasm_i_nop(p);
 		}
@@ -1215,6 +1220,7 @@ build_fast_tlb_refill_handler (u32 **p,
 	UASM_i_MTC0(p, odd, C0_ENTRYLO1); /* load it */
 
 	if (c0_scratch_reg >= 0) {
+		uasm_i_ehb(p);
 		UASM_i_MFC0(p, scratch, c0_kscratch(), c0_scratch_reg);
 		build_tlb_write_entry(p, l, r, tlb_random);
 		uasm_l_leave(l, *p);
@@ -1466,12 +1472,14 @@ static void build_setup_pgd(void)
 		uasm_i_dinsm(&p, a0, 0, 29, 64 - 29);
 		uasm_l_tlbl_goaround1(&l, p);
 		UASM_i_SLL(&p, a0, a0, 11);
-		uasm_i_jr(&p, 31);
 		UASM_i_MTC0(&p, a0, C0_CONTEXT);
+		uasm_i_jr(&p, 31);
+		uasm_i_ehb(&p);
 	} else {
 		/* PGD in c0_KScratch */
-		uasm_i_jr(&p, 31);
 		UASM_i_MTC0(&p, a0, c0_kscratch(), pgd_reg);
+		uasm_i_jr(&p, 31);
+		uasm_i_ehb(&p);
 	}
 #else
 #ifdef CONFIG_SMP
@@ -1485,13 +1493,16 @@ static void build_setup_pgd(void)
 	UASM_i_LA_mostly(&p, a2, pgdc);
 	UASM_i_SW(&p, a0, uasm_rel_lo(pgdc), a2);
 #endif /* SMP */
-	uasm_i_jr(&p, 31);
 
 	/* if pgd_reg is allocated, save PGD also to scratch register */
-	if (pgd_reg != -1)
+	if (pgd_reg != -1) {
 		UASM_i_MTC0(&p, a0, c0_kscratch(), pgd_reg);
-	else
+		uasm_i_jr(&p, 31);
+		uasm_i_ehb(&p);
+	} else {
+		uasm_i_jr(&p, 31);
 		uasm_i_nop(&p);
+	}
 #endif
 	if (p >= tlbmiss_handler_setup_pgd_end)
 		panic("tlbmiss_handler_setup_pgd space exceeded");
diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/powerpc/perf/core-book3s.c linux-libre-3.16.75-gnu/arch/powerpc/perf/core-book3s.c
--- linux-libre-3.16.74-gnu/arch/powerpc/perf/core-book3s.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/powerpc/perf/core-book3s.c	2019-10-05 11:20:10.000000000 -0400
@@ -1726,6 +1726,7 @@ static int power_pmu_event_init(struct p
 	int n;
 	int err;
 	struct cpu_hw_events *cpuhw;
+	u64 bhrb_filter;
 
 	if (!ppmu)
 		return -ENOENT;
@@ -1822,11 +1823,14 @@ static int power_pmu_event_init(struct p
 	err = power_check_constraints(cpuhw, events, cflags, n + 1);
 
 	if (has_branch_stack(event)) {
-		cpuhw->bhrb_filter = ppmu->bhrb_filter_map(
+		bhrb_filter = ppmu->bhrb_filter_map(
 					event->attr.branch_sample_type);
 
-		if(cpuhw->bhrb_filter == -1)
+		if (bhrb_filter == -1) {
+			put_cpu_var(cpu_hw_events);
 			return -EOPNOTSUPP;
+		}
+		cpuhw->bhrb_filter = bhrb_filter;
 	}
 
 	put_cpu_var(cpu_hw_events);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/powerpc/perf/power8-pmu.c linux-libre-3.16.75-gnu/arch/powerpc/perf/power8-pmu.c
--- linux-libre-3.16.74-gnu/arch/powerpc/perf/power8-pmu.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/powerpc/perf/power8-pmu.c	2019-10-05 11:20:10.000000000 -0400
@@ -175,6 +175,7 @@
 #define	POWER8_MMCRA_IFM1		0x0000000040000000UL
 #define	POWER8_MMCRA_IFM2		0x0000000080000000UL
 #define	POWER8_MMCRA_IFM3		0x00000000C0000000UL
+#define	POWER8_MMCRA_BHRB_MASK		0x00000000C0000000UL
 
 #define ONLY_PLM \
 	(PERF_SAMPLE_BRANCH_USER        |\
@@ -666,6 +667,8 @@ static u64 power8_bhrb_filter_map(u64 br
 
 static void power8_config_bhrb(u64 pmu_bhrb_filter)
 {
+	pmu_bhrb_filter &= POWER8_MMCRA_BHRB_MASK;
+
 	/* Enable BHRB filter in PMU */
 	mtspr(SPRN_MMCRA, (mfspr(SPRN_MMCRA) | pmu_bhrb_filter));
 }
diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/s390/crypto/aes_s390.c linux-libre-3.16.75-gnu/arch/s390/crypto/aes_s390.c
--- linux-libre-3.16.74-gnu/arch/s390/crypto/aes_s390.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/s390/crypto/aes_s390.c	2019-10-05 11:20:10.000000000 -0400
@@ -25,7 +25,7 @@
 #include <linux/err.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include "crypt_s390.h"
 
 #define AES_KEYLEN_128		1
@@ -33,7 +33,7 @@
 #define AES_KEYLEN_256		4
 
 static u8 *ctrblk;
-static DEFINE_SPINLOCK(ctrblk_lock);
+static DEFINE_MUTEX(ctrblk_lock);
 static char keylen_flag;
 
 struct s390_aes_ctx {
@@ -785,7 +785,7 @@ static int ctr_aes_crypt(struct blkciphe
 	if (!walk->nbytes)
 		return ret;
 
-	if (spin_trylock(&ctrblk_lock))
+	if (mutex_trylock(&ctrblk_lock))
 		ctrptr = ctrblk;
 
 	memcpy(ctrptr, walk->iv, AES_BLOCK_SIZE);
@@ -801,7 +801,7 @@ static int ctr_aes_crypt(struct blkciphe
 					       n, ctrptr);
 			if (ret < 0 || ret != n) {
 				if (ctrptr == ctrblk)
-					spin_unlock(&ctrblk_lock);
+					mutex_unlock(&ctrblk_lock);
 				return -EIO;
 			}
 			if (n > AES_BLOCK_SIZE)
@@ -819,7 +819,7 @@ static int ctr_aes_crypt(struct blkciphe
 			memcpy(ctrbuf, ctrptr, AES_BLOCK_SIZE);
 		else
 			memcpy(walk->iv, ctrptr, AES_BLOCK_SIZE);
-		spin_unlock(&ctrblk_lock);
+		mutex_unlock(&ctrblk_lock);
 	} else {
 		if (!nbytes)
 			memcpy(walk->iv, ctrptr, AES_BLOCK_SIZE);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/s390/crypto/des_s390.c linux-libre-3.16.75-gnu/arch/s390/crypto/des_s390.c
--- linux-libre-3.16.74-gnu/arch/s390/crypto/des_s390.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/s390/crypto/des_s390.c	2019-10-05 11:20:10.000000000 -0400
@@ -17,6 +17,7 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/crypto.h>
+#include <linux/mutex.h>
 #include <crypto/algapi.h>
 #include <crypto/des.h>
 
@@ -25,7 +26,7 @@
 #define DES3_KEY_SIZE	(3 * DES_KEY_SIZE)
 
 static u8 *ctrblk;
-static DEFINE_SPINLOCK(ctrblk_lock);
+static DEFINE_MUTEX(ctrblk_lock);
 
 struct s390_des_ctx {
 	u8 iv[DES_BLOCK_SIZE];
@@ -394,7 +395,7 @@ static int ctr_desall_crypt(struct blkci
 	if (!walk->nbytes)
 		return ret;
 
-	if (spin_trylock(&ctrblk_lock))
+	if (mutex_trylock(&ctrblk_lock))
 		ctrptr = ctrblk;
 
 	memcpy(ctrptr, walk->iv, DES_BLOCK_SIZE);
@@ -410,7 +411,7 @@ static int ctr_desall_crypt(struct blkci
 					       n, ctrptr);
 			if (ret < 0 || ret != n) {
 				if (ctrptr == ctrblk)
-					spin_unlock(&ctrblk_lock);
+					mutex_unlock(&ctrblk_lock);
 				return -EIO;
 			}
 			if (n > DES_BLOCK_SIZE)
@@ -428,7 +429,7 @@ static int ctr_desall_crypt(struct blkci
 			memcpy(ctrbuf, ctrptr, DES_BLOCK_SIZE);
 		else
 			memcpy(walk->iv, ctrptr, DES_BLOCK_SIZE);
-		spin_unlock(&ctrblk_lock);
+		mutex_unlock(&ctrblk_lock);
 	} else {
 		if (!nbytes)
 			memcpy(walk->iv, ctrptr, DES_BLOCK_SIZE);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/x86/kernel/apic/apic.c linux-libre-3.16.75-gnu/arch/x86/kernel/apic/apic.c
--- linux-libre-3.16.74-gnu/arch/x86/kernel/apic/apic.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/x86/kernel/apic/apic.c	2019-10-05 11:20:10.000000000 -0400
@@ -1403,7 +1403,8 @@ void setup_local_APIC(void)
 		if (queued) {
 			if (cpu_has_tsc && cpu_khz) {
 				rdtscll(ntsc);
-				max_loops = (cpu_khz << 10) - (ntsc - tsc);
+				max_loops = (long long)cpu_khz << 10;
+				max_loops -= ntsc - tsc;
 			} else
 				max_loops--;
 		}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/arch/x86/kernel/cpu/bugs.c linux-libre-3.16.75-gnu/arch/x86/kernel/cpu/bugs.c
--- linux-libre-3.16.74-gnu/arch/x86/kernel/cpu/bugs.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/arch/x86/kernel/cpu/bugs.c	2019-10-05 11:20:10.000000000 -0400
@@ -960,6 +960,16 @@ static enum ssb_mitigation __init __ssb_
 	}
 
 	/*
+	 * If SSBD is controlled by the SPEC_CTRL MSR, then set the proper
+	 * bit in the mask to allow guests to use the mitigation even in the
+	 * case where the host does not enable it.
+	 */
+	if (static_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) ||
+	    static_cpu_has(X86_FEATURE_AMD_SSBD)) {
+		x86_spec_ctrl_mask |= SPEC_CTRL_SSBD;
+	}
+
+	/*
 	 * We have three CPU feature flags that are in play here:
 	 *  - X86_BUG_SPEC_STORE_BYPASS - CPU is susceptible.
 	 *  - X86_FEATURE_SSBD - CPU is able to turn off speculative store bypass
@@ -976,7 +986,6 @@ static enum ssb_mitigation __init __ssb_
 			x86_amd_ssb_disable();
 		} else {
 			x86_spec_ctrl_base |= SPEC_CTRL_SSBD;
-			x86_spec_ctrl_mask |= SPEC_CTRL_SSBD;
 			wrmsrl(MSR_IA32_SPEC_CTRL, x86_spec_ctrl_base);
 		}
 	}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/block/blk-mq-tag.c linux-libre-3.16.75-gnu/block/blk-mq-tag.c
--- linux-libre-3.16.74-gnu/block/blk-mq-tag.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/block/blk-mq-tag.c	2019-10-05 11:20:10.000000000 -0400
@@ -499,7 +499,7 @@ static void bt_update_count(struct blk_m
 		 * Pairs with the memory barrier in bt_clear_tag() to ensure
 		 * that the batch size is updated before the wait counts.
 		 */
-		smp_mb__before_atomic();
+		smp_mb();
 		for (i = 0; i < BT_WAIT_QUEUES; i++)
 			atomic_set(&bt->bs[i].wait_cnt, 1);
 	}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/crypto/crypto_user.c linux-libre-3.16.75-gnu/crypto/crypto_user.c
--- linux-libre-3.16.74-gnu/crypto/crypto_user.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/crypto/crypto_user.c	2019-10-05 11:20:10.000000000 -0400
@@ -53,6 +53,9 @@ static struct crypto_alg *crypto_alg_mat
 	list_for_each_entry(q, &crypto_alg_list, cra_list) {
 		int match = 0;
 
+		if (crypto_is_larval(q))
+			continue;
+
 		if ((q->cra_flags ^ p->cru_type) & p->cru_mask)
 			continue;
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/ata/libata-core.c linux-libre-3.16.75-gnu/drivers/ata/libata-core.c
--- linux-libre-3.16.74-gnu/drivers/ata/libata-core.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/ata/libata-core.c	2019-10-05 11:20:10.000000000 -0400
@@ -4176,9 +4176,12 @@ static const struct ata_blacklist_entry
 	{ "ST3320[68]13AS",	"SD1[5-9]",	ATA_HORKAGE_NONCQ |
 						ATA_HORKAGE_FIRMWARE_WARN },
 
-	/* drives which fail FPDMA_AA activation (some may freeze afterwards) */
-	{ "ST1000LM024 HN-M101MBB", "2AR10001",	ATA_HORKAGE_BROKEN_FPDMA_AA },
-	{ "ST1000LM024 HN-M101MBB", "2BA30001",	ATA_HORKAGE_BROKEN_FPDMA_AA },
+	/* drives which fail FPDMA_AA activation (some may freeze afterwards)
+	   the ST disks also have LPM issues */
+	{ "ST1000LM024 HN-M101MBB", "2AR10001",	ATA_HORKAGE_BROKEN_FPDMA_AA |
+						ATA_HORKAGE_NOLPM, },
+	{ "ST1000LM024 HN-M101MBB", "2BA30001",	ATA_HORKAGE_BROKEN_FPDMA_AA |
+						ATA_HORKAGE_NOLPM, },
 	{ "VB0250EAVER",	"HPG7",		ATA_HORKAGE_BROKEN_FPDMA_AA },
 
 	/* Blacklist entries taken from Silicon Image 3124/3132
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/gpio/Kconfig linux-libre-3.16.75-gnu/drivers/gpio/Kconfig
--- linux-libre-3.16.74-gnu/drivers/gpio/Kconfig	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/gpio/Kconfig	2019-10-05 11:20:10.000000000 -0400
@@ -654,6 +654,7 @@ config GPIO_ADP5588
 config GPIO_ADP5588_IRQ
 	bool "Interrupt controller support for ADP5588"
 	depends on GPIO_ADP5588=y
+	select GPIOLIB_IRQCHIP
 	help
 	  Say yes here to enable the adp5588 to be used as an interrupt
 	  controller. It requires the driver to be built in the kernel.
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/gpu/drm/gma500/cdv_intel_lvds.c linux-libre-3.16.75-gnu/drivers/gpu/drm/gma500/cdv_intel_lvds.c
--- linux-libre-3.16.74-gnu/drivers/gpu/drm/gma500/cdv_intel_lvds.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/gpu/drm/gma500/cdv_intel_lvds.c	2019-10-05 11:20:10.000000000 -0400
@@ -620,6 +620,9 @@ void cdv_intel_lvds_init(struct drm_devi
 	int pipe;
 	u8 pin;
 
+	if (!dev_priv->lvds_enabled_in_vbt)
+		return;
+
 	pin = GMBUS_PORT_PANEL;
 	if (!lvds_is_present_in_vbt(dev, &pin)) {
 		DRM_DEBUG_KMS("LVDS is not present in VBT\n");
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/gpu/drm/gma500/intel_bios.c linux-libre-3.16.75-gnu/drivers/gpu/drm/gma500/intel_bios.c
--- linux-libre-3.16.74-gnu/drivers/gpu/drm/gma500/intel_bios.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/gpu/drm/gma500/intel_bios.c	2019-10-05 11:20:10.000000000 -0400
@@ -436,6 +436,9 @@ parse_driver_features(struct drm_psb_pri
 	if (driver->lvds_config == BDB_DRIVER_FEATURE_EDP)
 		dev_priv->edp.support = 1;
 
+	dev_priv->lvds_enabled_in_vbt = driver->lvds_config != 0;
+	DRM_DEBUG_KMS("LVDS VBT config bits: 0x%x\n", driver->lvds_config);
+
 	/* This bit means to use 96Mhz for DPLL_A or not */
 	if (driver->primary_lfp_id)
 		dev_priv->dplla_96mhz = true;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/gpu/drm/gma500/psb_drv.h linux-libre-3.16.75-gnu/drivers/gpu/drm/gma500/psb_drv.h
--- linux-libre-3.16.74-gnu/drivers/gpu/drm/gma500/psb_drv.h	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/gpu/drm/gma500/psb_drv.h	2019-10-05 11:20:10.000000000 -0400
@@ -533,6 +533,7 @@ struct drm_psb_private {
 	int lvds_ssc_freq;
 	bool is_lvds_on;
 	bool is_mipi_on;
+	bool lvds_enabled_in_vbt;
 	u32 mipi_ctrl_display;
 
 	unsigned int core_freq;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/hwmon/pmbus/pmbus_core.c linux-libre-3.16.75-gnu/drivers/hwmon/pmbus/pmbus_core.c
--- linux-libre-3.16.74-gnu/drivers/hwmon/pmbus/pmbus_core.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/hwmon/pmbus/pmbus_core.c	2019-10-05 11:20:10.000000000 -0400
@@ -987,14 +987,15 @@ static int pmbus_add_sensor_attrs_one(st
 				      const struct pmbus_driver_info *info,
 				      const char *name,
 				      int index, int page,
-				      const struct pmbus_sensor_attr *attr)
+				      const struct pmbus_sensor_attr *attr,
+				      bool paged)
 {
 	struct pmbus_sensor *base;
 	int ret;
 
 	if (attr->label) {
 		ret = pmbus_add_label(data, name, index, attr->label,
-				      attr->paged ? page + 1 : 0);
+				      paged ? page + 1 : 0);
 		if (ret)
 			return ret;
 	}
@@ -1026,6 +1027,30 @@ static int pmbus_add_sensor_attrs_one(st
 	return 0;
 }
 
+static bool pmbus_sensor_is_paged(const struct pmbus_driver_info *info,
+				  const struct pmbus_sensor_attr *attr)
+{
+	int p;
+
+	if (attr->paged)
+		return true;
+
+	/*
+	 * Some attributes may be present on more than one page despite
+	 * not being marked with the paged attribute. If that is the case,
+	 * then treat the sensor as being paged and add the page suffix to the
+	 * attribute name.
+	 * We don't just add the paged attribute to all such attributes, in
+	 * order to maintain the un-suffixed labels in the case where the
+	 * attribute is only on page 0.
+	 */
+	for (p = 1; p < info->pages; p++) {
+		if (info->func[p] & attr->func)
+			return true;
+	}
+	return false;
+}
+
 static int pmbus_add_sensor_attrs(struct i2c_client *client,
 				  struct pmbus_data *data,
 				  const char *name,
@@ -1039,14 +1064,15 @@ static int pmbus_add_sensor_attrs(struct
 	index = 1;
 	for (i = 0; i < nattrs; i++) {
 		int page, pages;
+		bool paged = pmbus_sensor_is_paged(info, attrs);
 
-		pages = attrs->paged ? info->pages : 1;
+		pages = paged ? info->pages : 1;
 		for (page = 0; page < pages; page++) {
 			if (!(info->func[page] & attrs->func))
 				continue;
 			ret = pmbus_add_sensor_attrs_one(client, data, info,
 							 name, index, page,
-							 attrs);
+							 attrs, paged);
 			if (ret)
 				return ret;
 			index++;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/i2c/busses/i2c-acorn.c linux-libre-3.16.75-gnu/drivers/i2c/busses/i2c-acorn.c
--- linux-libre-3.16.74-gnu/drivers/i2c/busses/i2c-acorn.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/i2c/busses/i2c-acorn.c	2019-10-05 11:20:10.000000000 -0400
@@ -83,6 +83,7 @@ static struct i2c_algo_bit_data ioc_data
 
 static struct i2c_adapter ioc_ops = {
 	.nr			= 0,
+	.name			= "ioc",
 	.algo_data		= &ioc_data,
 };
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/i2c/i2c-dev.c linux-libre-3.16.75-gnu/drivers/i2c/i2c-dev.c
--- linux-libre-3.16.74-gnu/drivers/i2c/i2c-dev.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/i2c/i2c-dev.c	2019-10-05 11:20:10.000000000 -0400
@@ -300,6 +300,7 @@ static noinline int i2cdev_ioctl_rdrw(st
 			    rdwr_pa[i].buf[0] < 1 ||
 			    rdwr_pa[i].len < rdwr_pa[i].buf[0] +
 					     I2C_SMBUS_BLOCK_MAX) {
+				i++;
 				res = -EINVAL;
 				break;
 			}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/input/misc/uinput.c linux-libre-3.16.75-gnu/drivers/input/misc/uinput.c
--- linux-libre-3.16.74-gnu/drivers/input/misc/uinput.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/input/misc/uinput.c	2019-10-05 11:20:10.000000000 -0400
@@ -908,13 +908,31 @@ static long uinput_ioctl(struct file *fi
 
 #ifdef CONFIG_COMPAT
 
-#define UI_SET_PHYS_COMPAT	_IOW(UINPUT_IOCTL_BASE, 108, compat_uptr_t)
+/*
+ * These IOCTLs change their size and thus their numbers between
+ * 32 and 64 bits.
+ */
+#define UI_SET_PHYS_COMPAT		\
+	_IOW(UINPUT_IOCTL_BASE, 108, compat_uptr_t)
+#define UI_BEGIN_FF_UPLOAD_COMPAT	\
+	_IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload_compat)
+#define UI_END_FF_UPLOAD_COMPAT		\
+	_IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload_compat)
 
 static long uinput_compat_ioctl(struct file *file,
 				unsigned int cmd, unsigned long arg)
 {
-	if (cmd == UI_SET_PHYS_COMPAT)
+	switch (cmd) {
+	case UI_SET_PHYS_COMPAT:
 		cmd = UI_SET_PHYS;
+		break;
+	case UI_BEGIN_FF_UPLOAD_COMPAT:
+		cmd = UI_BEGIN_FF_UPLOAD;
+		break;
+	case UI_END_FF_UPLOAD_COMPAT:
+		cmd = UI_END_FF_UPLOAD;
+		break;
+	}
 
 	return uinput_ioctl_handler(file, cmd, arg, compat_ptr(arg));
 }
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/md/bcache/bset.c linux-libre-3.16.75-gnu/drivers/md/bcache/bset.c
--- linux-libre-3.16.74-gnu/drivers/md/bcache/bset.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/md/bcache/bset.c	2019-10-05 11:20:10.000000000 -0400
@@ -823,12 +823,22 @@ unsigned bch_btree_insert_key(struct btr
 	struct bset *i = bset_tree_last(b)->data;
 	struct bkey *m, *prev = NULL;
 	struct btree_iter iter;
+	struct bkey preceding_key_on_stack = ZERO_KEY;
+	struct bkey *preceding_key_p = &preceding_key_on_stack;
 
 	BUG_ON(b->ops->is_extents && !KEY_SIZE(k));
 
-	m = bch_btree_iter_init(b, &iter, b->ops->is_extents
-				? PRECEDING_KEY(&START_KEY(k))
-				: PRECEDING_KEY(k));
+	/*
+	 * If k has preceding key, preceding_key_p will be set to address
+	 *  of k's preceding key; otherwise preceding_key_p will be set
+	 * to NULL inside preceding_key().
+	 */
+	if (b->ops->is_extents)
+		preceding_key(&START_KEY(k), &preceding_key_p);
+	else
+		preceding_key(k, &preceding_key_p);
+
+	m = bch_btree_iter_init(b, &iter, preceding_key_p);
 
 	if (b->ops->insert_fixup(b, k, &iter, replace_key))
 		return status;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/md/bcache/bset.h linux-libre-3.16.75-gnu/drivers/md/bcache/bset.h
--- linux-libre-3.16.74-gnu/drivers/md/bcache/bset.h	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/md/bcache/bset.h	2019-10-05 11:20:10.000000000 -0400
@@ -417,20 +417,26 @@ static inline bool bch_cut_back(const st
 	return __bch_cut_back(where, k);
 }
 
-#define PRECEDING_KEY(_k)					\
-({								\
-	struct bkey *_ret = NULL;				\
-								\
-	if (KEY_INODE(_k) || KEY_OFFSET(_k)) {			\
-		_ret = &KEY(KEY_INODE(_k), KEY_OFFSET(_k), 0);	\
-								\
-		if (!_ret->low)					\
-			_ret->high--;				\
-		_ret->low--;					\
-	}							\
-								\
-	_ret;							\
-})
+/*
+ * Pointer '*preceding_key_p' points to a memory object to store preceding
+ * key of k. If the preceding key does not exist, set '*preceding_key_p' to
+ * NULL. So the caller of preceding_key() needs to take care of memory
+ * which '*preceding_key_p' pointed to before calling preceding_key().
+ * Currently the only caller of preceding_key() is bch_btree_insert_key(),
+ * and it points to an on-stack variable, so the memory release is handled
+ * by stackframe itself.
+ */
+static inline void preceding_key(struct bkey *k, struct bkey **preceding_key_p)
+{
+	if (KEY_INODE(k) || KEY_OFFSET(k)) {
+		(**preceding_key_p) = KEY(KEY_INODE(k), KEY_OFFSET(k), 0);
+		if (!(*preceding_key_p)->low)
+			(*preceding_key_p)->high--;
+		(*preceding_key_p)->low--;
+	} else {
+		(*preceding_key_p) = NULL;
+	}
+}
 
 static inline bool bch_ptr_invalid(struct btree_keys *b, const struct bkey *k)
 {
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/misc/genwqe/card_dev.c linux-libre-3.16.75-gnu/drivers/misc/genwqe/card_dev.c
--- linux-libre-3.16.74-gnu/drivers/misc/genwqe/card_dev.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/misc/genwqe/card_dev.c	2019-10-05 11:20:10.000000000 -0400
@@ -779,6 +779,8 @@ static int genwqe_pin_mem(struct genwqe_
 
 	if ((m->addr == 0x0) || (m->size == 0))
 		return -EINVAL;
+	if (m->size > ULONG_MAX - PAGE_SIZE - (m->addr & ~PAGE_MASK))
+		return -EINVAL;
 
 	map_addr = (m->addr & PAGE_MASK);
 	map_size = round_up(m->size + (m->addr & ~PAGE_MASK), PAGE_SIZE);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/misc/genwqe/card_utils.c linux-libre-3.16.75-gnu/drivers/misc/genwqe/card_utils.c
--- linux-libre-3.16.74-gnu/drivers/misc/genwqe/card_utils.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/misc/genwqe/card_utils.c	2019-10-05 11:20:10.000000000 -0400
@@ -571,6 +571,10 @@ int genwqe_user_vmap(struct genwqe_dev *
 	/* determine space needed for page_list. */
 	data = (unsigned long)uaddr;
 	offs = offset_in_page(data);
+	if (size > ULONG_MAX - PAGE_SIZE - offs) {
+		m->size = 0;	/* mark unused and not added */
+		return -EINVAL;
+	}
 	m->nr_pages = DIV_ROUND_UP(offs + size, PAGE_SIZE);
 
 	m->page_list = kcalloc(m->nr_pages,
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/net/bonding/bond_main.c linux-libre-3.16.75-gnu/drivers/net/bonding/bond_main.c
--- linux-libre-3.16.74-gnu/drivers/net/bonding/bond_main.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/net/bonding/bond_main.c	2019-10-05 11:20:10.000000000 -0400
@@ -1083,7 +1083,9 @@ static void bond_compute_features(struct
 
 done:
 	bond_dev->vlan_features = vlan_features;
-	bond_dev->hw_enc_features = enc_features;
+	bond_dev->hw_enc_features = enc_features |
+				    NETIF_F_HW_VLAN_CTAG_TX |
+				    NETIF_F_HW_VLAN_STAG_TX;
 	bond_dev->hard_header_len = max_hard_header_len;
 	bond_dev->gso_max_segs = gso_max_segs;
 	netif_set_gso_max_size(bond_dev, gso_max_size);
@@ -4038,13 +4040,13 @@ void bond_setup(struct net_device *bond_
 	bond_dev->features |= NETIF_F_NETNS_LOCAL;
 
 	bond_dev->hw_features = BOND_VLAN_FEATURES |
-				NETIF_F_HW_VLAN_CTAG_TX |
 				NETIF_F_HW_VLAN_CTAG_RX |
 				NETIF_F_HW_VLAN_CTAG_FILTER;
 
 	bond_dev->hw_features &= ~(NETIF_F_ALL_CSUM & ~NETIF_F_HW_CSUM);
 	bond_dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL;
 	bond_dev->features |= bond_dev->hw_features;
+	bond_dev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
 }
 
 /*
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/net/can/flexcan.c linux-libre-3.16.75-gnu/drivers/net/can/flexcan.c
--- linux-libre-3.16.74-gnu/drivers/net/can/flexcan.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/net/can/flexcan.c	2019-10-05 11:20:10.000000000 -0400
@@ -157,7 +157,7 @@
 
 #define FLEXCAN_MB_CODE_MASK		(0xf0ffffff)
 
-#define FLEXCAN_TIMEOUT_US             (50)
+#define FLEXCAN_TIMEOUT_US		(250)
 
 /*
  * FLEXCAN hardware feature flags
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/net/ethernet/dec/tulip/de4x5.c linux-libre-3.16.75-gnu/drivers/net/ethernet/dec/tulip/de4x5.c
--- linux-libre-3.16.74-gnu/drivers/net/ethernet/dec/tulip/de4x5.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/net/ethernet/dec/tulip/de4x5.c	2019-10-05 11:20:10.000000000 -0400
@@ -2107,7 +2107,6 @@ static struct eisa_driver de4x5_eisa_dri
 		.remove  = de4x5_eisa_remove,
         }
 };
-MODULE_DEVICE_TABLE(eisa, de4x5_eisa_ids);
 #endif
 
 #ifdef CONFIG_PCI
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/net/ethernet/emulex/benet/be_ethtool.c linux-libre-3.16.75-gnu/drivers/net/ethernet/emulex/benet/be_ethtool.c
--- linux-libre-3.16.74-gnu/drivers/net/ethernet/emulex/benet/be_ethtool.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/net/ethernet/emulex/benet/be_ethtool.c	2019-10-05 11:20:10.000000000 -0400
@@ -779,7 +779,7 @@ static void be_self_test(struct net_devi
 			 u64 *data)
 {
 	struct be_adapter *adapter = netdev_priv(netdev);
-	int status;
+	int status, cnt;
 	u8 link_status = 0;
 
 	if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) {
@@ -790,6 +790,9 @@ static void be_self_test(struct net_devi
 
 	memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM);
 
+	/* check link status before offline tests */
+	link_status = netif_carrier_ok(netdev);
+
 	if (test->flags & ETH_TEST_FL_OFFLINE) {
 		if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0)
 			test->flags |= ETH_TEST_FL_FAILED;
@@ -810,13 +813,26 @@ static void be_self_test(struct net_devi
 		test->flags |= ETH_TEST_FL_FAILED;
 	}
 
-	status = be_cmd_link_status_query(adapter, NULL, &link_status, 0);
-	if (status) {
-		test->flags |= ETH_TEST_FL_FAILED;
-		data[4] = -1;
-	} else if (!link_status) {
+	/* link status was down prior to test */
+	if (!link_status) {
 		test->flags |= ETH_TEST_FL_FAILED;
 		data[4] = 1;
+		return;
+	}
+
+	for (cnt = 10; cnt; cnt--) {
+		status = be_cmd_link_status_query(adapter, NULL, &link_status,
+						  0);
+		if (status) {
+			test->flags |= ETH_TEST_FL_FAILED;
+			data[4] = -1;
+			break;
+		}
+
+		if (link_status)
+			break;
+
+		msleep_interruptible(500);
 	}
 }
 
@@ -962,7 +978,7 @@ static int be_get_rxnfc(struct net_devic
 		cmd->data = be_get_rss_hash_opts(adapter, cmd->flow_type);
 		break;
 	case ETHTOOL_GRXRINGS:
-		cmd->data = adapter->num_rx_qs - 1;
+		cmd->data = adapter->num_rx_qs;
 		break;
 	default:
 		return -EINVAL;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/net/ethernet/mellanox/mlx4/mcg.c linux-libre-3.16.75-gnu/drivers/net/ethernet/mellanox/mlx4/mcg.c
--- linux-libre-3.16.74-gnu/drivers/net/ethernet/mellanox/mlx4/mcg.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/net/ethernet/mellanox/mlx4/mcg.c	2019-10-05 11:20:10.000000000 -0400
@@ -1329,7 +1329,7 @@ int mlx4_flow_steer_promisc_add(struct m
 	rule.port = port;
 	rule.qpn = qpn;
 	INIT_LIST_HEAD(&rule.list);
-	mlx4_err(dev, "going promisc on %x\n", port);
+	mlx4_info(dev, "going promisc on %x\n", port);
 
 	return  mlx4_flow_attach(dev, &rule, regid_p);
 }
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c linux-libre-3.16.75-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
--- linux-libre-3.16.74-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c	2019-10-05 11:20:10.000000000 -0400
@@ -159,7 +159,8 @@ int stmmac_mdio_reset(struct mii_bus *bu
 		reset_gpio = data->reset_gpio;
 		active_low = data->active_low;
 
-		if (!gpio_request(reset_gpio, "mdio-reset")) {
+		if (!devm_gpio_request(priv->device, reset_gpio,
+				      "mdio-reset")) {
 			gpio_direction_output(reset_gpio, active_low ? 1 : 0);
 			udelay(data->delays[0]);
 			gpio_set_value(reset_gpio, active_low ? 0 : 1);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/parisc/ccio-dma.c linux-libre-3.16.75-gnu/drivers/parisc/ccio-dma.c
--- linux-libre-3.16.74-gnu/drivers/parisc/ccio-dma.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/parisc/ccio-dma.c	2019-10-05 11:20:10.000000000 -0400
@@ -563,8 +563,6 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_
 	/* We currently only support kernel addresses */
 	BUG_ON(sid != KERNEL_SPACE);
 
-	mtsp(sid,1);
-
 	/*
 	** WORD 1 - low order word
 	** "hints" parm includes the VALID bit!
@@ -595,7 +593,7 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_
 	** Grab virtual index [0:11]
 	** Deposit virt_idx bits into I/O PDIR word
 	*/
-	asm volatile ("lci %%r0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
+	asm volatile ("lci %%r0(%1), %0" : "=r" (ci) : "r" (vba));
 	asm volatile ("extru %1,19,12,%0" : "+r" (ci) : "r" (ci));
 	asm volatile ("depw  %1,15,12,%0" : "+r" (pa) : "r" (ci));
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/parisc/sba_iommu.c linux-libre-3.16.75-gnu/drivers/parisc/sba_iommu.c
--- linux-libre-3.16.74-gnu/drivers/parisc/sba_iommu.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/parisc/sba_iommu.c	2019-10-05 11:20:10.000000000 -0400
@@ -573,8 +573,7 @@ sba_io_pdir_entry(u64 *pdir_ptr, space_t
 	pa = virt_to_phys(vba);
 	pa &= IOVP_MASK;
 
-	mtsp(sid,1);
-	asm("lci 0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
+	asm("lci 0(%1), %0" : "=r" (ci) : "r" (vba));
 	pa |= (ci >> PAGE_SHIFT) & 0xff;  /* move CI (8 bits) into lowest byte */
 
 	pa |= SBA_PDIR_VALID_BIT;	/* set "valid" bit */
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/s390/net/qeth_l2_main.c linux-libre-3.16.75-gnu/drivers/s390/net/qeth_l2_main.c
--- linux-libre-3.16.74-gnu/drivers/s390/net/qeth_l2_main.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/s390/net/qeth_l2_main.c	2019-10-05 11:20:10.000000000 -0400
@@ -1956,7 +1956,7 @@ static void qeth_bridgeport_an_set_cb(vo
 
 	l2entry = (struct qdio_brinfo_entry_l2 *)entry;
 	code = IPA_ADDR_CHANGE_CODE_MACADDR;
-	if (l2entry->addr_lnid.lnid)
+	if (l2entry->addr_lnid.lnid < VLAN_N_VID)
 		code |= IPA_ADDR_CHANGE_CODE_VLANID;
 	qeth_bridge_emit_host_event(card, anev_reg_unreg, code,
 		(struct net_if_token *)&l2entry->nit,
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_ext.h linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_ext.h
--- linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_ext.h	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_ext.h	2019-10-05 11:20:10.000000000 -0400
@@ -160,6 +160,7 @@ extern const struct attribute_group *zfc
 extern struct mutex zfcp_sysfs_port_units_mutex;
 extern struct device_attribute *zfcp_sysfs_sdev_attrs[];
 extern struct device_attribute *zfcp_sysfs_shost_attrs[];
+bool zfcp_sysfs_port_is_removing(const struct zfcp_port *const port);
 
 /* zfcp_unit.c */
 extern int zfcp_unit_add(struct zfcp_port *, u64);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_scsi.c linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_scsi.c
--- linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_scsi.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_scsi.c	2019-10-05 11:20:10.000000000 -0400
@@ -145,6 +145,15 @@ static int zfcp_scsi_slave_alloc(struct
 
 	zfcp_sdev->erp_action.port = port;
 
+	mutex_lock(&zfcp_sysfs_port_units_mutex);
+	if (zfcp_sysfs_port_is_removing(port)) {
+		/* port is already gone */
+		mutex_unlock(&zfcp_sysfs_port_units_mutex);
+		put_device(&port->dev); /* undo zfcp_get_port_by_wwpn() */
+		return -ENXIO;
+	}
+	mutex_unlock(&zfcp_sysfs_port_units_mutex);
+
 	unit = zfcp_unit_find(port, zfcp_scsi_dev_lun(sdev));
 	if (unit)
 		put_device(&unit->dev);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_sysfs.c linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_sysfs.c
--- linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_sysfs.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_sysfs.c	2019-10-05 11:20:10.000000000 -0400
@@ -235,6 +235,53 @@ static ZFCP_DEV_ATTR(adapter, port_resca
 
 DEFINE_MUTEX(zfcp_sysfs_port_units_mutex);
 
+static void zfcp_sysfs_port_set_removing(struct zfcp_port *const port)
+{
+	lockdep_assert_held(&zfcp_sysfs_port_units_mutex);
+	atomic_set(&port->units, -1);
+}
+
+bool zfcp_sysfs_port_is_removing(const struct zfcp_port *const port)
+{
+	lockdep_assert_held(&zfcp_sysfs_port_units_mutex);
+	return atomic_read(&port->units) == -1;
+}
+
+static bool zfcp_sysfs_port_in_use(struct zfcp_port *const port)
+{
+	struct zfcp_adapter *const adapter = port->adapter;
+	unsigned long flags;
+	struct scsi_device *sdev;
+	bool in_use = true;
+
+	mutex_lock(&zfcp_sysfs_port_units_mutex);
+	if (atomic_read(&port->units) > 0)
+		goto unlock_port_units_mutex; /* zfcp_unit(s) under port */
+
+	spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
+	__shost_for_each_device(sdev, adapter->scsi_host) {
+		const struct zfcp_scsi_dev *zsdev = sdev_to_zfcp(sdev);
+
+		if (sdev->sdev_state == SDEV_DEL ||
+		    sdev->sdev_state == SDEV_CANCEL)
+			continue;
+		if (zsdev->port != port)
+			continue;
+		/* alive scsi_device under port of interest */
+		goto unlock_host_lock;
+	}
+
+	/* port is about to be removed, so no more unit_add or slave_alloc */
+	zfcp_sysfs_port_set_removing(port);
+	in_use = false;
+
+unlock_host_lock:
+	spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
+unlock_port_units_mutex:
+	mutex_unlock(&zfcp_sysfs_port_units_mutex);
+	return in_use;
+}
+
 static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
 					    struct device_attribute *attr,
 					    const char *buf, size_t count)
@@ -257,15 +304,11 @@ static ssize_t zfcp_sysfs_port_remove_st
 	else
 		retval = 0;
 
-	mutex_lock(&zfcp_sysfs_port_units_mutex);
-	if (atomic_read(&port->units) > 0) {
+	if (zfcp_sysfs_port_in_use(port)) {
 		retval = -EBUSY;
-		mutex_unlock(&zfcp_sysfs_port_units_mutex);
+		put_device(&port->dev); /* undo zfcp_get_port_by_wwpn() */
 		goto out;
 	}
-	/* port is about to be removed, so no more unit_add */
-	atomic_set(&port->units, -1);
-	mutex_unlock(&zfcp_sysfs_port_units_mutex);
 
 	write_lock_irq(&adapter->port_list_lock);
 	list_del(&port->list);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_unit.c linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_unit.c
--- linux-libre-3.16.74-gnu/drivers/s390/scsi/zfcp_unit.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/s390/scsi/zfcp_unit.c	2019-10-05 11:20:10.000000000 -0400
@@ -122,7 +122,7 @@ int zfcp_unit_add(struct zfcp_port *port
 	int retval = 0;
 
 	mutex_lock(&zfcp_sysfs_port_units_mutex);
-	if (atomic_read(&port->units) == -1) {
+	if (zfcp_sysfs_port_is_removing(port)) {
 		/* port is already gone */
 		retval = -ENODEV;
 		goto out;
@@ -166,8 +166,14 @@ int zfcp_unit_add(struct zfcp_port *port
 	write_lock_irq(&port->unit_list_lock);
 	list_add_tail(&unit->list, &port->unit_list);
 	write_unlock_irq(&port->unit_list_lock);
+	/*
+	 * lock order: shost->scan_mutex before zfcp_sysfs_port_units_mutex
+	 * due to      zfcp_unit_scsi_scan() => zfcp_scsi_slave_alloc()
+	 */
+	mutex_unlock(&zfcp_sysfs_port_units_mutex);
 
 	zfcp_unit_scsi_scan(unit);
+	return retval;
 
 out:
 	mutex_unlock(&zfcp_sysfs_port_units_mutex);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/scsi/bnx2fc/bnx2fc_hwi.c linux-libre-3.16.75-gnu/drivers/scsi/bnx2fc/bnx2fc_hwi.c
--- linux-libre-3.16.74-gnu/drivers/scsi/bnx2fc/bnx2fc_hwi.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/scsi/bnx2fc/bnx2fc_hwi.c	2019-10-05 11:20:10.000000000 -0400
@@ -828,7 +828,7 @@ ret_err_rqe:
 			((u64)err_entry->data.err_warn_bitmap_hi << 32) |
 			(u64)err_entry->data.err_warn_bitmap_lo;
 		for (i = 0; i < BNX2FC_NUM_ERR_BITS; i++) {
-			if (err_warn_bit_map & (u64) (1 << i)) {
+			if (err_warn_bit_map & ((u64)1 << i)) {
 				err_warn = i;
 				break;
 			}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/scsi/ufs/ufshcd-pltfrm.c linux-libre-3.16.75-gnu/drivers/scsi/ufs/ufshcd-pltfrm.c
--- linux-libre-3.16.74-gnu/drivers/scsi/ufs/ufshcd-pltfrm.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/scsi/ufs/ufshcd-pltfrm.c	2019-10-05 11:20:10.000000000 -0400
@@ -150,22 +150,19 @@ static int ufshcd_pltfrm_probe(struct pl
 		goto out;
 	}
 
-	pm_runtime_set_active(&pdev->dev);
-	pm_runtime_enable(&pdev->dev);
-
 	err = ufshcd_init(dev, &hba, mmio_base, irq);
 	if (err) {
 		dev_err(dev, "Intialization failed\n");
-		goto out_disable_rpm;
+		goto out;
 	}
 
 	platform_set_drvdata(pdev, hba);
 
+	pm_runtime_set_active(&pdev->dev);
+	pm_runtime_enable(&pdev->dev);
+
 	return 0;
 
-out_disable_rpm:
-	pm_runtime_disable(&pdev->dev);
-	pm_runtime_set_suspended(&pdev->dev);
 out:
 	return err;
 }
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/scsi/vmw_pvscsi.c linux-libre-3.16.75-gnu/drivers/scsi/vmw_pvscsi.c
--- linux-libre-3.16.74-gnu/drivers/scsi/vmw_pvscsi.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/scsi/vmw_pvscsi.c	2019-10-05 11:20:10.000000000 -0400
@@ -754,6 +754,7 @@ static int pvscsi_queue_lck(struct scsi_
 	struct pvscsi_adapter *adapter = shost_priv(host);
 	struct pvscsi_ctx *ctx;
 	unsigned long flags;
+	unsigned char op;
 
 	spin_lock_irqsave(&adapter->hw_lock, flags);
 
@@ -766,13 +767,14 @@ static int pvscsi_queue_lck(struct scsi_
 	}
 
 	cmd->scsi_done = done;
+	op = cmd->cmnd[0];
 
 	dev_dbg(&cmd->device->sdev_gendev,
-		"queued cmd %p, ctx %p, op=%x\n", cmd, ctx, cmd->cmnd[0]);
+		"queued cmd %p, ctx %p, op=%x\n", cmd, ctx, op);
 
 	spin_unlock_irqrestore(&adapter->hw_lock, flags);
 
-	pvscsi_kick_io(adapter, cmd->cmnd[0]);
+	pvscsi_kick_io(adapter, op);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/spi/spi-bitbang.c linux-libre-3.16.75-gnu/drivers/spi/spi-bitbang.c
--- linux-libre-3.16.74-gnu/drivers/spi/spi-bitbang.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/spi/spi-bitbang.c	2019-10-05 11:20:10.000000000 -0400
@@ -462,7 +462,7 @@ int spi_bitbang_start(struct spi_bitbang
 	if (ret)
 		spi_master_put(master);
 
-	return 0;
+	return ret;
 }
 EXPORT_SYMBOL_GPL(spi_bitbang_start);
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/staging/usbip/stub_dev.c linux-libre-3.16.75-gnu/drivers/staging/usbip/stub_dev.c
--- linux-libre-3.16.74-gnu/drivers/staging/usbip/stub_dev.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/staging/usbip/stub_dev.c	2019-10-05 11:20:10.000000000 -0400
@@ -342,9 +342,17 @@ static int stub_probe(struct usb_device
 	const char *udev_busid = dev_name(&udev->dev);
 	struct bus_id_priv *busid_priv;
 	int rc = 0;
+	char save_status;
 
 	dev_dbg(&udev->dev, "Enter probe\n");
 
+	/* Not sure if this is our device. Allocate here to avoid
+	 * calling alloc while holding busid_table lock.
+	 */
+	sdev = stub_device_alloc(udev);
+	if (!sdev)
+		return -ENOMEM;
+
 	/* check we should claim or not by busid_table */
 	busid_priv = get_busid_priv(udev_busid);
 	if (!busid_priv || (busid_priv->status == STUB_BUSID_REMOV) ||
@@ -359,6 +367,9 @@ static int stub_probe(struct usb_device
 		 * See driver_probe_device() in driver/base/dd.c
 		 */
 		rc = -ENODEV;
+		if (!busid_priv)
+			goto sdev_free;
+
 		goto call_put_busid_priv;
 	}
 
@@ -378,12 +389,6 @@ static int stub_probe(struct usb_device
 		goto call_put_busid_priv;
 	}
 
-	/* ok, this is my device */
-	sdev = stub_device_alloc(udev);
-	if (!sdev) {
-		rc = -ENOMEM;
-		goto call_put_busid_priv;
-	}
 
 	dev_info(&udev->dev,
 		"usbip-host: register new device (bus %u dev %u)\n",
@@ -393,9 +398,16 @@ static int stub_probe(struct usb_device
 
 	/* set private data to usb_device */
 	dev_set_drvdata(&udev->dev, sdev);
+
 	busid_priv->sdev = sdev;
 	busid_priv->udev = udev;
 
+	save_status = busid_priv->status;
+	busid_priv->status = STUB_BUSID_ALLOC;
+
+	/* release the busid_lock */
+	put_busid_priv(busid_priv);
+
 	/*
 	 * Claim this hub port.
 	 * It doesn't matter what value we pass as owner
@@ -413,10 +425,8 @@ static int stub_probe(struct usb_device
 		dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid);
 		goto err_files;
 	}
-	busid_priv->status = STUB_BUSID_ALLOC;
 
-	rc = 0;
-	goto call_put_busid_priv;
+	return 0;
 
 err_files:
 	usb_hub_release_port(udev->parent, udev->portnum,
@@ -426,23 +436,30 @@ err_port:
 	usb_put_dev(udev);
 	kthread_stop_put(sdev->ud.eh);
 
+	/* we already have busid_priv, just lock busid_lock */
+	spin_lock(&busid_priv->busid_lock);
 	busid_priv->sdev = NULL;
-	stub_device_free(sdev);
+	busid_priv->status = save_status;
+	spin_unlock(&busid_priv->busid_lock);
+	/* lock is released - go to free */
+	goto sdev_free;
 
 call_put_busid_priv:
+	/* release the busid_lock */
 	put_busid_priv(busid_priv);
+
+sdev_free:
+	stub_device_free(sdev);
+
 	return rc;
 }
 
 static void shutdown_busid(struct bus_id_priv *busid_priv)
 {
-	if (busid_priv->sdev && !busid_priv->shutdown_busid) {
-		busid_priv->shutdown_busid = 1;
-		usbip_event_add(&busid_priv->sdev->ud, SDEV_EVENT_REMOVED);
+	usbip_event_add(&busid_priv->sdev->ud, SDEV_EVENT_REMOVED);
 
-		/* wait for the stop of the event handler */
-		usbip_stop_eh(&busid_priv->sdev->ud);
-	}
+	/* wait for the stop of the event handler */
+	usbip_stop_eh(&busid_priv->sdev->ud);
 }
 
 /*
@@ -469,11 +486,16 @@ static void stub_disconnect(struct usb_d
 	/* get stub_device */
 	if (!sdev) {
 		dev_err(&udev->dev, "could not get device");
-		goto call_put_busid_priv;
+		/* release busid_lock */
+		put_busid_priv(busid_priv);
+		return;
 	}
 
 	dev_set_drvdata(&udev->dev, NULL);
 
+	/* release busid_lock before call to remove device files */
+	put_busid_priv(busid_priv);
+
 	/*
 	 * NOTE: rx/tx threads are invoked for each usb_device.
 	 */
@@ -484,27 +506,36 @@ static void stub_disconnect(struct usb_d
 				  (struct usb_dev_state *) udev);
 	if (rc) {
 		dev_dbg(&udev->dev, "unable to release port\n");
-		goto call_put_busid_priv;
+		return;
 	}
 
 	/* If usb reset is called from event handler */
 	if (busid_priv->sdev->ud.eh == current)
-		goto call_put_busid_priv;
+		return;
+
+	/* we already have busid_priv, just lock busid_lock */
+	spin_lock(&busid_priv->busid_lock);
+	if (!busid_priv->shutdown_busid)
+		busid_priv->shutdown_busid = 1;
+	/* release busid_lock */
+	spin_unlock(&busid_priv->busid_lock);
 
 	/* shutdown the current connection */
 	shutdown_busid(busid_priv);
 
 	usb_put_dev(sdev->udev);
 
+	/* we already have busid_priv, just lock busid_lock */
+	spin_lock(&busid_priv->busid_lock);
 	/* free sdev */
 	busid_priv->sdev = NULL;
 	stub_device_free(sdev);
 
 	if (busid_priv->status == STUB_BUSID_ALLOC)
 		busid_priv->status = STUB_BUSID_ADDED;
-
-call_put_busid_priv:
-	put_busid_priv(busid_priv);
+	/* release busid_lock */
+	spin_unlock(&busid_priv->busid_lock);
+	return;
 }
 
 #ifdef CONFIG_PM
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/target/target_core_iblock.c linux-libre-3.16.75-gnu/drivers/target/target_core_iblock.c
--- linux-libre-3.16.74-gnu/drivers/target/target_core_iblock.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/target/target_core_iblock.c	2019-10-05 11:20:10.000000000 -0400
@@ -490,7 +490,7 @@ iblock_execute_write_same(struct se_cmd
 
 		/* Always in 512 byte units for Linux/Block */
 		block_lba += sg->length >> IBLOCK_LBA_SHIFT;
-		sectors -= 1;
+		sectors -= sg->length >> IBLOCK_LBA_SHIFT;
 	}
 
 	iblock_submit_bios(&list, WRITE);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/tty/serial/max310x.c linux-libre-3.16.75-gnu/drivers/tty/serial/max310x.c
--- linux-libre-3.16.74-gnu/drivers/tty/serial/max310x.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/tty/serial/max310x.c	2019-10-05 11:20:10.000000000 -0400
@@ -568,7 +568,7 @@ static int max310x_set_ref_clk(struct ma
 	}
 
 	/* Configure clock source */
-	clksrc = xtal ? MAX310X_CLKSRC_CRYST_BIT : MAX310X_CLKSRC_EXTCLK_BIT;
+	clksrc = MAX310X_CLKSRC_EXTCLK_BIT | (xtal ? MAX310X_CLKSRC_CRYST_BIT : 0);
 
 	/* Configure PLL */
 	if (pllcfg) {
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/tty/serial/sh-sci.c linux-libre-3.16.75-gnu/drivers/tty/serial/sh-sci.c
--- linux-libre-3.16.74-gnu/drivers/tty/serial/sh-sci.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/tty/serial/sh-sci.c	2019-10-05 11:20:10.000000000 -0400
@@ -1600,6 +1600,13 @@ static void sci_request_dma(struct uart_
 
 	dev_dbg(port->dev, "%s: port %d\n", __func__, port->line);
 
+	/*
+	 * DMA on console may interfere with Kernel log messages which use
+	 * plain putchar(). So, simply don't use it with a console.
+	 */
+	if (uart_console(port))
+		return;
+
 	if (s->cfg->dma_slave_tx <= 0 || s->cfg->dma_slave_rx <= 0)
 		return;
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/usb/core/config.c linux-libre-3.16.75-gnu/drivers/usb/core/config.c
--- linux-libre-3.16.74-gnu/drivers/usb/core/config.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/usb/core/config.c	2019-10-05 11:20:10.000000000 -0400
@@ -897,8 +897,8 @@ int usb_get_bos_descriptor(struct usb_de
 
 	/* Get BOS descriptor */
 	ret = usb_get_descriptor(dev, USB_DT_BOS, 0, bos, USB_DT_BOS_SIZE);
-	if (ret < USB_DT_BOS_SIZE) {
-		dev_err(ddev, "unable to get BOS descriptor\n");
+	if (ret < USB_DT_BOS_SIZE || bos->bLength < USB_DT_BOS_SIZE) {
+		dev_err(ddev, "unable to get BOS descriptor or descriptor too short\n");
 		if (ret >= 0)
 			ret = -ENOMSG;
 		kfree(bos);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/usb/core/quirks.c linux-libre-3.16.75-gnu/drivers/usb/core/quirks.c
--- linux-libre-3.16.74-gnu/drivers/usb/core/quirks.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/usb/core/quirks.c	2019-10-05 11:20:10.000000000 -0400
@@ -64,9 +64,15 @@ static const struct usb_device_id usb_qu
 	/* Microsoft LifeCam-VX700 v2.0 */
 	{ USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME },
 
+	/* Microsoft Surface Dock Ethernet (RTL8153 GigE) */
+	{ USB_DEVICE(0x045e, 0x07c6), .driver_info = USB_QUIRK_NO_LPM },
+
 	/* Cherry Stream G230 2.0 (G85-231) and 3.0 (G85-232) */
 	{ USB_DEVICE(0x046a, 0x0023), .driver_info = USB_QUIRK_RESET_RESUME },
 
+	/* Logitech HD Webcam C270 */
+	{ USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
+
 	/* Logitech HD Pro Webcams C920, C920-C, C925e and C930e */
 	{ USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT },
 	{ USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT },
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/usb/host/xhci.c linux-libre-3.16.75-gnu/drivers/usb/host/xhci.c
--- linux-libre-3.16.74-gnu/drivers/usb/host/xhci.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/usb/host/xhci.c	2019-10-05 11:20:10.000000000 -0400
@@ -4178,7 +4178,6 @@ int xhci_set_usb2_hardware_lpm(struct us
 	pm_addr = port_array[port_num] + PORTPMSC;
 	pm_val = readl(pm_addr);
 	hlpm_addr = port_array[port_num] + PORTHLPMC;
-	field = le32_to_cpu(udev->bos->ext_cap->bmAttributes);
 
 	xhci_dbg(xhci, "%s port %d USB2 hardware LPM\n",
 			enable ? "enable" : "disable", port_num + 1);
@@ -4190,6 +4189,7 @@ int xhci_set_usb2_hardware_lpm(struct us
 			 * default one which works with mixed HIRD and BESL
 			 * systems. See XHCI_DEFAULT_BESL definition in xhci.h
 			 */
+			field = le32_to_cpu(udev->bos->ext_cap->bmAttributes);
 			if ((field & USB_BESL_SUPPORT) &&
 			    (field & USB_BESL_BASELINE_VALID))
 				hird = USB_GET_BESL_BASELINE(field);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/usb/misc/rio500.c linux-libre-3.16.75-gnu/drivers/usb/misc/rio500.c
--- linux-libre-3.16.74-gnu/drivers/usb/misc/rio500.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/usb/misc/rio500.c	2019-10-05 11:20:10.000000000 -0400
@@ -103,9 +103,22 @@ static int close_rio(struct inode *inode
 {
 	struct rio_usb_data *rio = &rio_instance;
 
-	rio->isopen = 0;
+	/* against disconnect() */
+	mutex_lock(&rio500_mutex);
+	mutex_lock(&(rio->lock));
 
-	dev_info(&rio->rio_dev->dev, "Rio closed.\n");
+	rio->isopen = 0;
+	if (!rio->present) {
+		/* cleanup has been delayed */
+		kfree(rio->ibuf);
+		kfree(rio->obuf);
+		rio->ibuf = NULL;
+		rio->obuf = NULL;
+	} else {
+		dev_info(&rio->rio_dev->dev, "Rio closed.\n");
+	}
+	mutex_unlock(&(rio->lock));
+	mutex_unlock(&rio500_mutex);
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/usb/serial/pl2303.c linux-libre-3.16.75-gnu/drivers/usb/serial/pl2303.c
--- linux-libre-3.16.74-gnu/drivers/usb/serial/pl2303.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/usb/serial/pl2303.c	2019-10-05 11:20:10.000000000 -0400
@@ -100,6 +100,7 @@ static const struct usb_device_id id_tab
 	{ USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
 	{ USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
 	{ USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
+	{ USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) },
 	{ }					/* Terminating entry */
 };
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/usb/serial/pl2303.h linux-libre-3.16.75-gnu/drivers/usb/serial/pl2303.h
--- linux-libre-3.16.74-gnu/drivers/usb/serial/pl2303.h	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/usb/serial/pl2303.h	2019-10-05 11:20:10.000000000 -0400
@@ -158,3 +158,6 @@
 #define SMART_VENDOR_ID	0x0b8c
 #define SMART_PRODUCT_ID	0x2303
 
+/* Allied Telesis VT-Kit3 */
+#define AT_VENDOR_ID		0x0caa
+#define AT_VTKIT3_PRODUCT_ID	0x3001
diff -druNp --no-dereference linux-libre-3.16.74-gnu/drivers/usb/storage/unusual_realtek.h linux-libre-3.16.75-gnu/drivers/usb/storage/unusual_realtek.h
--- linux-libre-3.16.74-gnu/drivers/usb/storage/unusual_realtek.h	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/drivers/usb/storage/unusual_realtek.h	2019-10-05 11:20:10.000000000 -0400
@@ -28,6 +28,11 @@ UNUSUAL_DEV(0x0bda, 0x0138, 0x0000, 0x99
 		"USB Card Reader",
 		USB_SC_DEVICE, USB_PR_DEVICE, init_realtek_cr, 0),
 
+UNUSUAL_DEV(0x0bda, 0x0153, 0x0000, 0x9999,
+		"Realtek",
+		"USB Card Reader",
+		USB_SC_DEVICE, USB_PR_DEVICE, init_realtek_cr, 0),
+
 UNUSUAL_DEV(0x0bda, 0x0158, 0x0000, 0x9999,
 		"Realtek",
 		"USB Card Reader",
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/btrfs/file.c linux-libre-3.16.75-gnu/fs/btrfs/file.c
--- linux-libre-3.16.74-gnu/fs/btrfs/file.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/btrfs/file.c	2019-10-05 11:20:10.000000000 -0400
@@ -1889,6 +1889,18 @@ int btrfs_sync_file(struct file *file, l
 	u64 len;
 
 	/*
+	 * If the inode needs a full sync, make sure we use a full range to
+	 * avoid log tree corruption, due to hole detection racing with ordered
+	 * extent completion for adjacent ranges, and assertion failures during
+	 * hole detection.
+	 */
+	if (test_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
+		     &BTRFS_I(inode)->runtime_flags)) {
+		start = 0;
+		end = LLONG_MAX;
+	}
+
+	/*
 	 * The range length can be represented by u64, we have to do the typecasts
 	 * to avoid signed overflow if it's [0, LLONG_MAX] eg. from fsync()
 	 */
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/btrfs/reada.c linux-libre-3.16.75-gnu/fs/btrfs/reada.c
--- linux-libre-3.16.74-gnu/fs/btrfs/reada.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/btrfs/reada.c	2019-10-05 11:20:10.000000000 -0400
@@ -764,16 +764,23 @@ static void __reada_start_machine(struct
 	u64 total = 0;
 	int i;
 
+again:
 	do {
 		enqueued = 0;
+		mutex_lock(&fs_devices->device_list_mutex);
 		list_for_each_entry(device, &fs_devices->devices, dev_list) {
 			if (atomic_read(&device->reada_in_flight) <
 			    MAX_IN_FLIGHT)
 				enqueued += reada_start_machine_dev(fs_info,
 								    device);
 		}
+		mutex_unlock(&fs_devices->device_list_mutex);
 		total += enqueued;
 	} while (enqueued && total < 10000);
+	if (fs_devices->seed) {
+		fs_devices = fs_devices->seed;
+		goto again;
+	}
 
 	if (enqueued == 0)
 		return;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/cifs/cifsfs.c linux-libre-3.16.75-gnu/fs/cifs/cifsfs.c
--- linux-libre-3.16.74-gnu/fs/cifs/cifsfs.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/cifs/cifsfs.c	2019-10-05 11:20:10.000000000 -0400
@@ -260,6 +260,7 @@ cifs_alloc_inode(struct super_block *sb)
 	cifs_inode->uniqueid = 0;
 	cifs_inode->createtime = 0;
 	cifs_inode->epoch = 0;
+	spin_lock_init(&cifs_inode->open_file_lock);
 #ifdef CONFIG_CIFS_SMB2
 	generate_random_uuid(cifs_inode->lease_key);
 #endif
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/cifs/cifsglob.h linux-libre-3.16.75-gnu/fs/cifs/cifsglob.h
--- linux-libre-3.16.74-gnu/fs/cifs/cifsglob.h	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/cifs/cifsglob.h	2019-10-05 11:20:10.000000000 -0400
@@ -1116,6 +1116,7 @@ struct cifsInodeInfo {
 	struct rw_semaphore lock_sem;	/* protect the fields above */
 	/* BB add in lists for dirty pages i.e. write caching info for oplock */
 	struct list_head openFileList;
+	spinlock_t	open_file_lock;	/* protects openFileList */
 	__u32 cifsAttrs; /* e.g. DOS archive bit, sparse, compressed, system */
 	unsigned int oplock;		/* oplock/lease level we have */
 	unsigned int epoch;		/* used to track lease state changes */
@@ -1485,10 +1486,14 @@ require use of the stronger protocol */
  *  tcp_ses_lock protects:
  *	list operations on tcp and SMB session lists
  *  tcon->open_file_lock protects the list of open files hanging off the tcon
+ *  inode->open_file_lock protects the openFileList hanging off the inode
  *  cfile->file_info_lock protects counters and fields in cifs file struct
  *  f_owner.lock protects certain per file struct operations
  *  mapping->page_lock protects certain per page operations
  *
+ *  Note that the cifs_tcon.open_file_lock should be taken before
+ *  not after the cifsInodeInfo.open_file_lock
+ *
  *  Semaphores
  *  ----------
  *  sesSem     operations on smb session
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/cifs/file.c linux-libre-3.16.75-gnu/fs/cifs/file.c
--- linux-libre-3.16.74-gnu/fs/cifs/file.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/cifs/file.c	2019-10-05 11:20:10.000000000 -0400
@@ -337,10 +337,12 @@ cifs_new_fileinfo(struct cifs_fid *fid,
 	list_add(&cfile->tlist, &tcon->openFileList);
 
 	/* if readable file instance put first in list*/
+	spin_lock(&cinode->open_file_lock);
 	if (file->f_mode & FMODE_READ)
 		list_add(&cfile->flist, &cinode->openFileList);
 	else
 		list_add_tail(&cfile->flist, &cinode->openFileList);
+	spin_unlock(&cinode->open_file_lock);
 	spin_unlock(&tcon->open_file_lock);
 
 	if (fid->purge_cache)
@@ -412,7 +414,9 @@ void _cifsFileInfo_put(struct cifsFileIn
 	cifs_add_pending_open_locked(&fid, cifs_file->tlink, &open);
 
 	/* remove it from the lists */
+	spin_lock(&cifsi->open_file_lock);
 	list_del(&cifs_file->flist);
+	spin_unlock(&cifsi->open_file_lock);
 	list_del(&cifs_file->tlist);
 
 	if (list_empty(&cifsi->openFileList)) {
@@ -1850,10 +1854,10 @@ refind_writable:
 		if (!rc)
 			return inv_file;
 		else {
-			spin_lock(&tcon->open_file_lock);
+			spin_lock(&cifs_inode->open_file_lock);
 			list_move_tail(&inv_file->flist,
 					&cifs_inode->openFileList);
-			spin_unlock(&tcon->open_file_lock);
+			spin_unlock(&cifs_inode->open_file_lock);
 			cifsFileInfo_put(inv_file);
 			++refind;
 			inv_file = NULL;
@@ -2744,7 +2748,9 @@ cifs_read_allocate_pages(struct cifs_rea
 	}
 
 	if (rc) {
-		for (i = 0; i < nr_pages; i++) {
+		unsigned int nr_page_failed = i;
+
+		for (i = 0; i < nr_page_failed; i++) {
 			put_page(rdata->pages[i]);
 			rdata->pages[i] = NULL;
 		}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/cifs/smb2maperror.c linux-libre-3.16.75-gnu/fs/cifs/smb2maperror.c
--- linux-libre-3.16.74-gnu/fs/cifs/smb2maperror.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/cifs/smb2maperror.c	2019-10-05 11:20:10.000000000 -0400
@@ -455,7 +455,7 @@ static const struct status_to_posix_erro
 	{STATUS_FILE_INVALID, -EIO, "STATUS_FILE_INVALID"},
 	{STATUS_ALLOTTED_SPACE_EXCEEDED, -EIO,
 	"STATUS_ALLOTTED_SPACE_EXCEEDED"},
-	{STATUS_INSUFFICIENT_RESOURCES, -EREMOTEIO,
+	{STATUS_INSUFFICIENT_RESOURCES, -EAGAIN,
 				"STATUS_INSUFFICIENT_RESOURCES"},
 	{STATUS_DFS_EXIT_PATH_FOUND, -EIO, "STATUS_DFS_EXIT_PATH_FOUND"},
 	{STATUS_DEVICE_DATA_ERROR, -EIO, "STATUS_DEVICE_DATA_ERROR"},
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/configfs/dir.c linux-libre-3.16.75-gnu/fs/configfs/dir.c
--- linux-libre-3.16.74-gnu/fs/configfs/dir.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/configfs/dir.c	2019-10-05 11:20:10.000000000 -0400
@@ -58,15 +58,13 @@ static void configfs_d_iput(struct dentr
 	if (sd) {
 		/* Coordinate with configfs_readdir */
 		spin_lock(&configfs_dirent_lock);
-		/* Coordinate with configfs_attach_attr where will increase
-		 * sd->s_count and update sd->s_dentry to new allocated one.
-		 * Only set sd->dentry to null when this dentry is the only
-		 * sd owner.
-		 * If not do so, configfs_d_iput may run just after
-		 * configfs_attach_attr and set sd->s_dentry to null
-		 * even it's still in use.
+		/*
+		 * Set sd->s_dentry to null only when this dentry is the one
+		 * that is going to be killed.  Otherwise configfs_d_iput may
+		 * run just after configfs_attach_attr and set sd->s_dentry to
+		 * NULL even it's still in use.
 		 */
-		if (atomic_read(&sd->s_count) <= 2)
+		if (sd->s_dentry == dentry)
 			sd->s_dentry = NULL;
 
 		spin_unlock(&configfs_dirent_lock);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/fs/ocfs2/dcache.c linux-libre-3.16.75-gnu/fs/ocfs2/dcache.c
--- linux-libre-3.16.74-gnu/fs/ocfs2/dcache.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/fs/ocfs2/dcache.c	2019-10-05 11:20:10.000000000 -0400
@@ -310,6 +310,18 @@ int ocfs2_dentry_attach_lock(struct dent
 
 out_attach:
 	spin_lock(&dentry_attach_lock);
+	if (unlikely(dentry->d_fsdata && !alias)) {
+		/* d_fsdata is set by a racing thread which is doing
+		 * the same thing as this thread is doing. Leave the racing
+		 * thread going ahead and we return here.
+		 */
+		spin_unlock(&dentry_attach_lock);
+		iput(dl->dl_inode);
+		ocfs2_lock_res_free(&dl->dl_lockres);
+		kfree(dl);
+		return 0;
+	}
+
 	dentry->d_fsdata = dl;
 	dl->dl_count++;
 	spin_unlock(&dentry_attach_lock);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/include/linux/sched.h linux-libre-3.16.75-gnu/include/linux/sched.h
--- linux-libre-3.16.74-gnu/include/linux/sched.h	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/include/linux/sched.h	2019-10-05 11:20:10.000000000 -0400
@@ -2439,6 +2439,10 @@ static inline void mmdrop(struct mm_stru
  * followed by taking the mmap_sem for writing before modifying the
  * vmas or anything the coredump pretends not to change from under it.
  *
+ * It also has to be called when mmgrab() is used in the context of
+ * the process, but then the mm_count refcount is transferred outside
+ * the context of the process to run down_write() on that pinned mm.
+ *
  * NOTE: find_extend_vma() called from GUP context is the only place
  * that can modify the "mm" (notably the vm_start/end) under mmap_sem
  * for reading and outside the context of the process, so it is also
diff -druNp --no-dereference linux-libre-3.16.74-gnu/kernel/cpu.c linux-libre-3.16.75-gnu/kernel/cpu.c
--- linux-libre-3.16.74-gnu/kernel/cpu.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/kernel/cpu.c	2019-10-05 11:20:10.000000000 -0400
@@ -804,6 +804,9 @@ static int __init mitigations_parse_cmdl
 		cpu_mitigations = CPU_MITIGATIONS_OFF;
 	else if (!strcmp(arg, "auto"))
 		cpu_mitigations = CPU_MITIGATIONS_AUTO;
+	else
+		pr_crit("Unsupported mitigations=%s, system may still be vulnerable\n",
+			arg);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-3.16.74-gnu/kernel/cred.c linux-libre-3.16.75-gnu/kernel/cred.c
--- linux-libre-3.16.74-gnu/kernel/cred.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/kernel/cred.c	2019-10-05 11:20:10.000000000 -0400
@@ -439,6 +439,15 @@ int commit_creds(struct cred *new)
 		if (task->mm)
 			set_dumpable(task->mm, suid_dumpable);
 		task->pdeath_signal = 0;
+		/*
+		 * If a task drops privileges and becomes nondumpable,
+		 * the dumpability change must become visible before
+		 * the credential change; otherwise, a __ptrace_may_access()
+		 * racing with this change may be able to attach to a task it
+		 * shouldn't be able to attach to (as if the task had dropped
+		 * privileges without becoming nondumpable).
+		 * Pairs with a read barrier in __ptrace_may_access().
+		 */
 		smp_wmb();
 	}
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/kernel/events/core.c linux-libre-3.16.75-gnu/kernel/events/core.c
--- linux-libre-3.16.74-gnu/kernel/events/core.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/kernel/events/core.c	2019-10-05 11:20:10.000000000 -0400
@@ -3823,6 +3823,9 @@ static int perf_event_period(struct perf
 	if (perf_event_check_period(event, value))
 		return -EINVAL;
 
+	if (!event->attr.freq && (value & (1ULL << 63)))
+		return -EINVAL;
+
 	task = ctx->task;
 	pe.value = value;
 
@@ -4581,7 +4584,7 @@ static void perf_sample_regs_user(struct
 				  struct pt_regs *regs)
 {
 	if (!user_mode(regs)) {
-		if (current->mm)
+		if (!(current->flags & PF_KTHREAD))
 			regs = task_pt_regs(current);
 		else
 			regs = NULL;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/kernel/events/ring_buffer.c linux-libre-3.16.75-gnu/kernel/events/ring_buffer.c
--- linux-libre-3.16.74-gnu/kernel/events/ring_buffer.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/kernel/events/ring_buffer.c	2019-10-05 11:20:10.000000000 -0400
@@ -47,14 +47,30 @@ static void perf_output_put_handle(struc
 	unsigned long head;
 
 again:
+	/*
+	 * In order to avoid publishing a head value that goes backwards,
+	 * we must ensure the load of @rb->head happens after we've
+	 * incremented @rb->nest.
+	 *
+	 * Otherwise we can observe a @rb->head value before one published
+	 * by an IRQ/NMI happening between the load and the increment.
+	 */
+	barrier();
 	head = local_read(&rb->head);
 
 	/*
-	 * IRQ/NMI can happen here, which means we can miss a head update.
+	 * IRQ/NMI can happen here and advance @rb->head, causing our
+	 * load above to be stale.
 	 */
 
-	if (!local_dec_and_test(&rb->nest))
+	/*
+	 * If this isn't the outermost nesting, we don't have to update
+	 * @rb->user_page->data_head.
+	 */
+	if (local_read(&rb->nest) > 1) {
+		local_dec(&rb->nest);
 		goto out;
+	}
 
 	/*
 	 * Since the mmap() consumer (userspace) can run on a different CPU:
@@ -86,9 +102,18 @@ again:
 	rb->user_page->data_head = head;
 
 	/*
-	 * Now check if we missed an update -- rely on previous implied
-	 * compiler barriers to force a re-read.
+	 * We must publish the head before decrementing the nest count,
+	 * otherwise an IRQ/NMI can publish a more recent head value and our
+	 * write will (temporarily) publish a stale value.
 	 */
+	barrier();
+	local_set(&rb->nest, 0);
+
+	/*
+	 * Ensure we decrement @rb->nest before we validate the @rb->head.
+	 * Otherwise we cannot be sure we caught the 'last' nested update.
+	 */
+	barrier();
 	if (unlikely(head != local_read(&rb->head))) {
 		local_inc(&rb->nest);
 		goto again;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/kernel/ptrace.c linux-libre-3.16.75-gnu/kernel/ptrace.c
--- linux-libre-3.16.74-gnu/kernel/ptrace.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/kernel/ptrace.c	2019-10-05 11:20:10.000000000 -0400
@@ -324,6 +324,16 @@ static int __ptrace_may_access(struct ta
 	return -EPERM;
 ok:
 	rcu_read_unlock();
+	/*
+	 * If a task drops privileges and becomes nondumpable (through a syscall
+	 * like setresuid()) while we are trying to access it, we must ensure
+	 * that the dumpability is read after the credentials; otherwise,
+	 * we may be able to attach to a task that we shouldn't be able to
+	 * attach to (as if the task had dropped privileges without becoming
+	 * nondumpable).
+	 * Pairs with a write barrier in commit_creds().
+	 */
+	smp_rmb();
 	mm = task->mm;
 	if (mm &&
 	    ((get_dumpable(mm) != SUID_DUMP_USER) &&
@@ -711,6 +721,10 @@ static int ptrace_peek_siginfo(struct ta
 	if (arg.nr < 0)
 		return -EINVAL;
 
+	/* Ensure arg.off fits in an unsigned long */
+	if (arg.off > ULONG_MAX)
+		return 0;
+
 	if (arg.flags & PTRACE_PEEKSIGINFO_SHARED)
 		pending = &child->signal->shared_pending;
 	else
@@ -718,18 +732,20 @@ static int ptrace_peek_siginfo(struct ta
 
 	for (i = 0; i < arg.nr; ) {
 		siginfo_t info;
-		s32 off = arg.off + i;
+		unsigned long off = arg.off + i;
+		bool found = false;
 
 		spin_lock_irq(&child->sighand->siglock);
 		list_for_each_entry(q, &pending->list, list) {
 			if (!off--) {
+				found = true;
 				copy_siginfo(&info, &q->info);
 				break;
 			}
 		}
 		spin_unlock_irq(&child->sighand->siglock);
 
-		if (off >= 0) /* beyond the end of the list */
+		if (!found) /* beyond the end of the list */
 			break;
 
 #ifdef CONFIG_COMPAT
diff -druNp --no-dereference linux-libre-3.16.74-gnu/kernel/signal.c linux-libre-3.16.75-gnu/kernel/signal.c
--- linux-libre-3.16.74-gnu/kernel/signal.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/kernel/signal.c	2019-10-05 11:20:10.000000000 -0400
@@ -2277,6 +2277,8 @@ relock:
 	if (signal_group_exit(signal)) {
 		ksig->info.si_signo = signr = SIGKILL;
 		sigdelset(&current->pending.signal, SIGKILL);
+		trace_signal_deliver(SIGKILL, SEND_SIG_NOINFO,
+				&sighand->action[SIGKILL - 1]);
 		recalc_sigpending();
 		goto fatal;
 	}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/kernel/trace/trace.c linux-libre-3.16.75-gnu/kernel/trace/trace.c
--- linux-libre-3.16.74-gnu/kernel/trace/trace.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/kernel/trace/trace.c	2019-10-05 11:20:10.000000000 -0400
@@ -5102,11 +5102,13 @@ tracing_snapshot_write(struct file *filp
 			break;
 		}
 #endif
-		if (!tr->allocated_snapshot) {
+		if (tr->allocated_snapshot)
+			ret = resize_buffer_duplicate_size(&tr->max_buffer,
+					&tr->trace_buffer, iter->cpu_file);
+		else
 			ret = alloc_snapshot(tr);
-			if (ret < 0)
-				break;
-		}
+		if (ret < 0)
+			break;
 		local_irq_disable();
 		/* Now, we're going to swap */
 		if (iter->cpu_file == RING_BUFFER_ALL_CPUS)
diff -druNp --no-dereference linux-libre-3.16.74-gnu/lib/mpi/mpi-pow.c linux-libre-3.16.75-gnu/lib/mpi/mpi-pow.c
--- linux-libre-3.16.74-gnu/lib/mpi/mpi-pow.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/lib/mpi/mpi-pow.c	2019-10-05 11:20:10.000000000 -0400
@@ -36,6 +36,7 @@
 int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
 {
 	mpi_ptr_t mp_marker = NULL, bp_marker = NULL, ep_marker = NULL;
+	struct karatsuba_ctx karactx = {};
 	mpi_ptr_t xp_marker = NULL;
 	mpi_ptr_t tspace = NULL;
 	mpi_ptr_t rp, ep, mp, bp;
@@ -163,13 +164,11 @@ int mpi_powm(MPI res, MPI base, MPI exp,
 		int c;
 		mpi_limb_t e;
 		mpi_limb_t carry_limb;
-		struct karatsuba_ctx karactx;
 
 		xp = xp_marker = mpi_alloc_limb_space(2 * (msize + 1));
 		if (!xp)
 			goto enomem;
 
-		memset(&karactx, 0, sizeof karactx);
 		negative_result = (ep[0] & 1) && base->sign;
 
 		i = esize - 1;
@@ -293,8 +292,6 @@ int mpi_powm(MPI res, MPI base, MPI exp,
 		if (mod_shift_cnt)
 			mpihelp_rshift(rp, rp, rsize, mod_shift_cnt);
 		MPN_NORMALIZE(rp, rsize);
-
-		mpihelp_release_karatsuba_ctx(&karactx);
 	}
 
 	if (negative_result && rsize) {
@@ -311,6 +308,7 @@ int mpi_powm(MPI res, MPI base, MPI exp,
 leave:
 	rc = 0;
 enomem:
+	mpihelp_release_karatsuba_ctx(&karactx);
 	if (assign_rp)
 		mpi_assign_limb_space(res, rp, size);
 	if (mp_marker)
diff -druNp --no-dereference linux-libre-3.16.74-gnu/Makefile linux-libre-3.16.75-gnu/Makefile
--- linux-libre-3.16.74-gnu/Makefile	2019-09-24 13:40:32.000000000 -0400
+++ linux-libre-3.16.75-gnu/Makefile	2019-10-05 16:18:49.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 16
-SUBLEVEL = 74
+SUBLEVEL = 75
 EXTRAVERSION =-gnu
 NAME = Museum of Fishiegoodies
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/mm/huge_memory.c linux-libre-3.16.75-gnu/mm/huge_memory.c
--- linux-libre-3.16.74-gnu/mm/huge_memory.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/mm/huge_memory.c	2019-10-05 11:20:10.000000000 -0400
@@ -2428,6 +2428,8 @@ static void collapse_huge_page(struct mm
 	 * handled by the anon_vma lock + PG_lock.
 	 */
 	down_write(&mm->mmap_sem);
+	if (!mmget_still_valid(mm))
+		goto out;
 	if (unlikely(khugepaged_test_exit(mm)))
 		goto out;
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/can/af_can.c linux-libre-3.16.75-gnu/net/can/af_can.c
--- linux-libre-3.16.74-gnu/net/can/af_can.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/can/af_can.c	2019-10-05 11:20:10.000000000 -0400
@@ -114,6 +114,7 @@ EXPORT_SYMBOL(can_ioctl);
 static void can_sock_destruct(struct sock *sk)
 {
 	skb_queue_purge(&sk->sk_receive_queue);
+	skb_queue_purge(&sk->sk_error_queue);
 }
 
 static const struct can_proto *can_get_proto(int protocol)
@@ -899,6 +900,8 @@ static struct notifier_block can_netdev_
 
 static __init int can_init(void)
 {
+	int err;
+
 	/* check for correct padding to be able to use the structs similarly */
 	BUILD_BUG_ON(offsetof(struct can_frame, can_dlc) !=
 		     offsetof(struct canfd_frame, len) ||
@@ -924,12 +927,29 @@ static __init int can_init(void)
 	can_init_proc();
 
 	/* protocol register */
-	sock_register(&can_family_ops);
-	register_netdevice_notifier(&can_netdev_notifier);
+	err = sock_register(&can_family_ops);
+	if (err)
+		goto out_sock;
+	err = register_netdevice_notifier(&can_netdev_notifier);
+	if (err)
+		goto out_notifier;
+
 	dev_add_pack(&can_packet);
 	dev_add_pack(&canfd_packet);
 
 	return 0;
+
+out_notifier:
+	sock_unregister(PF_CAN);
+out_sock:
+	kmem_cache_destroy(rcv_cache);
+
+	if (stats_timer)
+		del_timer_sync(&can_stattimer);
+
+	can_remove_proc();
+
+	return err;
 }
 
 static __exit void can_exit(void)
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/core/dev.c linux-libre-3.16.75-gnu/net/core/dev.c
--- linux-libre-3.16.74-gnu/net/core/dev.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/core/dev.c	2019-10-05 11:20:10.000000000 -0400
@@ -4239,7 +4239,6 @@ static struct sk_buff *napi_frags_skb(st
 	skb_reset_mac_header(skb);
 	skb_gro_reset_offset(skb);
 
-	eth = skb_gro_header_fast(skb, 0);
 	if (unlikely(skb_gro_header_hard(skb, hlen))) {
 		eth = skb_gro_header_slow(skb, hlen, 0);
 		if (unlikely(!eth)) {
@@ -4247,6 +4246,7 @@ static struct sk_buff *napi_frags_skb(st
 			return NULL;
 		}
 	} else {
+		eth = (const struct ethhdr *)skb->data;
 		gro_pull_from_frag0(skb, hlen);
 		NAPI_GRO_CB(skb)->frag0 += hlen;
 		NAPI_GRO_CB(skb)->frag0_len -= hlen;
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/core/neighbour.c linux-libre-3.16.75-gnu/net/core/neighbour.c
--- linux-libre-3.16.74-gnu/net/core/neighbour.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/core/neighbour.c	2019-10-05 11:20:10.000000000 -0400
@@ -2649,6 +2649,7 @@ static void *neigh_get_idx_any(struct se
 }
 
 void *neigh_seq_start(struct seq_file *seq, loff_t *pos, struct neigh_table *tbl, unsigned int neigh_seq_flags)
+	__acquires(tbl->lock)
 	__acquires(rcu_bh)
 {
 	struct neigh_seq_state *state = seq->private;
@@ -2659,6 +2660,7 @@ void *neigh_seq_start(struct seq_file *s
 
 	rcu_read_lock_bh();
 	state->nht = rcu_dereference_bh(tbl->nht);
+	read_lock(&tbl->lock);
 
 	return *pos ? neigh_get_idx_any(seq, pos) : SEQ_START_TOKEN;
 }
@@ -2692,8 +2694,13 @@ out:
 EXPORT_SYMBOL(neigh_seq_next);
 
 void neigh_seq_stop(struct seq_file *seq, void *v)
+	__releases(tbl->lock)
 	__releases(rcu_bh)
 {
+	struct neigh_seq_state *state = seq->private;
+	struct neigh_table *tbl = state->tbl;
+
+	read_unlock(&tbl->lock);
 	rcu_read_unlock_bh();
 }
 EXPORT_SYMBOL(neigh_seq_stop);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/core/pktgen.c linux-libre-3.16.75-gnu/net/core/pktgen.c
--- linux-libre-3.16.74-gnu/net/core/pktgen.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/core/pktgen.c	2019-10-05 11:20:10.000000000 -0400
@@ -3055,7 +3055,13 @@ static int pktgen_wait_thread_run(struct
 
 		if_unlock(t);
 
+		/* note: 't' will still be around even after the unlock/lock
+		 * cycle because pktgen_thread threads are only cleared at
+		 * net exit
+		 */
+		mutex_unlock(&pktgen_thread_lock);
 		msleep_interruptible(100);
+		mutex_lock(&pktgen_thread_lock);
 
 		if (signal_pending(current))
 			goto signal;
@@ -3072,6 +3078,10 @@ static int pktgen_wait_all_threads_run(s
 	struct pktgen_thread *t;
 	int sig = 1;
 
+	/* prevent from racing with rmmod */
+	if (!try_module_get(THIS_MODULE))
+		return sig;
+
 	mutex_lock(&pktgen_thread_lock);
 
 	list_for_each_entry(t, &pn->pktgen_threads, th_list) {
@@ -3085,6 +3095,7 @@ static int pktgen_wait_all_threads_run(s
 			t->control |= (T_STOP);
 
 	mutex_unlock(&pktgen_thread_lock);
+	module_put(THIS_MODULE);
 	return sig;
 }
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/ipv4/igmp.c linux-libre-3.16.75-gnu/net/ipv4/igmp.c
--- linux-libre-3.16.74-gnu/net/ipv4/igmp.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/ipv4/igmp.c	2019-10-05 11:20:10.000000000 -0400
@@ -192,6 +192,17 @@ static void ip_ma_put(struct ip_mc_list
 	     pmc != NULL;					\
 	     pmc = rtnl_dereference(pmc->next_rcu))
 
+static void ip_sf_list_clear_all(struct ip_sf_list *psf)
+{
+	struct ip_sf_list *next;
+
+	while (psf) {
+		next = psf->sf_next;
+		kfree(psf);
+		psf = next;
+	}
+}
+
 #ifdef CONFIG_IP_MULTICAST
 
 /*
@@ -614,6 +625,13 @@ static void igmpv3_clear_zeros(struct ip
 	}
 }
 
+static void kfree_pmc(struct ip_mc_list *pmc)
+{
+	ip_sf_list_clear_all(pmc->sources);
+	ip_sf_list_clear_all(pmc->tomb);
+	kfree(pmc);
+}
+
 static void igmpv3_send_cr(struct in_device *in_dev)
 {
 	struct ip_mc_list *pmc, *pmc_prev, *pmc_next;
@@ -650,7 +668,7 @@ static void igmpv3_send_cr(struct in_dev
 			else
 				in_dev->mc_tomb = pmc_next;
 			in_dev_put(pmc->interface);
-			kfree(pmc);
+			kfree_pmc(pmc);
 		} else
 			pmc_prev = pmc;
 	}
@@ -1106,6 +1124,7 @@ static void igmpv3_add_delrec(struct in_
 	pmc = kzalloc(sizeof(*pmc), GFP_KERNEL);
 	if (!pmc)
 		return;
+	spin_lock_init(&pmc->lock);
 	spin_lock_bh(&im->lock);
 	pmc->interface = im->interface;
 	in_dev_hold(in_dev);
@@ -1160,12 +1179,16 @@ static void igmpv3_del_delrec(struct in_
 		im->crcount = in_dev->mr_qrv ?: IGMP_Unsolicited_Report_Count;
 		if (im->sfmode == MCAST_INCLUDE) {
 			im->tomb = pmc->tomb;
+			pmc->tomb = NULL;
+
 			im->sources = pmc->sources;
+			pmc->sources = NULL;
+
 			for (psf = im->sources; psf; psf = psf->sf_next)
 				psf->sf_crcount = im->crcount;
 		}
 		in_dev_put(pmc->interface);
-		kfree(pmc);
+		kfree_pmc(pmc);
 	}
 	spin_unlock_bh(&im->lock);
 }
@@ -1186,21 +1209,18 @@ static void igmpv3_clear_delrec(struct i
 		nextpmc = pmc->next;
 		ip_mc_clear_src(pmc);
 		in_dev_put(pmc->interface);
-		kfree(pmc);
+		kfree_pmc(pmc);
 	}
 	/* clear dead sources, too */
 	rcu_read_lock();
 	for_each_pmc_rcu(in_dev, pmc) {
-		struct ip_sf_list *psf, *psf_next;
+		struct ip_sf_list *psf;
 
 		spin_lock_bh(&pmc->lock);
 		psf = pmc->tomb;
 		pmc->tomb = NULL;
 		spin_unlock_bh(&pmc->lock);
-		for (; psf; psf = psf_next) {
-			psf_next = psf->sf_next;
-			kfree(psf);
-		}
+		ip_sf_list_clear_all(psf);
 	}
 	rcu_read_unlock();
 }
@@ -1880,21 +1900,20 @@ static int ip_mc_add_src(struct in_devic
 
 static void ip_mc_clear_src(struct ip_mc_list *pmc)
 {
-	struct ip_sf_list *psf, *nextpsf;
+	struct ip_sf_list *tomb, *sources;
 
-	for (psf = pmc->tomb; psf; psf = nextpsf) {
-		nextpsf = psf->sf_next;
-		kfree(psf);
-	}
+	spin_lock_bh(&pmc->lock);
+	tomb = pmc->tomb;
 	pmc->tomb = NULL;
-	for (psf = pmc->sources; psf; psf = nextpsf) {
-		nextpsf = psf->sf_next;
-		kfree(psf);
-	}
+	sources = pmc->sources;
 	pmc->sources = NULL;
 	pmc->sfmode = MCAST_EXCLUDE;
 	pmc->sfcount[MCAST_INCLUDE] = 0;
 	pmc->sfcount[MCAST_EXCLUDE] = 1;
+	spin_unlock_bh(&pmc->lock);
+
+	ip_sf_list_clear_all(tomb);
+	ip_sf_list_clear_all(sources);
 }
 
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/ipv6/ip6_flowlabel.c linux-libre-3.16.75-gnu/net/ipv6/ip6_flowlabel.c
--- linux-libre-3.16.74-gnu/net/ipv6/ip6_flowlabel.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/ipv6/ip6_flowlabel.c	2019-10-05 11:20:10.000000000 -0400
@@ -255,9 +255,9 @@ struct ip6_flowlabel * fl6_sock_lookup(s
 	rcu_read_lock_bh();
 	for_each_sk_fl_rcu(np, sfl) {
 		struct ip6_flowlabel *fl = sfl->fl;
-		if (fl->label == label) {
+
+		if (fl->label == label && atomic_inc_not_zero(&fl->users)) {
 			fl->lastuse = jiffies;
-			atomic_inc(&fl->users);
 			rcu_read_unlock_bh();
 			return fl;
 		}
@@ -619,7 +619,8 @@ int ipv6_flowlabel_opt(struct sock *sk,
 						goto done;
 					}
 					fl1 = sfl->fl;
-					atomic_inc(&fl1->users);
+					if (!atomic_inc_not_zero(&fl1->users))
+						fl1 = NULL;
 					break;
 				}
 			}
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/iucv/af_iucv.c linux-libre-3.16.75-gnu/net/iucv/af_iucv.c
--- linux-libre-3.16.74-gnu/net/iucv/af_iucv.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/iucv/af_iucv.c	2019-10-05 11:20:10.000000000 -0400
@@ -568,7 +568,6 @@ static struct sock *iucv_sock_alloc(stru
 
 	sk->sk_destruct = iucv_sock_destruct;
 	sk->sk_sndtimeo = IUCV_CONN_TIMEOUT;
-	sk->sk_allocation = GFP_DMA;
 
 	sock_reset_flag(sk, SOCK_ZAPPED);
 
@@ -762,6 +761,7 @@ vm_bind:
 		memcpy(iucv->src_user_id, iucv_userid, 8);
 		sk->sk_state = IUCV_BOUND;
 		iucv->transport = AF_IUCV_TRANS_IUCV;
+		sk->sk_allocation |= GFP_DMA;
 		if (!iucv->msglimit)
 			iucv->msglimit = IUCV_QUEUELEN_DEFAULT;
 		goto done_unlock;
@@ -786,6 +786,8 @@ static int iucv_sock_autobind(struct soc
 		return -EPROTO;
 
 	memcpy(iucv->src_user_id, iucv_userid, 8);
+	iucv->transport = AF_IUCV_TRANS_IUCV;
+	sk->sk_allocation |= GFP_DMA;
 
 	write_lock_bh(&iucv_sk_list.lock);
 	__iucv_auto_name(iucv);
@@ -1737,6 +1739,8 @@ static int iucv_callback_connreq(struct
 
 	niucv = iucv_sk(nsk);
 	iucv_sock_init(nsk, sk);
+	niucv->transport = AF_IUCV_TRANS_IUCV;
+	nsk->sk_allocation |= GFP_DMA;
 
 	/* Set the new iucv_sock */
 	memcpy(niucv->dst_name, ipuser + 8, 8);
@@ -2395,6 +2399,13 @@ out:
 	return err;
 }
 
+static void afiucv_iucv_exit(void)
+{
+	device_unregister(af_iucv_dev);
+	driver_unregister(&af_iucv_driver);
+	pr_iucv->iucv_unregister(&af_iucv_handler, 0);
+}
+
 static int __init afiucv_init(void)
 {
 	int err;
@@ -2428,11 +2439,18 @@ static int __init afiucv_init(void)
 		err = afiucv_iucv_init();
 		if (err)
 			goto out_sock;
-	} else
-		register_netdevice_notifier(&afiucv_netdev_notifier);
+	}
+
+	err = register_netdevice_notifier(&afiucv_netdev_notifier);
+	if (err)
+		goto out_notifier;
+
 	dev_add_pack(&iucv_packet_type);
 	return 0;
 
+out_notifier:
+	if (pr_iucv)
+		afiucv_iucv_exit();
 out_sock:
 	sock_unregister(PF_IUCV);
 out_proto:
@@ -2446,12 +2464,11 @@ out:
 static void __exit afiucv_exit(void)
 {
 	if (pr_iucv) {
-		device_unregister(af_iucv_dev);
-		driver_unregister(&af_iucv_driver);
-		pr_iucv->iucv_unregister(&af_iucv_handler, 0);
+		afiucv_iucv_exit();
 		symbol_put(iucv_if);
-	} else
-		unregister_netdevice_notifier(&afiucv_netdev_notifier);
+	}
+
+	unregister_netdevice_notifier(&afiucv_netdev_notifier);
 	dev_remove_pack(&iucv_packet_type);
 	sock_unregister(PF_IUCV);
 	proto_unregister(&iucv_proto);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/llc/llc_output.c linux-libre-3.16.75-gnu/net/llc/llc_output.c
--- linux-libre-3.16.74-gnu/net/llc/llc_output.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/llc/llc_output.c	2019-10-05 11:20:10.000000000 -0400
@@ -72,6 +72,8 @@ int llc_build_and_send_ui_pkt(struct llc
 	rc = llc_mac_hdr_init(skb, skb->dev->dev_addr, dmac);
 	if (likely(!rc))
 		rc = dev_queue_xmit(skb);
+	else
+		kfree_skb(skb);
 	return rc;
 }
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/rds/ib_rdma.c linux-libre-3.16.75-gnu/net/rds/ib_rdma.c
--- linux-libre-3.16.74-gnu/net/rds/ib_rdma.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/rds/ib_rdma.c	2019-10-05 11:20:10.000000000 -0400
@@ -663,12 +663,14 @@ static int rds_ib_flush_mr_pool(struct r
 		wait_clean_list_grace();
 
 		list_to_llist_nodes(pool, &unmap_list, &clean_nodes, &clean_tail);
-		if (ibmr_ret)
+		if (ibmr_ret) {
 			*ibmr_ret = llist_entry(clean_nodes, struct rds_ib_mr, llnode);
-
+			clean_nodes = clean_nodes->next;
+		}
 		/* more than one entry in llist nodes */
-		if (clean_nodes->next)
-			llist_add_batch(clean_nodes->next, clean_tail, &pool->clean_list);
+		if (clean_nodes)
+			llist_add_batch(clean_nodes, clean_tail,
+					&pool->clean_list);
 
 	}
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/sched/sch_netem.c linux-libre-3.16.75-gnu/net/sched/sch_netem.c
--- linux-libre-3.16.74-gnu/net/sched/sch_netem.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/sched/sch_netem.c	2019-10-05 11:20:10.000000000 -0400
@@ -440,8 +440,7 @@ static int netem_enqueue(struct sk_buff
 	struct netem_skb_cb *cb;
 	struct sk_buff *skb2;
 	struct sk_buff *segs = NULL;
-	unsigned int len = 0, last_len, prev_len = qdisc_pkt_len(skb);
-	int nb = 0;
+	unsigned int prev_len = qdisc_pkt_len(skb);
 	int count = 1;
 	int rc = NET_XMIT_SUCCESS;
 	int rc_drop = NET_XMIT_DROP;
@@ -495,6 +494,7 @@ static int netem_enqueue(struct sk_buff
 			segs = netem_segment(skb, sch);
 			if (!segs)
 				return rc_drop;
+			qdisc_skb_cb(segs)->pkt_len = segs->len;
 		} else {
 			segs = skb;
 		}
@@ -575,6 +575,11 @@ static int netem_enqueue(struct sk_buff
 
 finish_segs:
 	if (segs) {
+		unsigned int len, last_len;
+		int nb = 0;
+
+		len = skb->len;
+
 		while (segs) {
 			skb2 = segs->next;
 			segs->next = NULL;
@@ -590,9 +595,7 @@ finish_segs:
 			}
 			segs = skb2;
 		}
-		sch->q.qlen += nb;
-		if (nb > 1)
-			qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len);
+		qdisc_tree_reduce_backlog(sch, -nb, prev_len - len);
 	}
 	return NET_XMIT_SUCCESS;
 }
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/sctp/endpointola.c linux-libre-3.16.75-gnu/net/sctp/endpointola.c
--- linux-libre-3.16.74-gnu/net/sctp/endpointola.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/sctp/endpointola.c	2019-10-05 11:20:10.000000000 -0400
@@ -126,10 +126,6 @@ static struct sctp_endpoint *sctp_endpoi
 	/* Initialize the bind addr area */
 	sctp_bind_addr_init(&ep->base.bind_addr, 0);
 
-	/* Remember who we are attached to.  */
-	ep->base.sk = sk;
-	sock_hold(ep->base.sk);
-
 	/* Create the lists of associations.  */
 	INIT_LIST_HEAD(&ep->asocs);
 
@@ -165,6 +161,10 @@ static struct sctp_endpoint *sctp_endpoi
 	ep->auth_hmacs_list = auth_hmacs;
 	ep->auth_chunk_list = auth_chunks;
 
+	/* Remember who we are attached to.  */
+	ep->base.sk = sk;
+	sock_hold(ep->base.sk);
+
 	return ep;
 
 nomem_hmacs:
diff -druNp --no-dereference linux-libre-3.16.74-gnu/net/wireless/core.c linux-libre-3.16.75-gnu/net/wireless/core.c
--- linux-libre-3.16.74-gnu/net/wireless/core.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/net/wireless/core.c	2019-10-05 11:20:10.000000000 -0400
@@ -386,7 +386,7 @@ struct wiphy *wiphy_new(const struct cfg
 				   &rdev->rfkill_ops, rdev);
 
 	if (!rdev->rfkill) {
-		kfree(rdev);
+		wiphy_free(&rdev->wiphy);
 		return NULL;
 	}
 
diff -druNp --no-dereference linux-libre-3.16.74-gnu/security/apparmor/policy_unpack.c linux-libre-3.16.75-gnu/security/apparmor/policy_unpack.c
--- linux-libre-3.16.74-gnu/security/apparmor/policy_unpack.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/security/apparmor/policy_unpack.c	2019-10-05 11:20:10.000000000 -0400
@@ -177,7 +177,7 @@ static bool unpack_nameX(struct aa_ext *
 		char *tag = NULL;
 		size_t size = unpack_u16_chunk(e, &tag);
 		/* if a name is specified it must match. otherwise skip tag */
-		if (name && (!size || strcmp(name, tag)))
+		if (name && (!size || tag[size-1] != '\0' || strcmp(name, tag)))
 			goto fail;
 	} else if (name) {
 		/* if a name is specified and there is no name tag fail */
diff -druNp --no-dereference linux-libre-3.16.74-gnu/sound/core/seq/oss/seq_oss_ioctl.c linux-libre-3.16.75-gnu/sound/core/seq/oss/seq_oss_ioctl.c
--- linux-libre-3.16.74-gnu/sound/core/seq/oss/seq_oss_ioctl.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/sound/core/seq/oss/seq_oss_ioctl.c	2019-10-05 11:20:10.000000000 -0400
@@ -62,7 +62,7 @@ static int snd_seq_oss_oob_user(struct s
 	if (copy_from_user(ev, arg, 8))
 		return -EFAULT;
 	memset(&tmpev, 0, sizeof(tmpev));
-	snd_seq_oss_fill_addr(dp, &tmpev, dp->addr.port, dp->addr.client);
+	snd_seq_oss_fill_addr(dp, &tmpev, dp->addr.client, dp->addr.port);
 	tmpev.time.tick = 0;
 	if (! snd_seq_oss_process_event(dp, (union evrec *)ev, &tmpev)) {
 		snd_seq_oss_dispatch(dp, &tmpev, 0, 0);
diff -druNp --no-dereference linux-libre-3.16.74-gnu/sound/core/seq/oss/seq_oss_rw.c linux-libre-3.16.75-gnu/sound/core/seq/oss/seq_oss_rw.c
--- linux-libre-3.16.74-gnu/sound/core/seq/oss/seq_oss_rw.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/sound/core/seq/oss/seq_oss_rw.c	2019-10-05 11:20:10.000000000 -0400
@@ -174,7 +174,7 @@ insert_queue(struct seq_oss_devinfo *dp,
 	memset(&event, 0, sizeof(event));
 	/* set dummy -- to be sure */
 	event.type = SNDRV_SEQ_EVENT_NOTEOFF;
-	snd_seq_oss_fill_addr(dp, &event, dp->addr.port, dp->addr.client);
+	snd_seq_oss_fill_addr(dp, &event, dp->addr.client, dp->addr.port);
 
 	if (snd_seq_oss_process_event(dp, rec, &event))
 		return 0; /* invalid event - no need to insert queue */
diff -druNp --no-dereference linux-libre-3.16.74-gnu/sound/soc/codecs/cs42xx8.c linux-libre-3.16.75-gnu/sound/soc/codecs/cs42xx8.c
--- linux-libre-3.16.74-gnu/sound/soc/codecs/cs42xx8.c	2019-09-23 16:12:19.000000000 -0400
+++ linux-libre-3.16.75-gnu/sound/soc/codecs/cs42xx8.c	2019-10-05 11:20:10.000000000 -0400
@@ -557,6 +557,7 @@ static int cs42xx8_runtime_resume(struct
 	msleep(5);
 
 	regcache_cache_only(cs42xx8->regmap, false);
+	regcache_mark_dirty(cs42xx8->regmap);
 
 	ret = regcache_sync(cs42xx8->regmap);
 	if (ret) {
