From c5b025725df322443a39842c13e04af2d53a45b9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 25 Sep 2022 09:40:20 +0200 Subject: [PATCH] 4.14-stable patches added patches: s390-dasd-fix-oops-in-dasd_alias_get_start_dev-due-to-missing-pavgroup.patch serial-create-uart_xmit_advance.patch serial-tegra-use-uart_xmit_advance-fixes-icount.tx-accounting.patch --- ...et_start_dev-due-to-missing-pavgroup.patch | 59 +++++++++++++++++++ .../serial-create-uart_xmit_advance.patch | 51 ++++++++++++++++ ...t_advance-fixes-icount.tx-accounting.patch | 53 +++++++++++++++++ queue-4.14/series | 3 + 4 files changed, 166 insertions(+) create mode 100644 queue-4.14/s390-dasd-fix-oops-in-dasd_alias_get_start_dev-due-to-missing-pavgroup.patch create mode 100644 queue-4.14/serial-create-uart_xmit_advance.patch create mode 100644 queue-4.14/serial-tegra-use-uart_xmit_advance-fixes-icount.tx-accounting.patch diff --git a/queue-4.14/s390-dasd-fix-oops-in-dasd_alias_get_start_dev-due-to-missing-pavgroup.patch b/queue-4.14/s390-dasd-fix-oops-in-dasd_alias_get_start_dev-due-to-missing-pavgroup.patch new file mode 100644 index 00000000000..750f0976079 --- /dev/null +++ b/queue-4.14/s390-dasd-fix-oops-in-dasd_alias_get_start_dev-due-to-missing-pavgroup.patch @@ -0,0 +1,59 @@ +From db7ba07108a48c0f95b74fabbfd5d63e924f992d Mon Sep 17 00:00:00 2001 +From: Stefan Haberland +Date: Mon, 19 Sep 2022 17:49:31 +0200 +Subject: s390/dasd: fix Oops in dasd_alias_get_start_dev due to missing pavgroup + +From: Stefan Haberland + +commit db7ba07108a48c0f95b74fabbfd5d63e924f992d upstream. + +Fix Oops in dasd_alias_get_start_dev() function caused by the pavgroup +pointer being NULL. + +The pavgroup pointer is checked on the entrance of the function but +without the lcu->lock being held. Therefore there is a race window +between dasd_alias_get_start_dev() and _lcu_update() which sets +pavgroup to NULL with the lcu->lock held. + +Fix by checking the pavgroup pointer with lcu->lock held. + +Cc: # 2.6.25+ +Fixes: 8e09f21574ea ("[S390] dasd: add hyper PAV support to DASD device driver, part 1") +Signed-off-by: Stefan Haberland +Reviewed-by: Jan Hoeppner +Link: https://lore.kernel.org/r/20220919154931.4123002-2-sth@linux.ibm.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + drivers/s390/block/dasd_alias.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +--- a/drivers/s390/block/dasd_alias.c ++++ b/drivers/s390/block/dasd_alias.c +@@ -675,12 +675,12 @@ int dasd_alias_remove_device(struct dasd + struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *base_device) + { + struct dasd_eckd_private *alias_priv, *private = base_device->private; +- struct alias_pav_group *group = private->pavgroup; + struct alias_lcu *lcu = private->lcu; + struct dasd_device *alias_device; ++ struct alias_pav_group *group; + unsigned long flags; + +- if (!group || !lcu) ++ if (!lcu) + return NULL; + if (lcu->pav == NO_PAV || + lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING)) +@@ -697,6 +697,11 @@ struct dasd_device *dasd_alias_get_start + } + + spin_lock_irqsave(&lcu->lock, flags); ++ group = private->pavgroup; ++ if (!group) { ++ spin_unlock_irqrestore(&lcu->lock, flags); ++ return NULL; ++ } + alias_device = group->next; + if (!alias_device) { + if (list_empty(&group->aliaslist)) { diff --git a/queue-4.14/serial-create-uart_xmit_advance.patch b/queue-4.14/serial-create-uart_xmit_advance.patch new file mode 100644 index 00000000000..fd45bdb63c6 --- /dev/null +++ b/queue-4.14/serial-create-uart_xmit_advance.patch @@ -0,0 +1,51 @@ +From e77cab77f2cb3a1ca2ba8df4af45bb35617ac16d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= +Date: Thu, 1 Sep 2022 17:39:32 +0300 +Subject: serial: Create uart_xmit_advance() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +commit e77cab77f2cb3a1ca2ba8df4af45bb35617ac16d upstream. + +A very common pattern in the drivers is to advance xmit tail +index and do bookkeeping of Tx'ed characters. Create +uart_xmit_advance() to handle it. + +Reviewed-by: Andy Shevchenko +Cc: stable +Signed-off-by: Ilpo Järvinen +Link: https://lore.kernel.org/r/20220901143934.8850-2-ilpo.jarvinen@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +--- + include/linux/serial_core.h | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +--- a/include/linux/serial_core.h ++++ b/include/linux/serial_core.h +@@ -298,6 +298,23 @@ struct uart_state { + /* number of characters left in xmit buffer before we ask for more */ + #define WAKEUP_CHARS 256 + ++/** ++ * uart_xmit_advance - Advance xmit buffer and account Tx'ed chars ++ * @up: uart_port structure describing the port ++ * @chars: number of characters sent ++ * ++ * This function advances the tail of circular xmit buffer by the number of ++ * @chars transmitted and handles accounting of transmitted bytes (into ++ * @up's icount.tx). ++ */ ++static inline void uart_xmit_advance(struct uart_port *up, unsigned int chars) ++{ ++ struct circ_buf *xmit = &up->state->xmit; ++ ++ xmit->tail = (xmit->tail + chars) & (UART_XMIT_SIZE - 1); ++ up->icount.tx += chars; ++} ++ + struct module; + struct tty_driver; + diff --git a/queue-4.14/serial-tegra-use-uart_xmit_advance-fixes-icount.tx-accounting.patch b/queue-4.14/serial-tegra-use-uart_xmit_advance-fixes-icount.tx-accounting.patch new file mode 100644 index 00000000000..c46407c4c88 --- /dev/null +++ b/queue-4.14/serial-tegra-use-uart_xmit_advance-fixes-icount.tx-accounting.patch @@ -0,0 +1,53 @@ +From 754f68044c7dd6c52534ba3e0f664830285c4b15 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= +Date: Thu, 1 Sep 2022 17:39:33 +0300 +Subject: serial: tegra: Use uart_xmit_advance(), fixes icount.tx accounting +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +commit 754f68044c7dd6c52534ba3e0f664830285c4b15 upstream. + +DMA complete & stop paths did not correctly account Tx'ed characters +into icount.tx. Using uart_xmit_advance() fixes the problem. + +Fixes: e9ea096dd225 ("serial: tegra: add serial driver") +Cc: # serial: Create uart_xmit_advance() +Reviewed-by: Andy Shevchenko +Signed-off-by: Ilpo Järvinen +Link: https://lore.kernel.org/r/20220901143934.8850-3-ilpo.jarvinen@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/serial-tegra.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/drivers/tty/serial/serial-tegra.c ++++ b/drivers/tty/serial/serial-tegra.c +@@ -409,7 +409,7 @@ static void tegra_uart_tx_dma_complete(v + count = tup->tx_bytes_requested - state.residue; + async_tx_ack(tup->tx_dma_desc); + spin_lock_irqsave(&tup->uport.lock, flags); +- xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1); ++ uart_xmit_advance(&tup->uport, count); + tup->tx_in_progress = 0; + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) + uart_write_wakeup(&tup->uport); +@@ -493,7 +493,6 @@ static unsigned int tegra_uart_tx_empty( + static void tegra_uart_stop_tx(struct uart_port *u) + { + struct tegra_uart_port *tup = to_tegra_uport(u); +- struct circ_buf *xmit = &tup->uport.state->xmit; + struct dma_tx_state state; + unsigned int count; + +@@ -504,7 +503,7 @@ static void tegra_uart_stop_tx(struct ua + dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state); + count = tup->tx_bytes_requested - state.residue; + async_tx_ack(tup->tx_dma_desc); +- xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1); ++ uart_xmit_advance(&tup->uport, count); + tup->tx_in_progress = 0; + } + diff --git a/queue-4.14/series b/queue-4.14/series index 3da7bcb36b0..8efa28c5510 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -32,3 +32,6 @@ netfilter-ebtables-fix-memory-leak-when-blob-is-malf.patch can-gs_usb-gs_can_open-fix-race-dev-can.state-condit.patch perf-kcore_copy-do-not-check-proc-modules-is-unchang.patch net-sunhme-fix-packet-reception-for-len-rx_copy_thre.patch +serial-create-uart_xmit_advance.patch +serial-tegra-use-uart_xmit_advance-fixes-icount.tx-accounting.patch +s390-dasd-fix-oops-in-dasd_alias_get_start_dev-due-to-missing-pavgroup.patch -- 2.47.3