diff --git linux-libre-4.9.253-gnu/Makefile linux-libre-4.9.254-gnu/Makefile
index 459bb1545dce..870d7a5d18fb 100644
--- linux-libre-4.9.253-gnu/Makefile
+++ linux-libre-4.9.254-gnu/Makefile
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 9
-SUBLEVEL = 253
+SUBLEVEL = 254
 EXTRAVERSION = -gnu
 NAME = Roaring Lionus
 
diff --git linux-libre-4.9.253-gnu/arch/sh/drivers/dma/Kconfig linux-libre-4.9.254-gnu/arch/sh/drivers/dma/Kconfig
index 78bc97b1d027..ac834e9e0e0a 100644
--- linux-libre-4.9.253-gnu/arch/sh/drivers/dma/Kconfig
+++ linux-libre-4.9.254-gnu/arch/sh/drivers/dma/Kconfig
@@ -62,8 +62,7 @@ config PVR2_DMA
 
 config G2_DMA
 	tristate "G2 Bus DMA support"
-	depends on SH_DREAMCAST
-	select SH_DMA_API
+	depends on SH_DREAMCAST && SH_DMA_API
 	help
 	  This enables support for the DMA controller for the Dreamcast's
 	  G2 bus. Drivers that want this will generally enable this on
diff --git linux-libre-4.9.253-gnu/arch/x86/boot/compressed/Makefile linux-libre-4.9.254-gnu/arch/x86/boot/compressed/Makefile
index 89b163351e64..7be7acd6a540 100644
--- linux-libre-4.9.253-gnu/arch/x86/boot/compressed/Makefile
+++ linux-libre-4.9.254-gnu/arch/x86/boot/compressed/Makefile
@@ -35,6 +35,8 @@ KBUILD_CFLAGS += -mno-mmx -mno-sse
 KBUILD_CFLAGS += $(call cc-option,-ffreestanding)
 KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
 KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
+# Disable relocation relaxation in case the link is not PIE.
+KBUILD_CFLAGS += $(call as-option,-Wa$(comma)-mrelax-relocations=no)
 
 KBUILD_AFLAGS  := $(KBUILD_CFLAGS) -D__ASSEMBLY__
 GCOV_PROFILE := n
diff --git linux-libre-4.9.253-gnu/drivers/acpi/scan.c linux-libre-4.9.254-gnu/drivers/acpi/scan.c
index f49e2b7880ac..5aa4a01f698f 100644
--- linux-libre-4.9.253-gnu/drivers/acpi/scan.c
+++ linux-libre-4.9.254-gnu/drivers/acpi/scan.c
@@ -585,6 +585,8 @@ static int acpi_get_device_data(acpi_handle handle, struct acpi_device **device,
 	if (!device)
 		return -EINVAL;
 
+	*device = NULL;
+
 	status = acpi_get_data_full(handle, acpi_scan_drop_device,
 				    (void **)device, callback);
 	if (ACPI_FAILURE(status) || !*device) {
diff --git linux-libre-4.9.253-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c linux-libre-4.9.254-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c
index 7deb81b6dbac..4b571cc6bc70 100644
--- linux-libre-4.9.253-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c
+++ linux-libre-4.9.254-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c
@@ -75,7 +75,7 @@ shadow_image(struct nvkm_bios *bios, int idx, u32 offset, struct shadow *mthd)
 	nvkm_debug(subdev, "%08x: type %02x, %d bytes\n",
 		   image.base, image.type, image.size);
 
-	if (!shadow_fetch(bios, mthd, image.size)) {
+	if (!shadow_fetch(bios, mthd, image.base + image.size)) {
 		nvkm_debug(subdev, "%08x: fetch failed\n", image.base);
 		return 0;
 	}
diff --git linux-libre-4.9.253-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c linux-libre-4.9.254-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c
index a5783f4d972e..c49795e779be 100644
--- linux-libre-4.9.253-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c
+++ linux-libre-4.9.254-gnu/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c
@@ -33,7 +33,7 @@ static void
 gm200_i2c_aux_fini(struct gm200_i2c_aux *aux)
 {
 	struct nvkm_device *device = aux->base.pad->i2c->subdev.device;
-	nvkm_mask(device, 0x00d954 + (aux->ch * 0x50), 0x00310000, 0x00000000);
+	nvkm_mask(device, 0x00d954 + (aux->ch * 0x50), 0x00710000, 0x00000000);
 }
 
 static int
@@ -54,10 +54,10 @@ gm200_i2c_aux_init(struct gm200_i2c_aux *aux)
 			AUX_ERR(&aux->base, "begin idle timeout %08x", ctrl);
 			return -EBUSY;
 		}
-	} while (ctrl & 0x03010000);
+	} while (ctrl & 0x07010000);
 
 	/* set some magic, and wait up to 1ms for it to appear */
