diff -druNp --no-dereference linux-libre-5.3.11-gnu/arch/x86/kernel/early-quirks.c linux-libre-5.3.12-gnu/arch/x86/kernel/early-quirks.c
--- linux-libre-5.3.11-gnu/arch/x86/kernel/early-quirks.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/arch/x86/kernel/early-quirks.c	2019-11-20 10:49:17.000000000 -0500
@@ -709,6 +709,8 @@ static struct chipset early_qrk[] __init
 	 */
 	{ PCI_VENDOR_ID_INTEL, 0x0f00,
 		PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet},
+	{ PCI_VENDOR_ID_INTEL, 0x3ec4,
+		PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet},
 	{ PCI_VENDOR_ID_BROADCOM, 0x4331,
 	  PCI_CLASS_NETWORK_OTHER, PCI_ANY_ID, 0, apple_airport_reset},
 	{}
diff -druNp --no-dereference linux-libre-5.3.11-gnu/arch/x86/kvm/mmu.c linux-libre-5.3.12-gnu/arch/x86/kvm/mmu.c
--- linux-libre-5.3.11-gnu/arch/x86/kvm/mmu.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/arch/x86/kvm/mmu.c	2019-11-20 10:49:17.000000000 -0500
@@ -3352,7 +3352,7 @@ static void transparent_hugepage_adjust(
 	 * here.
 	 */
 	if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) &&
-	    level == PT_PAGE_TABLE_LEVEL &&
+	    !kvm_is_zone_device_pfn(pfn) && level == PT_PAGE_TABLE_LEVEL &&
 	    PageTransCompoundMap(pfn_to_page(pfn)) &&
 	    !mmu_gfn_lpage_is_disallowed(vcpu, gfn, PT_DIRECTORY_LEVEL)) {
 		unsigned long mask;
@@ -5961,9 +5961,9 @@ restart:
 		 * the guest, and the guest page table is using 4K page size
 		 * mapping if the indirect sp has level = 1.
 		 */
-		if (sp->role.direct &&
-			!kvm_is_reserved_pfn(pfn) &&
-			PageTransCompoundMap(pfn_to_page(pfn))) {
+		if (sp->role.direct && !kvm_is_reserved_pfn(pfn) &&
+		    !kvm_is_zone_device_pfn(pfn) &&
+		    PageTransCompoundMap(pfn_to_page(pfn))) {
 			pte_list_remove(rmap_head, sptep);
 
 			if (kvm_available_flush_tlb_with_range())
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/base/memory.c linux-libre-5.3.12-gnu/drivers/base/memory.c
--- linux-libre-5.3.11-gnu/drivers/base/memory.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/base/memory.c	2019-11-20 10:49:17.000000000 -0500
@@ -884,3 +884,39 @@ int walk_memory_blocks(unsigned long sta
 	}
 	return ret;
 }
+
+struct for_each_memory_block_cb_data {
+	walk_memory_blocks_func_t func;
+	void *arg;
+};
+
+static int for_each_memory_block_cb(struct device *dev, void *data)
+{
+	struct memory_block *mem = to_memory_block(dev);
+	struct for_each_memory_block_cb_data *cb_data = data;
+
+	return cb_data->func(mem, cb_data->arg);
+}
+
+/**
+ * for_each_memory_block - walk through all present memory blocks
+ *
+ * @arg: argument passed to func
+ * @func: callback for each memory block walked
+ *
+ * This function walks through all present memory blocks, calling func on
+ * each memory block.
+ *
+ * In case func() returns an error, walking is aborted and the error is
+ * returned.
+ */
+int for_each_memory_block(void *arg, walk_memory_blocks_func_t func)
+{
+	struct for_each_memory_block_cb_data cb_data = {
+		.func = func,
+		.arg = arg,
+	};
+
+	return bus_for_each_dev(&memory_subsys, NULL, &cb_data,
+				for_each_memory_block_cb);
+}
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/gpu/drm/i915/display/intel_display_power.c linux-libre-5.3.12-gnu/drivers/gpu/drm/i915/display/intel_display_power.c
--- linux-libre-5.3.11-gnu/drivers/gpu/drm/i915/display/intel_display_power.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/gpu/drm/i915/display/intel_display_power.c	2019-11-20 10:49:17.000000000 -0500
@@ -4345,6 +4345,9 @@ void intel_power_domains_init_hw(struct
 
 	power_domains->initializing = true;
 
+	/* Must happen before power domain init on VLV/CHV */
+	intel_update_rawclk(i915);
+
 	if (INTEL_GEN(i915) >= 11) {
 		icl_display_core_init(i915, resume);
 	} else if (IS_CANNONLAKE(i915)) {
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/gpu/drm/i915/gt/intel_mocs.c linux-libre-5.3.12-gnu/drivers/gpu/drm/i915/gt/intel_mocs.c
--- linux-libre-5.3.11-gnu/drivers/gpu/drm/i915/gt/intel_mocs.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/gpu/drm/i915/gt/intel_mocs.c	2019-11-20 10:49:17.000000000 -0500
@@ -200,14 +200,6 @@ static const struct drm_i915_mocs_entry
 	MOCS_ENTRY(15, \
 		   LE_3_WB | LE_TC_1_LLC | LE_LRUM(2) | LE_AOM(1), \
 		   L3_3_WB), \
-	/* Bypass LLC - Uncached (EHL+) */ \
-	MOCS_ENTRY(16, \
-		   LE_1_UC | LE_TC_1_LLC | LE_SCF(1), \
-		   L3_1_UC), \
-	/* Bypass LLC - L3 (Read-Only) (EHL+) */ \
-	MOCS_ENTRY(17, \
-		   LE_1_UC | LE_TC_1_LLC | LE_SCF(1), \
-		   L3_3_WB), \
 	/* Self-Snoop - L3 + LLC */ \
 	MOCS_ENTRY(18, \
 		   LE_3_WB | LE_TC_1_LLC | LE_LRUM(3) | LE_SSE(3), \
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/gpu/drm/i915/i915_drv.c linux-libre-5.3.12-gnu/drivers/gpu/drm/i915/i915_drv.c
--- linux-libre-5.3.11-gnu/drivers/gpu/drm/i915/i915_drv.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/gpu/drm/i915/i915_drv.c	2019-11-20 10:49:17.000000000 -0500
@@ -708,9 +708,6 @@ static int i915_load_modeset_init(struct
 	if (ret)
 		goto cleanup_vga_client;
 
-	/* must happen before intel_power_domains_init_hw() on VLV/CHV */
-	intel_update_rawclk(dev_priv);
-
 	intel_power_domains_init_hw(dev_priv, false);
 
 	intel_csr_ucode_init(dev_priv);
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/i2c/i2c-core-acpi.c linux-libre-5.3.12-gnu/drivers/i2c/i2c-core-acpi.c
--- linux-libre-5.3.11-gnu/drivers/i2c/i2c-core-acpi.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/i2c/i2c-core-acpi.c	2019-11-20 10:49:17.000000000 -0500
@@ -39,6 +39,7 @@ struct i2c_acpi_lookup {
 	int index;
 	u32 speed;
 	u32 min_speed;
+	u32 force_speed;
 };
 
 /**
@@ -285,6 +286,19 @@ i2c_acpi_match_device(const struct acpi_
 	return acpi_match_device(matches, &client->dev);
 }
 
+static const struct acpi_device_id i2c_acpi_force_400khz_device_ids[] = {
+	/*
+	 * These Silead touchscreen controllers only work at 400KHz, for
+	 * some reason they do not work at 100KHz. On some devices the ACPI
+	 * tables list another device at their bus as only being capable
+	 * of 100KHz, testing has shown that these other devices work fine
+	 * at 400KHz (as can be expected of any recent i2c hw) so we force
+	 * the speed of the bus to 400 KHz if a Silead device is present.
+	 */
+	{ "MSSL1680", 0 },
+	{}
+};
+
 static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
 					   void *data, void **return_value)
 {
@@ -303,6 +317,9 @@ static acpi_status i2c_acpi_lookup_speed
 	if (lookup->speed <= lookup->min_speed)
 		lookup->min_speed = lookup->speed;
 
+	if (acpi_match_device_ids(adev, i2c_acpi_force_400khz_device_ids) == 0)
+		lookup->force_speed = 400000;
+
 	return AE_OK;
 }
 
@@ -340,7 +357,16 @@ u32 i2c_acpi_find_bus_speed(struct devic
 		return 0;
 	}
 
-	return lookup.min_speed != UINT_MAX ? lookup.min_speed : 0;
+	if (lookup.force_speed) {
+		if (lookup.force_speed != lookup.min_speed)
+			dev_warn(dev, FW_BUG "DSDT uses known not-working I2C bus speed %d, forcing it to %d\n",
+				 lookup.min_speed, lookup.force_speed);
+		return lookup.force_speed;
+	} else if (lookup.min_speed != UINT_MAX) {
+		return lookup.min_speed;
+	} else {
+		return 0;
+	}
 }
 EXPORT_SYMBOL_GPL(i2c_acpi_find_bus_speed);
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/init.c linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/init.c
--- linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/init.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/init.c	2019-11-20 10:49:17.000000000 -0500
@@ -1489,7 +1489,6 @@ static int __init hfi1_mod_init(void)
 		goto bail_dev;
 	}
 
-	hfi1_compute_tid_rdma_flow_wt();
 	/*
 	 * These must be called before the driver is registered with
 	 * the PCI subsystem.
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/pcie.c linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/pcie.c
--- linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/pcie.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/pcie.c	2019-11-20 10:49:17.000000000 -0500
@@ -319,7 +319,9 @@ int pcie_speeds(struct hfi1_devdata *dd)
 	/*
 	 * bus->max_bus_speed is set from the bridge's linkcap Max Link Speed
 	 */
-	if (parent && dd->pcidev->bus->max_bus_speed != PCIE_SPEED_8_0GT) {
+	if (parent &&
+	    (dd->pcidev->bus->max_bus_speed == PCIE_SPEED_2_5GT ||
+	     dd->pcidev->bus->max_bus_speed == PCIE_SPEED_5_0GT)) {
 		dd_dev_info(dd, "Parent PCIe bridge does not support Gen3\n");
 		dd->link_gen3_capable = 0;
 	}
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/rc.c linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/rc.c
--- linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/rc.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/rc.c	2019-11-20 10:49:17.000000000 -0500
@@ -2210,15 +2210,15 @@ int do_rc_ack(struct rvt_qp *qp, u32 aet
 		if (qp->s_flags & RVT_S_WAIT_RNR)
 			goto bail_stop;
 		rdi = ib_to_rvt(qp->ibqp.device);
-		if (qp->s_rnr_retry == 0 &&
-		    !((rdi->post_parms[wqe->wr.opcode].flags &
-		      RVT_OPERATION_IGN_RNR_CNT) &&
-		      qp->s_rnr_retry_cnt == 0)) {
-			status = IB_WC_RNR_RETRY_EXC_ERR;
-			goto class_b;
+		if (!(rdi->post_parms[wqe->wr.opcode].flags &
+		       RVT_OPERATION_IGN_RNR_CNT)) {
+			if (qp->s_rnr_retry == 0) {
+				status = IB_WC_RNR_RETRY_EXC_ERR;
+				goto class_b;
+			}
+			if (qp->s_rnr_retry_cnt < 7 && qp->s_rnr_retry_cnt > 0)
+				qp->s_rnr_retry--;
 		}
-		if (qp->s_rnr_retry_cnt < 7 && qp->s_rnr_retry_cnt > 0)
-			qp->s_rnr_retry--;
 
 		/*
 		 * The last valid PSN is the previous PSN. For TID RDMA WRITE
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/sdma.c linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/sdma.c
--- linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/sdma.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/sdma.c	2019-11-20 10:49:17.000000000 -0500
@@ -65,6 +65,7 @@
 #define SDMA_DESCQ_CNT 2048
 #define SDMA_DESC_INTR 64
 #define INVALID_TAIL 0xffff
+#define SDMA_PAD max_t(size_t, MAX_16B_PADDING, sizeof(u32))
 
 static uint sdma_descq_cnt = SDMA_DESCQ_CNT;
 module_param(sdma_descq_cnt, uint, S_IRUGO);
@@ -1296,7 +1297,7 @@ void sdma_clean(struct hfi1_devdata *dd,
 	struct sdma_engine *sde;
 
 	if (dd->sdma_pad_dma) {
-		dma_free_coherent(&dd->pcidev->dev, 4,
+		dma_free_coherent(&dd->pcidev->dev, SDMA_PAD,
 				  (void *)dd->sdma_pad_dma,
 				  dd->sdma_pad_phys);
 		dd->sdma_pad_dma = NULL;
@@ -1491,7 +1492,7 @@ int sdma_init(struct hfi1_devdata *dd, u
 	}
 
 	/* Allocate memory for pad */
-	dd->sdma_pad_dma = dma_alloc_coherent(&dd->pcidev->dev, sizeof(u32),
+	dd->sdma_pad_dma = dma_alloc_coherent(&dd->pcidev->dev, SDMA_PAD,
 					      &dd->sdma_pad_phys, GFP_KERNEL);
 	if (!dd->sdma_pad_dma) {
 		dd_dev_err(dd, "failed to allocate SendDMA pad memory\n");
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/tid_rdma.c linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/tid_rdma.c
--- linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/tid_rdma.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/tid_rdma.c	2019-11-20 10:49:17.000000000 -0500
@@ -107,8 +107,6 @@ static u32 mask_generation(u32 a)
  * C - Capcode
  */
 
-static u32 tid_rdma_flow_wt;
-
 static void tid_rdma_trigger_resume(struct work_struct *work);
 static void hfi1_kern_exp_rcv_free_flows(struct tid_rdma_request *req);
 static int hfi1_kern_exp_rcv_alloc_flows(struct tid_rdma_request *req,
@@ -136,6 +134,26 @@ static void update_r_next_psn_fecn(struc
 				   struct tid_rdma_flow *flow,
 				   bool fecn);
 
+static void validate_r_tid_ack(struct hfi1_qp_priv *priv)
+{
+	if (priv->r_tid_ack == HFI1_QP_WQE_INVALID)
+		priv->r_tid_ack = priv->r_tid_tail;
+}
+
+static void tid_rdma_schedule_ack(struct rvt_qp *qp)
+{
+	struct hfi1_qp_priv *priv = qp->priv;
+
+	priv->s_flags |= RVT_S_ACK_PENDING;
+	hfi1_schedule_tid_send(qp);
+}
+
+static void tid_rdma_trigger_ack(struct rvt_qp *qp)
+{
+	validate_r_tid_ack(qp->priv);
+	tid_rdma_schedule_ack(qp);
+}
+
 static u64 tid_rdma_opfn_encode(struct tid_rdma_params *p)
 {
 	return
@@ -2997,10 +3015,7 @@ nak_psn:
 		qpriv->s_nak_state = IB_NAK_PSN_ERROR;
 		/* We are NAK'ing the next expected PSN */
 		qpriv->s_nak_psn = mask_psn(flow->flow_state.r_next_psn);
-		qpriv->s_flags |= RVT_S_ACK_PENDING;
-		if (qpriv->r_tid_ack == HFI1_QP_WQE_INVALID)
-			qpriv->r_tid_ack = qpriv->r_tid_tail;
-		hfi1_schedule_tid_send(qp);
+		tid_rdma_trigger_ack(qp);
 	}
 	goto unlock;
 }
@@ -3363,18 +3378,17 @@ u32 hfi1_build_tid_rdma_write_req(struct
 	return sizeof(ohdr->u.tid_rdma.w_req) / sizeof(u32);
 }
 
-void hfi1_compute_tid_rdma_flow_wt(void)
+static u32 hfi1_compute_tid_rdma_flow_wt(struct rvt_qp *qp)
 {
 	/*
 	 * Heuristic for computing the RNR timeout when waiting on the flow
 	 * queue. Rather than a computationaly expensive exact estimate of when
 	 * a flow will be available, we assume that if a QP is at position N in
 	 * the flow queue it has to wait approximately (N + 1) * (number of
-	 * segments between two sync points), assuming PMTU of 4K. The rationale
-	 * for this is that flows are released and recycled at each sync point.
+	 * segments between two sync points). The rationale for this is that
+	 * flows are released and recycled at each sync point.
 	 */
-	tid_rdma_flow_wt = MAX_TID_FLOW_PSN * enum_to_mtu(OPA_MTU_4096) /
-		TID_RDMA_MAX_SEGMENT_SIZE;
+	return (MAX_TID_FLOW_PSN * qp->pmtu) >> TID_RDMA_SEGMENT_SHIFT;
 }
 
 static u32 position_in_queue(struct hfi1_qp_priv *qpriv,
@@ -3497,7 +3511,7 @@ static void hfi1_tid_write_alloc_resourc
 		if (qpriv->flow_state.index >= RXE_NUM_TID_FLOWS) {
 			ret = hfi1_kern_setup_hw_flow(qpriv->rcd, qp);
 			if (ret) {
-				to_seg = tid_rdma_flow_wt *
+				to_seg = hfi1_compute_tid_rdma_flow_wt(qp) *
 					position_in_queue(qpriv,
 							  &rcd->flow_queue);
 				break;
@@ -3518,7 +3532,7 @@ static void hfi1_tid_write_alloc_resourc
 		/*
 		 * If overtaking req->acked_tail, send an RNR NAK. Because the
 		 * QP is not queued in this case, and the issue can only be
-		 * caused due a delay in scheduling the second leg which we
+		 * caused by a delay in scheduling the second leg which we
 		 * cannot estimate, we use a rather arbitrary RNR timeout of
 		 * (MAX_FLOWS / 2) segments
 		 */
@@ -3526,8 +3540,7 @@ static void hfi1_tid_write_alloc_resourc
 				MAX_FLOWS)) {
 			ret = -EAGAIN;
 			to_seg = MAX_FLOWS >> 1;
-			qpriv->s_flags |= RVT_S_ACK_PENDING;
-			hfi1_schedule_tid_send(qp);
+			tid_rdma_trigger_ack(qp);
 			break;
 		}
 
@@ -4327,8 +4340,7 @@ void hfi1_rc_rcv_tid_rdma_write_data(str
 	trace_hfi1_tid_req_rcv_write_data(qp, 0, e->opcode, e->psn, e->lpsn,
 					  req);
 	trace_hfi1_tid_write_rsp_rcv_data(qp);
-	if (priv->r_tid_ack == HFI1_QP_WQE_INVALID)
-		priv->r_tid_ack = priv->r_tid_tail;
+	validate_r_tid_ack(priv);
 
 	if (opcode == TID_OP(WRITE_DATA_LAST)) {
 		release_rdma_sge_mr(e);
@@ -4367,8 +4379,7 @@ void hfi1_rc_rcv_tid_rdma_write_data(str
 	}
 
 done:
-	priv->s_flags |= RVT_S_ACK_PENDING;
-	hfi1_schedule_tid_send(qp);
+	tid_rdma_schedule_ack(qp);
 exit:
 	priv->r_next_psn_kdeth = flow->flow_state.r_next_psn;
 	if (fecn)
@@ -4380,10 +4391,7 @@ send_nak:
 	if (!priv->s_nak_state) {
 		priv->s_nak_state = IB_NAK_PSN_ERROR;
 		priv->s_nak_psn = flow->flow_state.r_next_psn;
-		priv->s_flags |= RVT_S_ACK_PENDING;
-		if (priv->r_tid_ack == HFI1_QP_WQE_INVALID)
-			priv->r_tid_ack = priv->r_tid_tail;
-		hfi1_schedule_tid_send(qp);
+		tid_rdma_trigger_ack(qp);
 	}
 	goto done;
 }
@@ -4931,8 +4939,7 @@ void hfi1_rc_rcv_tid_rdma_resync(struct
 	qpriv->resync = true;
 	/* RESYNC request always gets a TID RDMA ACK. */
 	qpriv->s_nak_state = 0;
-	qpriv->s_flags |= RVT_S_ACK_PENDING;
-	hfi1_schedule_tid_send(qp);
+	tid_rdma_trigger_ack(qp);
 bail:
 	if (fecn)
 		qp->s_flags |= RVT_S_ECN;
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/tid_rdma.h linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/tid_rdma.h
--- linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/tid_rdma.h	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/tid_rdma.h	2019-11-20 10:49:17.000000000 -0500
@@ -17,6 +17,7 @@
 #define TID_RDMA_MIN_SEGMENT_SIZE       BIT(18)   /* 256 KiB (for now) */
 #define TID_RDMA_MAX_SEGMENT_SIZE       BIT(18)   /* 256 KiB (for now) */
 #define TID_RDMA_MAX_PAGES              (BIT(18) >> PAGE_SHIFT)
+#define TID_RDMA_SEGMENT_SHIFT		18
 
 /*
  * Bit definitions for priv->s_flags.
@@ -274,8 +275,6 @@ u32 hfi1_build_tid_rdma_write_req(struct
 				  struct ib_other_headers *ohdr,
 				  u32 *bth1, u32 *bth2, u32 *len);
 
-void hfi1_compute_tid_rdma_flow_wt(void);
-
 void hfi1_rc_rcv_tid_rdma_write_req(struct hfi1_packet *packet);
 
 u32 hfi1_build_tid_rdma_write_resp(struct rvt_qp *qp, struct rvt_ack_entry *e,
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/verbs.c linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/verbs.c
--- linux-libre-5.3.11-gnu/drivers/infiniband/hw/hfi1/verbs.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/infiniband/hw/hfi1/verbs.c	2019-11-20 10:49:17.000000000 -0500
@@ -147,9 +147,6 @@ static int pio_wait(struct rvt_qp *qp,
 /* Length of buffer to create verbs txreq cache name */
 #define TXREQ_NAME_LEN 24
 
-/* 16B trailing buffer */
-static const u8 trail_buf[MAX_16B_PADDING];
-
 static uint wss_threshold = 80;
 module_param(wss_threshold, uint, S_IRUGO);
 MODULE_PARM_DESC(wss_threshold, "Percentage (1-100) of LLC to use as a threshold for a cacheless copy");
@@ -820,8 +817,8 @@ static int build_verbs_tx_desc(
 
 	/* add icrc, lt byte, and padding to flit */
 	if (extra_bytes)
-		ret = sdma_txadd_kvaddr(sde->dd, &tx->txreq,
-					(void *)trail_buf, extra_bytes);
+		ret = sdma_txadd_daddr(sde->dd, &tx->txreq,
+				       sde->dd->sdma_pad_phys, extra_bytes);
 
 bail_txadd:
 	return ret;
@@ -1089,7 +1086,8 @@ int hfi1_verbs_send_pio(struct rvt_qp *q
 		}
 		/* add icrc, lt byte, and padding to flit */
 		if (extra_bytes)
-			seg_pio_copy_mid(pbuf, trail_buf, extra_bytes);
+			seg_pio_copy_mid(pbuf, ppd->dd->sdma_pad_dma,
+					 extra_bytes);
 
 		seg_pio_copy_end(pbuf);
 	}
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/input/ff-memless.c linux-libre-5.3.12-gnu/drivers/input/ff-memless.c
--- linux-libre-5.3.11-gnu/drivers/input/ff-memless.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/input/ff-memless.c	2019-11-20 10:49:17.000000000 -0500
@@ -489,6 +489,15 @@ static void ml_ff_destroy(struct ff_devi
 {
 	struct ml_device *ml = ff->private;
 
+	/*
+	 * Even though we stop all playing effects when tearing down
+	 * an input device (via input_device_flush() that calls into
+	 * input_ff_flush() that stops and erases all effects), we
+	 * do not actually stop the timer, and therefore we should
+	 * do it here.
+	 */
+	del_timer_sync(&ml->timer);
+
 	kfree(ml->private);
 }
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/input/rmi4/rmi_f11.c linux-libre-5.3.12-gnu/drivers/input/rmi4/rmi_f11.c
--- linux-libre-5.3.11-gnu/drivers/input/rmi4/rmi_f11.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/input/rmi4/rmi_f11.c	2019-11-20 10:49:17.000000000 -0500
@@ -1284,8 +1284,8 @@ static irqreturn_t rmi_f11_attention(int
 			valid_bytes = f11->sensor.attn_size;
 		memcpy(f11->sensor.data_pkt, drvdata->attn_data.data,
 			valid_bytes);
-		drvdata->attn_data.data += f11->sensor.attn_size;
-		drvdata->attn_data.size -= f11->sensor.attn_size;
+		drvdata->attn_data.data += valid_bytes;
+		drvdata->attn_data.size -= valid_bytes;
 	} else {
 		error = rmi_read_block(rmi_dev,
 				data_base_addr, f11->sensor.data_pkt,
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/input/rmi4/rmi_f12.c linux-libre-5.3.12-gnu/drivers/input/rmi4/rmi_f12.c
--- linux-libre-5.3.11-gnu/drivers/input/rmi4/rmi_f12.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/input/rmi4/rmi_f12.c	2019-11-20 10:49:17.000000000 -0500
@@ -55,6 +55,9 @@ struct f12_data {
 
 	const struct rmi_register_desc_item *data15;
 	u16 data15_offset;
+
+	unsigned long *abs_mask;
+	unsigned long *rel_mask;
 };
 
 static int rmi_f12_read_sensor_tuning(struct f12_data *f12)
@@ -209,8 +212,8 @@ static irqreturn_t rmi_f12_attention(int
 			valid_bytes = sensor->attn_size;
 		memcpy(sensor->data_pkt, drvdata->attn_data.data,
 			valid_bytes);
-		drvdata->attn_data.data += sensor->attn_size;
-		drvdata->attn_data.size -= sensor->attn_size;
+		drvdata->attn_data.data += valid_bytes;
+		drvdata->attn_data.size -= valid_bytes;
 	} else {
 		retval = rmi_read_block(rmi_dev, f12->data_addr,
 					sensor->data_pkt, sensor->pkt_size);
@@ -291,9 +294,18 @@ static int rmi_f12_write_control_regs(st
 static int rmi_f12_config(struct rmi_function *fn)
 {
 	struct rmi_driver *drv = fn->rmi_dev->driver;
+	struct f12_data *f12 = dev_get_drvdata(&fn->dev);
+	struct rmi_2d_sensor *sensor;
 	int ret;
 
-	drv->set_irq_bits(fn->rmi_dev, fn->irq_mask);
+	sensor = &f12->sensor;
+
+	if (!sensor->report_abs)
+		drv->clear_irq_bits(fn->rmi_dev, f12->abs_mask);
+	else
+		drv->set_irq_bits(fn->rmi_dev, f12->abs_mask);
+
+	drv->clear_irq_bits(fn->rmi_dev, f12->rel_mask);
 
 	ret = rmi_f12_write_control_regs(fn);
 	if (ret)
@@ -315,9 +327,12 @@ static int rmi_f12_probe(struct rmi_func
 	struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
 	struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
 	u16 data_offset = 0;
+	int mask_size;
 
 	rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__);
 
+	mask_size = BITS_TO_LONGS(drvdata->irq_count) * sizeof(unsigned long);
+
 	ret = rmi_read(fn->rmi_dev, query_addr, &buf);
 	if (ret < 0) {
 		dev_err(&fn->dev, "Failed to read general info register: %d\n",
@@ -332,10 +347,19 @@ static int rmi_f12_probe(struct rmi_func
 		return -ENODEV;
 	}
 
-	f12 = devm_kzalloc(&fn->dev, sizeof(struct f12_data), GFP_KERNEL);
+	f12 = devm_kzalloc(&fn->dev, sizeof(struct f12_data) + mask_size * 2,
+			GFP_KERNEL);
 	if (!f12)
 		return -ENOMEM;
 
+	f12->abs_mask = (unsigned long *)((char *)f12
+			+ sizeof(struct f12_data));
+	f12->rel_mask = (unsigned long *)((char *)f12
+			+ sizeof(struct f12_data) + mask_size);
+
+	set_bit(fn->irq_pos, f12->abs_mask);
+	set_bit(fn->irq_pos + 1, f12->rel_mask);
+
 	f12->has_dribble = !!(buf & BIT(3));
 
 	if (fn->dev.of_node) {
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/input/rmi4/rmi_f54.c linux-libre-5.3.12-gnu/drivers/input/rmi4/rmi_f54.c
--- linux-libre-5.3.11-gnu/drivers/input/rmi4/rmi_f54.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/input/rmi4/rmi_f54.c	2019-11-20 10:49:17.000000000 -0500
@@ -359,7 +359,7 @@ static const struct vb2_ops rmi_f54_queu
 static const struct vb2_queue rmi_f54_queue = {
 	.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
 	.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ,
-	.buf_struct_size = sizeof(struct vb2_buffer),
+	.buf_struct_size = sizeof(struct vb2_v4l2_buffer),
 	.ops = &rmi_f54_queue_ops,
 	.mem_ops = &vb2_vmalloc_memops,
 	.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC,
@@ -601,7 +601,7 @@ static int rmi_f54_config(struct rmi_fun
 {
 	struct rmi_driver *drv = fn->rmi_dev->driver;
 
-	drv->set_irq_bits(fn->rmi_dev, fn->irq_mask);
+	drv->clear_irq_bits(fn->rmi_dev, fn->irq_mask);
 
 	return 0;
 }
@@ -730,6 +730,7 @@ static void rmi_f54_remove(struct rmi_fu
 
 	video_unregister_device(&f54->vdev);
 	v4l2_device_unregister(&f54->v4l2);
+	destroy_workqueue(f54->workqueue);
 }
 
 struct rmi_function_handler rmi_f54_handler = {
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/mmc/host/sdhci-of-at91.c linux-libre-5.3.12-gnu/drivers/mmc/host/sdhci-of-at91.c
--- linux-libre-5.3.11-gnu/drivers/mmc/host/sdhci-of-at91.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/mmc/host/sdhci-of-at91.c	2019-11-20 10:49:17.000000000 -0500
@@ -358,7 +358,7 @@ static int sdhci_at91_probe(struct platf
 	pm_runtime_use_autosuspend(&pdev->dev);
 
 	/* HS200 is broken at this moment */
-	host->quirks2 = SDHCI_QUIRK2_BROKEN_HS200;
+	host->quirks2 |= SDHCI_QUIRK2_BROKEN_HS200;
 
 	ret = sdhci_add_host(host);
 	if (ret)
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/can/slcan.c linux-libre-5.3.12-gnu/drivers/net/can/slcan.c
--- linux-libre-5.3.11-gnu/drivers/net/can/slcan.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/can/slcan.c	2019-11-20 10:49:17.000000000 -0500
@@ -613,6 +613,7 @@ err_free_chan:
 	sl->tty = NULL;
 	tty->disc_data = NULL;
 	clear_bit(SLF_INUSE, &sl->flags);
+	free_netdev(sl->dev);
 
 err_exit:
 	rtnl_unlock();
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/ethernet/cortina/gemini.c linux-libre-5.3.12-gnu/drivers/net/ethernet/cortina/gemini.c
--- linux-libre-5.3.11-gnu/drivers/net/ethernet/cortina/gemini.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/ethernet/cortina/gemini.c	2019-11-20 10:49:17.000000000 -0500
@@ -2527,6 +2527,7 @@ static int gemini_ethernet_port_remove(s
 	struct gemini_ethernet_port *port = platform_get_drvdata(pdev);
 
 	gemini_port_remove(port);
+	free_netdev(port->netdev);
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c linux-libre-5.3.12-gnu/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
--- linux-libre-5.3.11-gnu/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c	2019-11-20 10:49:17.000000000 -0500
@@ -2166,8 +2166,16 @@ err_set_cdan:
 err_service_reg:
 	free_channel(priv, channel);
 err_alloc_ch:
-	if (err == -EPROBE_DEFER)
+	if (err == -EPROBE_DEFER) {
+		for (i = 0; i < priv->num_channels; i++) {
+			channel = priv->channel[i];
+			nctx = &channel->nctx;
+			dpaa2_io_service_deregister(channel->dpio, nctx, dev);
+			free_channel(priv, channel);
+		}
+		priv->num_channels = 0;
 		return err;
+	}
 
 	if (cpumask_empty(&priv->dpio_cpumask)) {
 		dev_err(dev, "No cpu with an affine DPIO/DPCON\n");
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/ethernet/mellanox/mlx4/main.c linux-libre-5.3.12-gnu/drivers/net/ethernet/mellanox/mlx4/main.c
--- linux-libre-5.3.11-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2019-11-20 10:49:17.000000000 -0500
@@ -3982,6 +3982,7 @@ static int mlx4_init_one(struct pci_dev
 		goto err_params_unregister;
 
 	devlink_params_publish(devlink);
+	devlink_reload_enable(devlink);
 	pci_save_state(pdev);
 	return 0;
 
@@ -4093,6 +4094,8 @@ static void mlx4_remove_one(struct pci_d
 	struct devlink *devlink = priv_to_devlink(priv);
 	int active_vfs = 0;
 
+	devlink_reload_disable(devlink);
+
 	if (mlx4_is_slave(dev))
 		persist->interface_state |= MLX4_INTERFACE_STATE_NOWAIT;
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/ethernet/mellanox/mlxsw/core.c linux-libre-5.3.12-gnu/drivers/net/ethernet/mellanox/mlxsw/core.c
--- linux-libre-5.3.11-gnu/drivers/net/ethernet/mellanox/mlxsw/core.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/ethernet/mellanox/mlxsw/core.c	2019-11-20 10:49:17.000000000 -0500
@@ -1131,6 +1131,9 @@ __mlxsw_core_bus_device_register(const s
 	if (mlxsw_driver->params_register)
 		devlink_params_publish(devlink);
 
+	if (!reload)
+		devlink_reload_enable(devlink);
+
 	return 0;
 
 err_thermal_init:
@@ -1191,6 +1194,8 @@ void mlxsw_core_bus_device_unregister(st
 {
 	struct devlink *devlink = priv_to_devlink(mlxsw_core);
 
+	if (!reload)
+		devlink_reload_disable(devlink);
 	if (mlxsw_core->reload_fail) {
 		if (!reload)
 			/* Only the parts that were not de-initialized in the
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c linux-libre-5.3.12-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
--- linux-libre-5.3.11-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c	2019-11-20 10:49:17.000000000 -0500
@@ -1225,7 +1225,7 @@ static int sun8i_dwmac_probe(struct plat
 dwmac_mux:
 	sun8i_dwmac_unset_syscon(gmac);
 dwmac_exit:
-	sun8i_dwmac_exit(pdev, plat_dat->bsp_priv);
+	stmmac_pltfr_remove(pdev);
 return ret;
 }
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/netdevsim/dev.c linux-libre-5.3.12-gnu/drivers/net/netdevsim/dev.c
--- linux-libre-5.3.11-gnu/drivers/net/netdevsim/dev.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/netdevsim/dev.c	2019-11-20 10:49:17.000000000 -0500
@@ -297,6 +297,7 @@ nsim_dev_create(struct nsim_bus_dev *nsi
 	if (err)
 		goto err_debugfs_exit;
 
+	devlink_reload_enable(devlink);
 	return nsim_dev;
 
 err_debugfs_exit:
@@ -314,6 +315,7 @@ static void nsim_dev_destroy(struct nsim
 {
 	struct devlink *devlink = priv_to_devlink(nsim_dev);
 
+	devlink_reload_disable(devlink);
 	nsim_bpf_dev_exit(nsim_dev);
 	nsim_dev_debugfs_exit(nsim_dev);
 	devlink_unregister(devlink);
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/slip/slip.c linux-libre-5.3.12-gnu/drivers/net/slip/slip.c
--- linux-libre-5.3.11-gnu/drivers/net/slip/slip.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/slip/slip.c	2019-11-20 10:49:17.000000000 -0500
@@ -855,6 +855,7 @@ err_free_chan:
 	sl->tty = NULL;
 	tty->disc_data = NULL;
 	clear_bit(SLF_INUSE, &sl->flags);
+	free_netdev(sl->dev);
 
 err_exit:
 	rtnl_unlock();
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/usb/ax88172a.c linux-libre-5.3.12-gnu/drivers/net/usb/ax88172a.c
--- linux-libre-5.3.11-gnu/drivers/net/usb/ax88172a.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/usb/ax88172a.c	2019-11-20 10:49:17.000000000 -0500
@@ -196,7 +196,7 @@ static int ax88172a_bind(struct usbnet *
 
 	/* Get the MAC address */
 	ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf, 0);
-	if (ret < 0) {
+	if (ret < ETH_ALEN) {
 		netdev_err(dev->net, "Failed to read MAC address: %d\n", ret);
 		goto free;
 	}
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/net/usb/qmi_wwan.c linux-libre-5.3.12-gnu/drivers/net/usb/qmi_wwan.c
--- linux-libre-5.3.11-gnu/drivers/net/usb/qmi_wwan.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/net/usb/qmi_wwan.c	2019-11-20 10:49:17.000000000 -0500
@@ -1370,6 +1370,8 @@ static const struct usb_device_id produc
 	{QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)},	/* Quectel EG91 */
 	{QMI_FIXED_INTF(0x2c7c, 0x0296, 4)},	/* Quectel BG96 */
 	{QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)},	/* Fibocom NL678 series */
+	{QMI_FIXED_INTF(0x0489, 0xe0b4, 0)},	/* Foxconn T77W968 LTE */
+	{QMI_FIXED_INTF(0x0489, 0xe0b5, 0)},	/* Foxconn T77W968 LTE with eSIM support*/
 
 	/* 4. Gobi 1000 devices */
 	{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)},	/* Acer Gobi Modem Device */
diff -druNp --no-dereference linux-libre-5.3.11-gnu/drivers/scsi/scsi_lib.c linux-libre-5.3.12-gnu/drivers/scsi/scsi_lib.c
--- linux-libre-5.3.11-gnu/drivers/scsi/scsi_lib.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/drivers/scsi/scsi_lib.c	2019-11-20 10:49:17.000000000 -0500
@@ -1854,7 +1854,8 @@ int scsi_mq_setup_tags(struct Scsi_Host
 {
 	unsigned int cmd_size, sgl_size;
 
-	sgl_size = scsi_mq_inline_sgl_size(shost);
+	sgl_size = max_t(unsigned int, sizeof(struct scatterlist),
+				scsi_mq_inline_sgl_size(shost));
 	cmd_size = sizeof(struct scsi_cmnd) + shost->hostt->cmd_size + sgl_size;
 	if (scsi_host_get_prot(shost))
 		cmd_size += sizeof(struct scsi_data_buffer) +
diff -druNp --no-dereference linux-libre-5.3.11-gnu/fs/btrfs/inode.c linux-libre-5.3.12-gnu/fs/btrfs/inode.c
--- linux-libre-5.3.11-gnu/fs/btrfs/inode.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/fs/btrfs/inode.c	2019-11-20 10:49:17.000000000 -0500
@@ -9723,6 +9723,18 @@ out_fail:
 			commit_transaction = true;
 	}
 	if (commit_transaction) {
+		/*
+		 * We may have set commit_transaction when logging the new name
+		 * in the destination root, in which case we left the source
+		 * root context in the list of log contextes. So make sure we
+		 * remove it to avoid invalid memory accesses, since the context
+		 * was allocated in our stack frame.
+		 */
+		if (sync_log_root) {
+			mutex_lock(&root->log_mutex);
+			list_del_init(&ctx_root.list);
+			mutex_unlock(&root->log_mutex);
+		}
 		ret = btrfs_commit_transaction(trans);
 	} else {
 		int ret2;
@@ -9736,6 +9748,9 @@ out_notrans:
 	if (old_ino == BTRFS_FIRST_FREE_OBJECTID)
 		up_read(&fs_info->subvol_sem);
 
+	ASSERT(list_empty(&ctx_root.list));
+	ASSERT(list_empty(&ctx_dest.list));
+
 	return ret;
 }
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/fs/ecryptfs/inode.c linux-libre-5.3.12-gnu/fs/ecryptfs/inode.c
--- linux-libre-5.3.11-gnu/fs/ecryptfs/inode.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/fs/ecryptfs/inode.c	2019-11-20 10:49:17.000000000 -0500
@@ -311,9 +311,9 @@ static int ecryptfs_i_size_read(struct d
 static struct dentry *ecryptfs_lookup_interpose(struct dentry *dentry,
 				     struct dentry *lower_dentry)
 {
-	struct inode *inode, *lower_inode = d_inode(lower_dentry);
+	struct path *path = ecryptfs_dentry_to_lower_path(dentry->d_parent);
+	struct inode *inode, *lower_inode;
 	struct ecryptfs_dentry_info *dentry_info;
-	struct vfsmount *lower_mnt;
 	int rc = 0;
 
 	dentry_info = kmem_cache_alloc(ecryptfs_dentry_info_cache, GFP_KERNEL);
@@ -322,16 +322,23 @@ static struct dentry *ecryptfs_lookup_in
 		return ERR_PTR(-ENOMEM);
 	}
 
-	lower_mnt = mntget(ecryptfs_dentry_to_lower_mnt(dentry->d_parent));
 	fsstack_copy_attr_atime(d_inode(dentry->d_parent),
-				d_inode(lower_dentry->d_parent));
+				d_inode(path->dentry));
 	BUG_ON(!d_count(lower_dentry));
 
 	ecryptfs_set_dentry_private(dentry, dentry_info);
-	dentry_info->lower_path.mnt = lower_mnt;
+	dentry_info->lower_path.mnt = mntget(path->mnt);
 	dentry_info->lower_path.dentry = lower_dentry;
 
-	if (d_really_is_negative(lower_dentry)) {
+	/*
+	 * negative dentry can go positive under us here - its parent is not
+	 * locked.  That's OK and that could happen just as we return from
+	 * ecryptfs_lookup() anyway.  Just need to be careful and fetch
+	 * ->d_inode only once - it's not stable here.
+	 */
+	lower_inode = READ_ONCE(lower_dentry->d_inode);
+
+	if (!lower_inode) {
 		/* We want to add because we couldn't find in lower */
 		d_add(dentry, NULL);
 		return NULL;
diff -druNp --no-dereference linux-libre-5.3.11-gnu/fs/io_uring.c linux-libre-5.3.12-gnu/fs/io_uring.c
--- linux-libre-5.3.11-gnu/fs/io_uring.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/fs/io_uring.c	2019-11-20 10:49:17.000000000 -0500
@@ -1179,7 +1179,7 @@ static int io_import_fixed(struct io_rin
 		}
 	}
 
-	return 0;
+	return len;
 }
 
 static ssize_t io_import_iovec(struct io_ring_ctx *ctx, int rw,
diff -druNp --no-dereference linux-libre-5.3.11-gnu/include/linux/intel-iommu.h linux-libre-5.3.12-gnu/include/linux/intel-iommu.h
--- linux-libre-5.3.11-gnu/include/linux/intel-iommu.h	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/include/linux/intel-iommu.h	2019-11-20 10:49:17.000000000 -0500
@@ -334,7 +334,8 @@ enum {
 #define QI_DEV_IOTLB_SID(sid)	((u64)((sid) & 0xffff) << 32)
 #define QI_DEV_IOTLB_QDEP(qdep)	(((qdep) & 0x1f) << 16)
 #define QI_DEV_IOTLB_ADDR(addr)	((u64)(addr) & VTD_PAGE_MASK)
-#define QI_DEV_IOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | ((u64)(pfsid & 0xfff) << 52))
+#define QI_DEV_IOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | \
+				   ((u64)((pfsid >> 4) & 0xfff) << 52))
 #define QI_DEV_IOTLB_SIZE	1
 #define QI_DEV_IOTLB_MAX_INVS	32
 
@@ -358,7 +359,8 @@ enum {
 #define QI_DEV_EIOTLB_PASID(p)	(((u64)p) << 32)
 #define QI_DEV_EIOTLB_SID(sid)	((u64)((sid) & 0xffff) << 16)
 #define QI_DEV_EIOTLB_QDEP(qd)	((u64)((qd) & 0x1f) << 4)
-#define QI_DEV_EIOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | ((u64)(pfsid & 0xfff) << 52))
+#define QI_DEV_EIOTLB_PFSID(pfsid) (((u64)(pfsid & 0xf) << 12) | \
+				    ((u64)((pfsid >> 4) & 0xfff) << 52))
 #define QI_DEV_EIOTLB_MAX_INVS	32
 
 /* Page group response descriptor QW0 */
diff -druNp --no-dereference linux-libre-5.3.11-gnu/include/linux/kvm_host.h linux-libre-5.3.12-gnu/include/linux/kvm_host.h
--- linux-libre-5.3.11-gnu/include/linux/kvm_host.h	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/include/linux/kvm_host.h	2019-11-20 10:49:17.000000000 -0500
@@ -966,6 +966,7 @@ int kvm_cpu_has_pending_timer(struct kvm
 void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
 
 bool kvm_is_reserved_pfn(kvm_pfn_t pfn);
+bool kvm_is_zone_device_pfn(kvm_pfn_t pfn);
 
 struct kvm_irq_ack_notifier {
 	struct hlist_node link;
diff -druNp --no-dereference linux-libre-5.3.11-gnu/include/linux/memory.h linux-libre-5.3.12-gnu/include/linux/memory.h
--- linux-libre-5.3.11-gnu/include/linux/memory.h	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/include/linux/memory.h	2019-11-20 10:49:17.000000000 -0500
@@ -120,6 +120,7 @@ extern struct memory_block *find_memory_
 typedef int (*walk_memory_blocks_func_t)(struct memory_block *, void *);
 extern int walk_memory_blocks(unsigned long start, unsigned long size,
 			      void *arg, walk_memory_blocks_func_t func);
+extern int for_each_memory_block(void *arg, walk_memory_blocks_func_t func);
 #define CONFIG_MEM_BLOCK_SIZE	(PAGES_PER_SECTION<<PAGE_SHIFT)
 #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/include/net/devlink.h linux-libre-5.3.12-gnu/include/net/devlink.h
--- linux-libre-5.3.11-gnu/include/net/devlink.h	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/include/net/devlink.h	2019-11-20 10:49:17.000000000 -0500
@@ -35,6 +35,7 @@ struct devlink {
 	struct device *dev;
 	possible_net_t _net;
 	struct mutex lock;
+	u8 reload_enabled:1;
 	char priv[0] __aligned(NETDEV_ALIGN);
 };
 
@@ -594,6 +595,8 @@ struct ib_device;
 struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size);
 int devlink_register(struct devlink *devlink, struct device *dev);
 void devlink_unregister(struct devlink *devlink);
+void devlink_reload_enable(struct devlink *devlink);
+void devlink_reload_disable(struct devlink *devlink);
 void devlink_free(struct devlink *devlink);
 int devlink_port_register(struct devlink *devlink,
 			  struct devlink_port *devlink_port,
diff -druNp --no-dereference linux-libre-5.3.11-gnu/include/trace/events/tcp.h linux-libre-5.3.12-gnu/include/trace/events/tcp.h
--- linux-libre-5.3.11-gnu/include/trace/events/tcp.h	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/include/trace/events/tcp.h	2019-11-20 10:49:17.000000000 -0500
@@ -86,7 +86,7 @@ DECLARE_EVENT_CLASS(tcp_event_sk_skb,
 			      sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
 	),
 
-	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s\n",
+	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s",
 		  __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
 		  __entry->saddr_v6, __entry->daddr_v6,
 		  show_tcp_state_name(__entry->state))
diff -druNp --no-dereference linux-libre-5.3.11-gnu/include/uapi/linux/devlink.h linux-libre-5.3.12-gnu/include/uapi/linux/devlink.h
--- linux-libre-5.3.11-gnu/include/uapi/linux/devlink.h	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/include/uapi/linux/devlink.h	2019-11-20 10:49:17.000000000 -0500
@@ -348,6 +348,7 @@ enum devlink_attr {
 	DEVLINK_ATTR_PORT_PCI_PF_NUMBER,	/* u16 */
 	DEVLINK_ATTR_PORT_PCI_VF_NUMBER,	/* u16 */
 
+	DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS,	/* u64 */
 	/* add new attributes above here, update the policy in devlink.c */
 
 	__DEVLINK_ATTR_MAX,
diff -druNp --no-dereference linux-libre-5.3.11-gnu/kernel/signal.c linux-libre-5.3.12-gnu/kernel/signal.c
--- linux-libre-5.3.11-gnu/kernel/signal.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/kernel/signal.c	2019-11-20 10:49:17.000000000 -0500
@@ -2205,8 +2205,8 @@ static void ptrace_stop(int exit_code, i
 		 */
 		preempt_disable();
 		read_unlock(&tasklist_lock);
-		preempt_enable_no_resched();
 		cgroup_enter_frozen();
+		preempt_enable_no_resched();
 		freezable_schedule();
 		cgroup_leave_frozen(true);
 	} else {
diff -druNp --no-dereference linux-libre-5.3.11-gnu/kernel/time/ntp.c linux-libre-5.3.12-gnu/kernel/time/ntp.c
--- linux-libre-5.3.11-gnu/kernel/time/ntp.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/kernel/time/ntp.c	2019-11-20 10:49:17.000000000 -0500
@@ -771,7 +771,7 @@ int __do_adjtimex(struct __kernel_timex
 	/* fill PPS status fields */
 	pps_fill_timex(txc);
 
-	txc->time.tv_sec = (time_t)ts->tv_sec;
+	txc->time.tv_sec = ts->tv_sec;
 	txc->time.tv_usec = ts->tv_nsec;
 	if (!(time_status & STA_NANO))
 		txc->time.tv_usec = ts->tv_nsec / NSEC_PER_USEC;
diff -druNp --no-dereference linux-libre-5.3.11-gnu/Makefile linux-libre-5.3.12-gnu/Makefile
--- linux-libre-5.3.11-gnu/Makefile	2019-11-12 23:13:36.000000000 -0500
+++ linux-libre-5.3.12-gnu/Makefile	2019-11-20 12:29:45.000000000 -0500
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 5
 PATCHLEVEL = 3
-SUBLEVEL = 11
+SUBLEVEL = 12
 EXTRAVERSION = -gnu
 NAME = Bobtail Squid
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/mm/hugetlb_cgroup.c linux-libre-5.3.12-gnu/mm/hugetlb_cgroup.c
--- linux-libre-5.3.11-gnu/mm/hugetlb_cgroup.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/mm/hugetlb_cgroup.c	2019-11-20 10:49:17.000000000 -0500
@@ -196,7 +196,7 @@ int hugetlb_cgroup_charge_cgroup(int idx
 again:
 	rcu_read_lock();
 	h_cg = hugetlb_cgroup_from_task(current);
-	if (!css_tryget_online(&h_cg->css)) {
+	if (!css_tryget(&h_cg->css)) {
 		rcu_read_unlock();
 		goto again;
 	}
diff -druNp --no-dereference linux-libre-5.3.11-gnu/mm/memcontrol.c linux-libre-5.3.12-gnu/mm/memcontrol.c
--- linux-libre-5.3.11-gnu/mm/memcontrol.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/mm/memcontrol.c	2019-11-20 10:49:17.000000000 -0500
@@ -962,7 +962,7 @@ struct mem_cgroup *get_mem_cgroup_from_m
 			if (unlikely(!memcg))
 				memcg = root_mem_cgroup;
 		}
-	} while (!css_tryget_online(&memcg->css));
+	} while (!css_tryget(&memcg->css));
 	rcu_read_unlock();
 	return memcg;
 }
diff -druNp --no-dereference linux-libre-5.3.11-gnu/mm/memory_hotplug.c linux-libre-5.3.12-gnu/mm/memory_hotplug.c
--- linux-libre-5.3.11-gnu/mm/memory_hotplug.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/mm/memory_hotplug.c	2019-11-20 10:49:17.000000000 -0500
@@ -1687,6 +1687,18 @@ static int check_cpu_on_node(pg_data_t *
 	return 0;
 }
 
+static int check_no_memblock_for_node_cb(struct memory_block *mem, void *arg)
+{
+	int nid = *(int *)arg;
+
+	/*
+	 * If a memory block belongs to multiple nodes, the stored nid is not
+	 * reliable. However, such blocks are always online (e.g., cannot get
+	 * offlined) and, therefore, are still spanned by the node.
+	 */
+	return mem->nid == nid ? -EEXIST : 0;
+}
+
 /**
  * try_offline_node
  * @nid: the node ID
@@ -1699,25 +1711,24 @@ static int check_cpu_on_node(pg_data_t *
 void try_offline_node(int nid)
 {
 	pg_data_t *pgdat = NODE_DATA(nid);
-	unsigned long start_pfn = pgdat->node_start_pfn;
-	unsigned long end_pfn = start_pfn + pgdat->node_spanned_pages;
-	unsigned long pfn;
-
-	for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
-		unsigned long section_nr = pfn_to_section_nr(pfn);
-
-		if (!present_section_nr(section_nr))
-			continue;
+	int rc;
 
-		if (pfn_to_nid(pfn) != nid)
-			continue;
+	/*
+	 * If the node still spans pages (especially ZONE_DEVICE), don't
+	 * offline it. A node spans memory after move_pfn_range_to_zone(),
+	 * e.g., after the memory block was onlined.
+	 */
+	if (pgdat->node_spanned_pages)
+		return;
 
-		/*
-		 * some memory sections of this node are not removed, and we
-		 * can't offline node now.
-		 */
+	/*
+	 * Especially offline memory blocks might not be spanned by the
+	 * node. They will get spanned by the node once they get onlined.
+	 * However, they link to the node in sysfs and can get onlined later.
+	 */
+	rc = for_each_memory_block(&nid, check_no_memblock_for_node_cb);
+	if (rc)
 		return;
-	}
 
 	if (check_cpu_on_node(pgdat))
 		return;
diff -druNp --no-dereference linux-libre-5.3.11-gnu/mm/mempolicy.c linux-libre-5.3.12-gnu/mm/mempolicy.c
--- linux-libre-5.3.11-gnu/mm/mempolicy.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/mm/mempolicy.c	2019-11-20 10:49:17.000000000 -0500
@@ -666,7 +666,9 @@ static int queue_pages_test_walk(unsigne
  * 1 - there is unmovable page, but MPOL_MF_MOVE* & MPOL_MF_STRICT were
  *     specified.
  * 0 - queue pages successfully or no misplaced page.
- * -EIO - there is misplaced page and only MPOL_MF_STRICT was specified.
+ * errno - i.e. misplaced pages with MPOL_MF_STRICT specified (-EIO) or
+ *         memory range specified by nodemask and maxnode points outside
+ *         your accessible address space (-EFAULT)
  */
 static int
 queue_pages_range(struct mm_struct *mm, unsigned long start, unsigned long end,
@@ -1287,7 +1289,7 @@ static long do_mbind(unsigned long start
 			  flags | MPOL_MF_INVERT, &pagelist);
 
 	if (ret < 0) {
-		err = -EIO;
+		err = ret;
 		goto up_out;
 	}
 
@@ -1306,10 +1308,12 @@ static long do_mbind(unsigned long start
 
 		if ((ret > 0) || (nr_failed && (flags & MPOL_MF_STRICT)))
 			err = -EIO;
-	} else
-		putback_movable_pages(&pagelist);
-
+	} else {
 up_out:
+		if (!list_empty(&pagelist))
+			putback_movable_pages(&pagelist);
+	}
+
 	up_write(&mm->mmap_sem);
 mpol_out:
 	mpol_put(new);
diff -druNp --no-dereference linux-libre-5.3.11-gnu/mm/page_io.c linux-libre-5.3.12-gnu/mm/page_io.c
--- linux-libre-5.3.11-gnu/mm/page_io.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/mm/page_io.c	2019-11-20 10:49:17.000000000 -0500
@@ -73,6 +73,7 @@ static void swap_slot_free_notify(struct
 {
 	struct swap_info_struct *sis;
 	struct gendisk *disk;
+	swp_entry_t entry;
 
 	/*
 	 * There is no guarantee that the page is in swap cache - the software
@@ -104,11 +105,10 @@ static void swap_slot_free_notify(struct
 	 * we again wish to reclaim it.
 	 */
 	disk = sis->bdev->bd_disk;
-	if (disk->fops->swap_slot_free_notify) {
-		swp_entry_t entry;
+	entry.val = page_private(page);
+	if (disk->fops->swap_slot_free_notify && __swap_count(entry) == 1) {
 		unsigned long offset;
 
-		entry.val = page_private(page);
 		offset = swp_offset(entry);
 
 		SetPageDirty(page);
diff -druNp --no-dereference linux-libre-5.3.11-gnu/mm/slub.c linux-libre-5.3.12-gnu/mm/slub.c
--- linux-libre-5.3.11-gnu/mm/slub.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/mm/slub.c	2019-11-20 10:49:17.000000000 -0500
@@ -1432,12 +1432,15 @@ static inline bool slab_free_freelist_ho
 	void *old_tail = *tail ? *tail : *head;
 	int rsize;
 
-	if (slab_want_init_on_free(s)) {
-		void *p = NULL;
+	/* Head and tail of the reconstructed freelist */
+	*head = NULL;
+	*tail = NULL;
 
-		do {
-			object = next;
-			next = get_freepointer(s, object);
+	do {
+		object = next;
+		next = get_freepointer(s, object);
+
+		if (slab_want_init_on_free(s)) {
 			/*
 			 * Clear the object and the metadata, but don't touch
 			 * the redzone.
@@ -1447,29 +1450,8 @@ static inline bool slab_free_freelist_ho
 							   : 0;
 			memset((char *)object + s->inuse, 0,
 			       s->size - s->inuse - rsize);
-			set_freepointer(s, object, p);
-			p = object;
-		} while (object != old_tail);
-	}
 
-/*
- * Compiler cannot detect this function can be removed if slab_free_hook()
- * evaluates to nothing.  Thus, catch all relevant config debug options here.
- */
-#if defined(CONFIG_LOCKDEP)	||		\
-	defined(CONFIG_DEBUG_KMEMLEAK) ||	\
-	defined(CONFIG_DEBUG_OBJECTS_FREE) ||	\
-	defined(CONFIG_KASAN)
-
-	next = *head;
-
-	/* Head and tail of the reconstructed freelist */
-	*head = NULL;
-	*tail = NULL;
-
-	do {
-		object = next;
-		next = get_freepointer(s, object);
+		}
 		/* If object's reuse doesn't have to be delayed */
 		if (!slab_free_hook(s, object)) {
 			/* Move object to the new freelist */
@@ -1484,9 +1466,6 @@ static inline bool slab_free_freelist_ho
 		*tail = NULL;
 
 	return *head != NULL;
-#else
-	return true;
-#endif
 }
 
 static void *setup_object(struct kmem_cache *s, struct page *page,
diff -druNp --no-dereference linux-libre-5.3.11-gnu/net/core/devlink.c linux-libre-5.3.12-gnu/net/core/devlink.c
--- linux-libre-5.3.11-gnu/net/core/devlink.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/net/core/devlink.c	2019-11-20 10:49:17.000000000 -0500
@@ -2677,7 +2677,7 @@ static int devlink_nl_cmd_reload(struct
 	struct devlink *devlink = info->user_ptr[0];
 	int err;
 
-	if (!devlink->ops->reload)
+	if (!devlink->ops->reload || !devlink->reload_enabled)
 		return -EOPNOTSUPP;
 
 	err = devlink_resources_validate(devlink, NULL, info);
@@ -4577,6 +4577,7 @@ struct devlink_health_reporter {
 	bool auto_recover;
 	u8 health_state;
 	u64 dump_ts;
+	u64 dump_real_ts;
 	u64 error_count;
 	u64 recovery_count;
 	u64 last_recovery_ts;
@@ -4749,6 +4750,7 @@ static int devlink_health_do_dump(struct
 		goto dump_err;
 
 	reporter->dump_ts = jiffies;
+	reporter->dump_real_ts = ktime_get_real_ns();
 
 	return 0;
 
@@ -4911,6 +4913,10 @@ devlink_nl_health_reporter_fill(struct s
 			      jiffies_to_msecs(reporter->dump_ts),
 			      DEVLINK_ATTR_PAD))
 		goto reporter_nest_cancel;
+	if (reporter->dump_fmsg &&
+	    nla_put_u64_64bit(msg, DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS,
+			      reporter->dump_real_ts, DEVLINK_ATTR_PAD))
+		goto reporter_nest_cancel;
 
 	nla_nest_end(msg, reporter_attr);
 	genlmsg_end(msg, hdr);
@@ -5559,6 +5565,8 @@ EXPORT_SYMBOL_GPL(devlink_register);
 void devlink_unregister(struct devlink *devlink)
 {
 	mutex_lock(&devlink_mutex);
+	WARN_ON(devlink->ops->reload &&
+		devlink->reload_enabled);
 	devlink_notify(devlink, DEVLINK_CMD_DEL);
 	list_del(&devlink->list);
 	mutex_unlock(&devlink_mutex);
@@ -5566,6 +5574,41 @@ void devlink_unregister(struct devlink *
 EXPORT_SYMBOL_GPL(devlink_unregister);
 
 /**
+ *	devlink_reload_enable - Enable reload of devlink instance
+ *
+ *	@devlink: devlink
+ *
+ *	Should be called at end of device initialization
+ *	process when reload operation is supported.
+ */
+void devlink_reload_enable(struct devlink *devlink)
+{
+	mutex_lock(&devlink_mutex);
+	devlink->reload_enabled = true;
+	mutex_unlock(&devlink_mutex);
+}
+EXPORT_SYMBOL_GPL(devlink_reload_enable);
+
+/**
+ *	devlink_reload_disable - Disable reload of devlink instance
+ *
+ *	@devlink: devlink
+ *
+ *	Should be called at the beginning of device cleanup
+ *	process when reload operation is supported.
+ */
+void devlink_reload_disable(struct devlink *devlink)
+{
+	mutex_lock(&devlink_mutex);
+	/* Mutex is taken which ensures that no reload operation is in
+	 * progress while setting up forbidded flag.
+	 */
+	devlink->reload_enabled = false;
+	mutex_unlock(&devlink_mutex);
+}
+EXPORT_SYMBOL_GPL(devlink_reload_disable);
+
+/**
  *	devlink_free - Free devlink instance resources
  *
  *	@devlink: devlink
diff -druNp --no-dereference linux-libre-5.3.11-gnu/net/ipv4/ipmr.c linux-libre-5.3.12-gnu/net/ipv4/ipmr.c
--- linux-libre-5.3.11-gnu/net/ipv4/ipmr.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/net/ipv4/ipmr.c	2019-11-20 10:49:17.000000000 -0500
@@ -2289,7 +2289,8 @@ int ipmr_get_route(struct net *net, stru
 			rcu_read_unlock();
 			return -ENODEV;
 		}
-		skb2 = skb_clone(skb, GFP_ATOMIC);
+
+		skb2 = skb_realloc_headroom(skb, sizeof(struct iphdr));
 		if (!skb2) {
 			read_unlock(&mrt_lock);
 			rcu_read_unlock();
diff -druNp --no-dereference linux-libre-5.3.11-gnu/net/smc/af_smc.c linux-libre-5.3.12-gnu/net/smc/af_smc.c
--- linux-libre-5.3.11-gnu/net/smc/af_smc.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/net/smc/af_smc.c	2019-11-20 10:49:17.000000000 -0500
@@ -796,6 +796,7 @@ static void smc_connect_work(struct work
 			smc->sk.sk_err = EPIPE;
 		else if (signal_pending(current))
 			smc->sk.sk_err = -sock_intr_errno(timeo);
+		sock_put(&smc->sk); /* passive closing */
 		goto out;
 	}
 
@@ -1731,7 +1732,7 @@ static int smc_setsockopt(struct socket
 	case TCP_FASTOPEN_KEY:
 	case TCP_FASTOPEN_NO_COOKIE:
 		/* option not supported by SMC */
-		if (sk->sk_state == SMC_INIT) {
+		if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) {
 			smc_switch_to_fallback(smc);
 			smc->fallback_rsn = SMC_CLC_DECL_OPTUNSUPP;
 		} else {
diff -druNp --no-dereference linux-libre-5.3.11-gnu/sound/usb/endpoint.c linux-libre-5.3.12-gnu/sound/usb/endpoint.c
--- linux-libre-5.3.11-gnu/sound/usb/endpoint.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/sound/usb/endpoint.c	2019-11-20 10:49:17.000000000 -0500
@@ -388,6 +388,9 @@ static void snd_complete_urb(struct urb
 		}
 
 		prepare_outbound_urb(ep, ctx);
+		/* can be stopped during prepare callback */
+		if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags)))
+			goto exit_clear;
 	} else {
 		retire_inbound_urb(ep, ctx);
 		/* can be stopped during retire callback */
diff -druNp --no-dereference linux-libre-5.3.11-gnu/sound/usb/mixer.c linux-libre-5.3.12-gnu/sound/usb/mixer.c
--- linux-libre-5.3.11-gnu/sound/usb/mixer.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/sound/usb/mixer.c	2019-11-20 10:49:17.000000000 -0500
@@ -1229,7 +1229,8 @@ static int get_min_max_with_quirks(struc
 		if (cval->min + cval->res < cval->max) {
 			int last_valid_res = cval->res;
 			int saved, test, check;
-			get_cur_mix_raw(cval, minchn, &saved);
+			if (get_cur_mix_raw(cval, minchn, &saved) < 0)
+				goto no_res_check;
 			for (;;) {
 				test = saved;
 				if (test < cval->max)
@@ -1249,6 +1250,7 @@ static int get_min_max_with_quirks(struc
 			snd_usb_set_cur_mix_value(cval, minchn, 0, saved);
 		}
 
+no_res_check:
 		cval->initialized = 1;
 	}
 
diff -druNp --no-dereference linux-libre-5.3.11-gnu/sound/usb/quirks.c linux-libre-5.3.12-gnu/sound/usb/quirks.c
--- linux-libre-5.3.11-gnu/sound/usb/quirks.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/sound/usb/quirks.c	2019-11-20 10:49:17.000000000 -0500
@@ -248,8 +248,8 @@ static int create_yamaha_midi_quirk(stru
 					NULL, USB_MS_MIDI_OUT_JACK);
 	if (!injd && !outjd)
 		return -ENODEV;
-	if (!(injd && snd_usb_validate_midi_desc(injd)) ||
-	    !(outjd && snd_usb_validate_midi_desc(outjd)))
+	if ((injd && !snd_usb_validate_midi_desc(injd)) ||
+	    (outjd && !snd_usb_validate_midi_desc(outjd)))
 		return -ENODEV;
 	if (injd && (injd->bLength < 5 ||
 		     (injd->bJackType != USB_MS_EMBEDDED &&
diff -druNp --no-dereference linux-libre-5.3.11-gnu/sound/usb/validate.c linux-libre-5.3.12-gnu/sound/usb/validate.c
--- linux-libre-5.3.11-gnu/sound/usb/validate.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/sound/usb/validate.c	2019-11-20 10:49:17.000000000 -0500
@@ -81,9 +81,9 @@ static bool validate_processing_unit(con
 	switch (v->protocol) {
 	case UAC_VERSION_1:
 	default:
-		/* bNrChannels, wChannelConfig, iChannelNames, bControlSize */
-		len += 1 + 2 + 1 + 1;
-		if (d->bLength < len) /* bControlSize */
+		/* bNrChannels, wChannelConfig, iChannelNames */
+		len += 1 + 2 + 1;
+		if (d->bLength < len + 1) /* bControlSize */
 			return false;
 		m = hdr[len];
 		len += 1 + m + 1; /* bControlSize, bmControls, iProcessing */
diff -druNp --no-dereference linux-libre-5.3.11-gnu/virt/kvm/kvm_main.c linux-libre-5.3.12-gnu/virt/kvm/kvm_main.c
--- linux-libre-5.3.11-gnu/virt/kvm/kvm_main.c	2019-11-12 13:28:31.000000000 -0500
+++ linux-libre-5.3.12-gnu/virt/kvm/kvm_main.c	2019-11-20 10:49:17.000000000 -0500
@@ -150,10 +150,30 @@ __weak int kvm_arch_mmu_notifier_invalid
 	return 0;
 }
 
+bool kvm_is_zone_device_pfn(kvm_pfn_t pfn)
+{
+	/*
+	 * The metadata used by is_zone_device_page() to determine whether or
+	 * not a page is ZONE_DEVICE is guaranteed to be valid if and only if
+	 * the device has been pinned, e.g. by get_user_pages().  WARN if the
+	 * page_count() is zero to help detect bad usage of this helper.
+	 */
+	if (!pfn_valid(pfn) || WARN_ON_ONCE(!page_count(pfn_to_page(pfn))))
+		return false;
+
+	return is_zone_device_page(pfn_to_page(pfn));
+}
+
 bool kvm_is_reserved_pfn(kvm_pfn_t pfn)
 {
+	/*
+	 * ZONE_DEVICE pages currently set PG_reserved, but from a refcounting
+	 * perspective they are "normal" pages, albeit with slightly different
+	 * usage rules.
+	 */
 	if (pfn_valid(pfn))
-		return PageReserved(pfn_to_page(pfn));
+		return PageReserved(pfn_to_page(pfn)) &&
+		       !kvm_is_zone_device_pfn(pfn);
 
 	return true;
 }
@@ -1882,7 +1902,7 @@ EXPORT_SYMBOL_GPL(kvm_release_pfn_dirty)
 
 void kvm_set_pfn_dirty(kvm_pfn_t pfn)
 {
-	if (!kvm_is_reserved_pfn(pfn)) {
+	if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn)) {
 		struct page *page = pfn_to_page(pfn);
 
 		SetPageDirty(page);
@@ -1892,7 +1912,7 @@ EXPORT_SYMBOL_GPL(kvm_set_pfn_dirty);
 
 void kvm_set_pfn_accessed(kvm_pfn_t pfn)
 {
-	if (!kvm_is_reserved_pfn(pfn))
+	if (!kvm_is_reserved_pfn(pfn) && !kvm_is_zone_device_pfn(pfn))
 		mark_page_accessed(pfn_to_page(pfn));
 }
 EXPORT_SYMBOL_GPL(kvm_set_pfn_accessed);