-	nvkm_mask(device, 0x00d954 + (aux->ch * 0x50), 0x00300000, ureq);
+	nvkm_mask(device, 0x00d954 + (aux->ch * 0x50), 0x00700000, ureq);
 	timeout = 1000;
 	do {
 		ctrl = nvkm_rd32(device, 0x00d954 + (aux->ch * 0x50));
@@ -67,7 +67,7 @@ gm200_i2c_aux_init(struct gm200_i2c_aux *aux)
 			gm200_i2c_aux_fini(aux);
 			return -EBUSY;
 		}
-	} while ((ctrl & 0x03000000) != urep);
+	} while ((ctrl & 0x07000000) != urep);
 
 	return 0;
 }
diff --git linux-libre-4.9.253-gnu/drivers/hwtracing/stm/heartbeat.c linux-libre-4.9.254-gnu/drivers/hwtracing/stm/heartbeat.c
index 3da7b673aab2..3957ce678265 100644
--- linux-libre-4.9.253-gnu/drivers/hwtracing/stm/heartbeat.c
+++ linux-libre-4.9.254-gnu/drivers/hwtracing/stm/heartbeat.c
@@ -72,7 +72,7 @@ static void stm_heartbeat_unlink(struct stm_source_data *data)
 
 static int stm_heartbeat_init(void)
 {
-	int i, ret = -ENOMEM;
+	int i, ret;
 
 	if (nr_devs < 0 || nr_devs > STM_HEARTBEAT_MAX)
 		return -EINVAL;
@@ -80,8 +80,10 @@ static int stm_heartbeat_init(void)
 	for (i = 0; i < nr_devs; i++) {
 		stm_heartbeat[i].data.name =
 			kasprintf(GFP_KERNEL, "heartbeat.%d", i);
-		if (!stm_heartbeat[i].data.name)
+		if (!stm_heartbeat[i].data.name) {
+			ret = -ENOMEM;
 			goto fail_unregister;
+		}
 
 		stm_heartbeat[i].data.nr_chans	= 1;
 		stm_heartbeat[i].data.link		= stm_heartbeat_link;
diff --git linux-libre-4.9.253-gnu/drivers/i2c/busses/i2c-octeon-core.c linux-libre-4.9.254-gnu/drivers/i2c/busses/i2c-octeon-core.c
index 5e63b17f935d..e5ad3f9cd372 100644
--- linux-libre-4.9.253-gnu/drivers/i2c/busses/i2c-octeon-core.c
+++ linux-libre-4.9.254-gnu/drivers/i2c/busses/i2c-octeon-core.c
@@ -383,7 +383,7 @@ static int octeon_i2c_read(struct octeon_i2c *i2c, int target,
 
 		data[i] = octeon_i2c_data_read(i2c);
 		if (recv_len && i == 0) {
-			if (data[i] > I2C_SMBUS_BLOCK_MAX + 1)
+			if (data[i] > I2C_SMBUS_BLOCK_MAX)
 				return -EPROTO;
 			length += data[i];
 		}
diff --git linux-libre-4.9.253-gnu/drivers/iio/dac/ad5504.c linux-libre-4.9.254-gnu/drivers/iio/dac/ad5504.c
index 788b3d6fd1cc..b15a02f502df 100644
--- linux-libre-4.9.253-gnu/drivers/iio/dac/ad5504.c
+++ linux-libre-4.9.254-gnu/drivers/iio/dac/ad5504.c
@@ -189,9 +189,9 @@ static ssize_t ad5504_write_dac_powerdown(struct iio_dev *indio_dev,
 		return ret;
 
 	if (pwr_down)
-		st->pwr_down_mask |= (1 << chan->channel);
-	else
 		st->pwr_down_mask &= ~(1 << chan->channel);
+	else
+		st->pwr_down_mask |= (1 << chan->channel);
 
 	ret = ad5504_spi_write(st, AD5504_ADDR_CTRL,
 				AD5504_DAC_PWRDWN_MODE(st->pwr_down_mode) |
diff --git linux-libre-4.9.253-gnu/drivers/md/dm-table.c linux-libre-4.9.254-gnu/drivers/md/dm-table.c
index 62e3dc19b609..5d120c3cee57 100644
--- linux-libre-4.9.253-gnu/drivers/md/dm-table.c
+++ linux-libre-4.9.254-gnu/drivers/md/dm-table.c
@@ -396,14 +396,23 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
 {
 	int r;
 	dev_t dev;
+	unsigned int major, minor;
+	char dummy;
 	struct dm_dev_internal *dd;
 	struct dm_table *t = ti->table;
 
 	BUG_ON(!t);
 
-	dev = dm_get_dev_t(path);
-	if (!dev)
-		return -ENODEV;
+	if (sscanf(path, "%u:%u%c", &major, &minor, &dummy) == 2) {
+		/* Extract the major/minor numbers */
+		dev = MKDEV(major, minor);
+		if (MAJOR(dev) != major || MINOR(dev) != minor)
+			return -EOVERFLOW;
+	} else {
+		dev = dm_get_dev_t(path);
+		if (!dev)
+			return -ENODEV;
+	}
 
 	dd = find_device(&t->devices, dev);
 	if (!dd) {
diff --git linux-libre-4.9.253-gnu/drivers/net/can/dev.c linux-libre-4.9.254-gnu/drivers/net/can/dev.c
index c7508d9a4c6f..164078609f98 100644
--- linux-libre-4.9.253-gnu/drivers/net/can/dev.c
+++ linux-libre-4.9.254-gnu/drivers/net/can/dev.c
@@ -555,11 +555,11 @@ static void can_restart(struct net_device *dev)
 	}
 	cf->can_id |= CAN_ERR_RESTARTED;
 
-	netif_rx_ni(skb);
-
 	stats->rx_packets++;
 	stats->rx_bytes += cf->can_dlc;
 
+	netif_rx_ni(skb);
+
 restart:
 	netdev_dbg(dev, "restarted\n");
 	priv->can_stats.restarts++;
diff --git linux-libre-4.9.253-gnu/drivers/net/dsa/b53/b53_common.c linux-libre-4.9.254-gnu/drivers/net/dsa/b53/b53_common.c
index c387be5c926b..5ec0042bc384 100644
--- linux-libre-4.9.253-gnu/drivers/net/dsa/b53/b53_common.c
+++ linux-libre-4.9.254-gnu/drivers/net/dsa/b53/b53_common.c
@@ -946,7 +946,7 @@ static int b53_vlan_prepare(struct dsa_switch *ds, int port,
 	if ((is5325(dev) || is5365(dev)) && vlan->vid_begin == 0)
 		return -EOPNOTSUPP;
 
-	if (vlan->vid_end > dev->num_vlans)
+	if (vlan->vid_end >= dev->num_vlans)
 		return -ERANGE;
 
 	b53_enable_vlan(dev, true);
diff --git linux-libre-4.9.253-gnu/drivers/net/ethernet/renesas/sh_eth.c linux-libre-4.9.254-gnu/drivers/net/ethernet/renesas/sh_eth.c
index 6f8d4810ce97..7458b1a70e5d 100644
--- linux-libre-4.9.253-gnu/drivers/net/ethernet/renesas/sh_eth.c
+++ linux-libre-4.9.254-gnu/drivers/net/ethernet/renesas/sh_eth.c
@@ -2411,10 +2411,10 @@ static int sh_eth_close(struct net_device *ndev)
 	/* Free all the skbuffs in the Rx queue and the DMA buffer. */
 	sh_eth_ring_free(ndev);
 
-	pm_runtime_put_sync(&mdp->pdev->dev);
-
 	mdp->is_opened = 0;
 
+	pm_runtime_put(&mdp->pdev->dev);
+
 	return 0;
 }
 
diff --git linux-libre-4.9.253-gnu/drivers/scsi/ufs/ufshcd.c linux-libre-4.9.254-gnu/drivers/scsi/ufs/ufshcd.c
index ad80e4223c2d..a767d942bfca 100644
--- linux-libre-4.9.253-gnu/drivers/scsi/ufs/ufshcd.c
+++ linux-libre-4.9.254-gnu/drivers/scsi/ufs/ufshcd.c
@@ -4552,19 +4552,16 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
 {
 	struct Scsi_Host *host;
 	struct ufs_hba *hba;
-	unsigned int tag;
 	u32 pos;
 	int err;
-	u8 resp = 0xF;
-	struct ufshcd_lrb *lrbp;
+	u8 resp = 0xF, lun;
 	unsigned long flags;
 
 	host = cmd->device->host;
 	hba = shost_priv(host);
-	tag = cmd->request->tag;
 
-	lrbp = &hba->lrb[tag];
-	err = ufshcd_issue_tm_cmd(hba, lrbp->lun, 0, UFS_LOGICAL_RESET, &resp);
+	lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun);
+	err = ufshcd_issue_tm_cmd(hba, lun, 0, UFS_LOGICAL_RESET, &resp);
 	if (err || resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) {
 		if (!err)
 			err = resp;
@@ -4573,7 +4570,7 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
 
 	/* clear the commands that were pending for corresponding LUN */
 	for_each_set_bit(pos, &hba->outstanding_reqs, hba->nutrs) {
-		if (hba->lrb[pos].lun == lrbp->lun) {
+		if (hba->lrb[pos].lun == lun) {
 			err = ufshcd_clear_cmd(hba, pos);
 			if (err)
 				break;
diff --git linux-libre-4.9.253-gnu/drivers/usb/gadget/udc/bdc/Kconfig linux-libre-4.9.254-gnu/drivers/usb/gadget/udc/bdc/Kconfig
index 0d7b8c9f72fd..778df4badf88 100644
--- linux-libre-4.9.253-gnu/drivers/usb/gadget/udc/bdc/Kconfig
+++ linux-libre-4.9.254-gnu/drivers/usb/gadget/udc/bdc/Kconfig
@@ -14,7 +14,7 @@ if USB_BDC_UDC
 comment "Platform Support"
 config	USB_BDC_PCI
 	tristate "BDC support for PCIe based platforms"
-	depends on PCI
+	depends on PCI && BROKEN
 	default USB_BDC_UDC
 	help
 		Enable support for platforms which have BDC connected through PCIe, such as Lego3 FPGA platform.
diff --git linux-libre-4.9.253-gnu/drivers/usb/gadget/udc/core.c linux-libre-4.9.254-gnu/drivers/usb/gadget/udc/core.c
index 99c7cf4822c3..34ad964d54d1 100644
--- linux-libre-4.9.253-gnu/drivers/usb/gadget/udc/core.c
+++ linux-libre-4.9.254-gnu/drivers/usb/gadget/udc/core.c
@@ -1424,10 +1424,13 @@ static ssize_t usb_udc_softconn_store(struct device *dev,
 		struct device_attribute *attr, const char *buf, size_t n)
 {
 	struct usb_udc		*udc = container_of(dev, struct usb_udc, dev);
+	ssize_t			ret;
 
+	mutex_lock(&udc_lock);
 	if (!udc->driver) {
 		dev_err(dev, "soft-connect without a gadget driver\n");
-		return -EOPNOTSUPP;
+		ret = -EOPNOTSUPP;
+		goto out;
 	}
 
 	if (sysfs_streq(buf, "connect")) {
@@ -1439,10 +1442,14 @@ static ssize_t usb_udc_softconn_store(struct device *dev,
 		usb_gadget_udc_stop(udc);
 	} else {
 		dev_err(dev, "unsupported command '%s'\n", buf);
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out;
 	}
 
-	return n;
+	ret = n;
+out:
+	mutex_unlock(&udc_lock);
+	return ret;
 }
 static DEVICE_ATTR(soft_connect, S_IWUSR, NULL, usb_udc_softconn_store);
 
diff --git linux-libre-4.9.253-gnu/drivers/usb/host/ehci-hcd.c linux-libre-4.9.254-gnu/drivers/usb/host/ehci-hcd.c
index b3d6cc1a8021..52c4176afae9 100644
--- linux-libre-4.9.253-gnu/drivers/usb/host/ehci-hcd.c
+++ linux-libre-4.9.254-gnu/drivers/usb/host/ehci-hcd.c
@@ -587,6 +587,7 @@ static int ehci_run (struct usb_hcd *hcd)
 	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
 	u32			temp;
 	u32			hcc_params;
+	int			rc;
 
 	hcd->uses_new_polling = 1;
 
@@ -642,9 +643,20 @@ static int ehci_run (struct usb_hcd *hcd)
 	down_write(&ehci_cf_port_reset_rwsem);
 	ehci->rh_state = EHCI_RH_RUNNING;
 	ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag);
+
+	/* Wait until HC become operational */
 	ehci_readl(ehci, &ehci->regs->command);	/* unblock posted writes */
 	msleep(5);
+	rc = ehci_handshake(ehci, &ehci->regs->status, STS_HALT, 0, 100 * 1000);
+
 	up_write(&ehci_cf_port_reset_rwsem);
+
+	if (rc) {
+		ehci_err(ehci, "USB %x.%x, controller refused to start: %d\n",
+			 ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), rc);
+		return rc;
+	}
+
 	ehci->last_periodic_enable = ktime_get_real();
 
 	temp = HC_VERSION(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase));
diff --git linux-libre-4.9.253-gnu/drivers/usb/host/ehci-hub.c linux-libre-4.9.254-gnu/drivers/usb/host/ehci-hub.c
index 3a3926ff7b85..643c427bb277 100644
--- linux-libre-4.9.253-gnu/drivers/usb/host/ehci-hub.c
+++ linux-libre-4.9.254-gnu/drivers/usb/host/ehci-hub.c
@@ -350,6 +350,9 @@ static int ehci_bus_suspend (struct usb_hcd *hcd)
 
 	unlink_empty_async_suspended(ehci);
 
+	/* Some Synopsys controllers mistakenly leave IAA turned on */
+	ehci_writel(ehci, STS_IAA, &ehci->regs->status);
+
 	/* Any IAA cycle that started before the suspend is now invalid */
 	end_iaa_cycle(ehci);
 	ehci_handle_start_intr_unlinks(ehci);
diff --git linux-libre-4.9.253-gnu/drivers/usb/host/xhci-ring.c linux-libre-4.9.254-gnu/drivers/usb/host/xhci-ring.c
index 1468dca77fac..6e1d65fda97e 100644
--- linux-libre-4.9.253-gnu/drivers/usb/host/xhci-ring.c
+++ linux-libre-4.9.254-gnu/drivers/usb/host/xhci-ring.c
@@ -2851,6 +2851,8 @@ static void queue_trb(struct xhci_hcd *xhci, struct xhci_ring *ring,
 	trb->field[0] = cpu_to_le32(field1);
 	trb->field[1] = cpu_to_le32(field2);
 	trb->field[2] = cpu_to_le32(field3);
+	/* make sure TRB is fully written before giving it to the controller */
+	wmb();
 	trb->field[3] = cpu_to_le32(field4);
 	inc_enq(xhci, ring, more_trbs_coming);
 }
diff --git linux-libre-4.9.253-gnu/drivers/usb/host/xhci-tegra.c linux-libre-4.9.254-gnu/drivers/usb/host/xhci-tegra.c
index 2c762f9dce7a..3cb800cb4ecb 100644
--- linux-libre-4.9.253-gnu/drivers/usb/host/xhci-tegra.c
+++ linux-libre-4.9.254-gnu/drivers/usb/host/xhci-tegra.c
@@ -579,6 +579,13 @@ static void tegra_xusb_mbox_handle(struct tegra_xusb *tegra,
 								     enable);
 			if (err < 0)
 				break;
+
+			/*
+			 * wait 500us for LFPS detector to be disabled before
+			 * sending ACK
+			 */
+			if (!enable)
+				usleep_range(500, 1000);
 		}
 
 		if (err < 0) {
diff --git linux-libre-4.9.253-gnu/include/linux/compiler-gcc.h linux-libre-4.9.254-gnu/include/linux/compiler-gcc.h
index 61650c1830d4..d830eddacdc6 100644
--- linux-libre-4.9.253-gnu/include/linux/compiler-gcc.h
+++ linux-libre-4.9.254-gnu/include/linux/compiler-gcc.h
@@ -149,6 +149,12 @@
 
 #if GCC_VERSION < 30200
 # error Sorry, your compiler is too old - please upgrade it.
+#elif defined(CONFIG_ARM64) && GCC_VERSION < 50100 && !defined(__clang__)
+/*
+ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293
+ * https://lore.kernel.org/r/20210107111841.GN1551@shell.armlinux.org.uk
+ */
+# error Sorry, your version of GCC is too old - please use 5.1 or newer.
 #endif
 
 #if GCC_VERSION < 30300
diff --git linux-libre-4.9.253-gnu/kernel/bpf/verifier.c linux-libre-4.9.254-gnu/kernel/bpf/verifier.c
index 335c00209f74..78bdfbefd996 100644
--- linux-libre-4.9.253-gnu/kernel/bpf/verifier.c
+++ linux-libre-4.9.254-gnu/kernel/bpf/verifier.c
@@ -1732,12 +1732,11 @@ static void adjust_reg_min_max_vals(struct bpf_verifier_env *env,
 		 * unsigned shift, so make the appropriate casts.
 		 */
 		if (min_val < 0 || dst_reg->min_value < 0)
-			dst_reg->min_value = BPF_REGISTER_MIN_RANGE;
+			reset_reg_range_values(regs, insn->dst_reg);
 		else
-			dst_reg->min_value =
-				(u64)(dst_reg->min_value) >> min_val;
+			dst_reg->min_value = (u64)(dst_reg->min_value) >> max_val;
 		if (dst_reg->max_value != BPF_REGISTER_MAX_RANGE)
-			dst_reg->max_value >>= max_val;
+			dst_reg->max_value >>= min_val;
 		break;
 	default:
 		reset_reg_range_values(regs, insn->dst_reg);
diff --git linux-libre-4.9.253-gnu/kernel/trace/ring_buffer.c linux-libre-4.9.254-gnu/kernel/trace/ring_buffer.c
index 55f60d2edc3f..4ec8bf634f89 100644
--- linux-libre-4.9.253-gnu/kernel/trace/ring_buffer.c
+++ linux-libre-4.9.254-gnu/kernel/trace/ring_buffer.c
@@ -4289,6 +4289,8 @@ void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu)
 
 	if (!cpumask_test_cpu(cpu, buffer->cpumask))
 		return;
+	/* prevent another thread from changing buffer sizes */
+	mutex_lock(&buffer->mutex);
 
 	atomic_inc(&buffer->resize_disabled);
 	atomic_inc(&cpu_buffer->record_disabled);
@@ -4312,6 +4314,8 @@ void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu)
 
 	atomic_dec(&cpu_buffer->record_disabled);
 	atomic_dec(&buffer->resize_disabled);
+
+	mutex_unlock(&buffer->mutex);
 }
 EXPORT_SYMBOL_GPL(ring_buffer_reset_cpu);
 
diff --git linux-libre-4.9.253-gnu/mm/slub.c linux-libre-4.9.254-gnu/mm/slub.c
index 7ccfc043c28e..5c48a8a0524a 100644
--- linux-libre-4.9.253-gnu/mm/slub.c
+++ linux-libre-4.9.254-gnu/mm/slub.c
@@ -5648,10 +5648,8 @@ static int sysfs_slab_add(struct kmem_cache *s)
 
 	s->kobj.kset = cache_kset(s);
 	err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name);
-	if (err) {
-		kobject_put(&s->kobj);
+	if (err)
 		goto out;
-	}
 
 	err = sysfs_create_group(&s->kobj, &slab_attr_group);
 	if (err)
diff --git linux-libre-4.9.253-gnu/net/core/skbuff.c linux-libre-4.9.254-gnu/net/core/skbuff.c
index 5582a4ed7c2f..79034fb861b5 100644
--- linux-libre-4.9.253-gnu/net/core/skbuff.c
+++ linux-libre-4.9.254-gnu/net/core/skbuff.c
@@ -428,7 +428,11 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int len,
 
 	len += NET_SKB_PAD;
 
-	if ((len > SKB_WITH_OVERHEAD(PAGE_SIZE)) ||
+	/* If requested length is either too small or too big,
+	 * we use kmalloc() for skb->head allocation.
+	 */
+	if (len <= SKB_WITH_OVERHEAD(1024) ||
+	    len > SKB_WITH_OVERHEAD(PAGE_SIZE) ||
 	    (gfp_mask & (__GFP_DIRECT_RECLAIM | GFP_DMA))) {
 		skb = __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE);
 		if (!skb)
diff --git linux-libre-4.9.253-gnu/net/ipv4/netfilter/ipt_rpfilter.c linux-libre-4.9.254-gnu/net/ipv4/netfilter/ipt_rpfilter.c
index 78cc64eddfc1..32a363465e0a 100644
--- linux-libre-4.9.253-gnu/net/ipv4/netfilter/ipt_rpfilter.c
+++ linux-libre-4.9.254-gnu/net/ipv4/netfilter/ipt_rpfilter.c
@@ -92,7 +92,7 @@ static bool rpfilter_mt(const struct sk_buff *skb, struct xt_action_param *par)
 	flow.saddr = rpfilter_get_saddr(iph->daddr);
 	flow.flowi4_oif = 0;
 	flow.flowi4_mark = info->flags & XT_RPFILTER_VALID_MARK ? skb->mark : 0;
-	flow.flowi4_tos = RT_TOS(iph->tos);
+	flow.flowi4_tos = iph->tos & IPTOS_RT_MASK;
 	flow.flowi4_scope = RT_SCOPE_UNIVERSE;
 
 	return rpfilter_lookup_reverse(par->net, &flow, par->in, info->flags) ^ invert;
diff --git linux-libre-4.9.253-gnu/net/ipv6/addrconf.c linux-libre-4.9.254-gnu/net/ipv6/addrconf.c
index a4c00242a90b..6119ab33a56e 100644
--- linux-libre-4.9.253-gnu/net/ipv6/addrconf.c
+++ linux-libre-4.9.254-gnu/net/ipv6/addrconf.c
@@ -2285,6 +2285,7 @@ static void addrconf_add_mroute(struct net_device *dev)
 		.fc_dst_len = 8,
 		.fc_flags = RTF_UP,
 		.fc_nlinfo.nl_net = dev_net(dev),
+		.fc_protocol = RTPROT_KERNEL,
 	};
 
 	ipv6_addr_set(&cfg.fc_dst, htonl(0xFF000000), 0, 0, 0);
diff --git linux-libre-4.9.253-gnu/net/sched/cls_tcindex.c linux-libre-4.9.254-gnu/net/sched/cls_tcindex.c
index ab66e2b38e66..70ee78d8f8fb 100644
--- linux-libre-4.9.253-gnu/net/sched/cls_tcindex.c
+++ linux-libre-4.9.254-gnu/net/sched/cls_tcindex.c
@@ -307,9 +307,13 @@ tcindex_set_parms(struct net *net, struct tcf_proto *tp, unsigned long base,
 	if (tb[TCA_TCINDEX_MASK])
 		cp->mask = nla_get_u16(tb[TCA_TCINDEX_MASK]);
 
-	if (tb[TCA_TCINDEX_SHIFT])
+	if (tb[TCA_TCINDEX_SHIFT]) {
 		cp->shift = nla_get_u32(tb[TCA_TCINDEX_SHIFT]);
-
+		if (cp->shift > 16) {
+			err = -EINVAL;
+			goto errout;
+		}
+	}
 	if (!cp->hash) {
 		/* Hash not specified, use perfect hash if the upper limit
 		 * of the hashing index is below the threshold.
diff --git linux-libre-4.9.253-gnu/sound/core/seq/oss/seq_oss_synth.c linux-libre-4.9.254-gnu/sound/core/seq/oss/seq_oss_synth.c
index c93945917235..247b68790a52 100644
--- linux-libre-4.9.253-gnu/sound/core/seq/oss/seq_oss_synth.c
+++ linux-libre-4.9.254-gnu/sound/core/seq/oss/seq_oss_synth.c
@@ -624,7 +624,8 @@ snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_in
 
 	if (info->is_midi) {
 		struct midi_info minf;
-		snd_seq_oss_midi_make_info(dp, info->midi_mapped, &minf);
+		if (snd_seq_oss_midi_make_info(dp, info->midi_mapped, &minf))
+			return -ENXIO;
 		inf->synth_type = SYNTH_TYPE_MIDI;
 		inf->synth_subtype = 0;
 		inf->nr_voices = 16;
diff --git linux-libre-4.9.253-gnu/sound/pci/hda/patch_via.c linux-libre-4.9.254-gnu/sound/pci/hda/patch_via.c
index fc30d1e8aa76..9dd104c308e1 100644
--- linux-libre-4.9.253-gnu/sound/pci/hda/patch_via.c
+++ linux-libre-4.9.254-gnu/sound/pci/hda/patch_via.c
@@ -135,6 +135,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec)
 		spec->codec_type = VT1708S;
 	spec->gen.indep_hp = 1;
 	spec->gen.keep_eapd_on = 1;
+	spec->gen.dac_min_mute = 1;
 	spec->gen.pcm_playback_hook = via_playback_pcm_hook;
 	spec->gen.add_stereo_mix_input = HDA_HINT_STEREO_MIX_AUTO;
 	codec->power_save_node = 1;
diff --git linux-libre-4.9.253-gnu/sound/soc/intel/boards/haswell.c linux-libre-4.9.254-gnu/sound/soc/intel/boards/haswell.c
index 11d0cc2b0e39..060da9577041 100644
--- linux-libre-4.9.253-gnu/sound/soc/intel/boards/haswell.c
+++ linux-libre-4.9.254-gnu/sound/soc/intel/boards/haswell.c
@@ -197,6 +197,7 @@ static struct platform_driver haswell_audio = {
 	.probe = haswell_audio_probe,
 	.driver = {
 		.name = "haswell-audio",
+		.pm = &snd_soc_pm_ops,
 	},
 };
 
