From patchwork Thu Jan 12 18:04:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 13098571 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4B890C54EBE for ; Thu, 12 Jan 2023 18:09:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=c0VhQfukdjui2peuqFmnl5llNgBdZ8Drm9VLJ9mCr+o=; b=DtTOYHShf2b3ky g4FZ/lG+ATNkmBxWBFXMxAqMjP/nrv9gl5FQ4QyXNh5qMIx1qozo6q6CbWNUDWRyBRfFEu4rkLlBf u2SR51nJZC7V3bBqdTbTcCY7ShGpbrl9zkQRXX/7zA90HbvFm7mLpUZJrIfeTy66pn3klwxsEwUyd ejIhGaHfk3+67rSvH+yHd85CHyyx3e6WoAVqcZvpqm4Y+LuXxZfcdfbfU5httpHo/Enu7+tQ5+e4M RTxR5mpodeG1utryKNlCmAUzqWjPRuyEJSvrvxHsRmt8qobaBISReniphVzqe+xSju1PHJcfRWvmn vIhd0+YGb+9GEliNLCIQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pG1zY-00GDh2-JK; Thu, 12 Jan 2023 18:07:57 +0000 Received: from phobos.denx.de ([2a01:238:438b:c500:173d:9f52:ddab:ee01]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pG1wI-00GCNo-PL for linux-arm-kernel@lists.infradead.org; Thu, 12 Jan 2023 18:04:36 +0000 Received: from tr.lan (ip-86-49-120-218.bb.vodafone.cz [86.49.120.218]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: marex@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 8963780843; Thu, 12 Jan 2023 19:04:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1673546673; bh=LY8zeDGIcc0ctkllZLygcIDVXASvLv/Jzl3fwjZ8kX0=; h=From:To:Cc:Subject:Date:From; b=beUidXohGO+sBv5i+2JRRvnVVQ6vTRuLRyhX2rPGF2oG7y48dhXeMNedOTu+rck/y TgHgOKO2C8bsW7JHp3elIy6YXeh3C4EhaoKsSSFp+V7sDde0iA5YTiDiTBAG2uxKk/ E8vE9I1AADQM/GebLG1XNocM9rPW61pptSBHiy8yJMKM7QNtyQaUSjr352plCP/V88 nsTyuQOSNcTfPkN2wMgF+CdmlM/UC2282ZHYSRisqVAn4nH/iCh7fXPBZ7Yl19WlUj 5MD3Uw6V7BRdK7ndt84An5SXWz4WDgFDOQN1VT+R1nZbH7lLtw2SruSt4NnT84MR5T FmYBWP2mKyrAw== From: Marek Vasut To: linux-serial@vger.kernel.org Cc: Marek Vasut , Sebastian Andrzej Siewior , Valentin Caron , stable@vger.kernel.org, Alexandre Torgue , Erwan Le Ray , Greg Kroah-Hartman , Jiri Slaby , Maxime Coquelin , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, linux-stm32@st-md-mailman.stormreply.com Subject: [PATCH v5] serial: stm32: Merge hard IRQ and threaded IRQ handling into single IRQ handler Date: Thu, 12 Jan 2023 19:04:17 +0100 Message-Id: <20230112180417.25595-1-marex@denx.de> X-Mailer: git-send-email 2.39.0 MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230112_100435_186448_73703D0A X-CRM114-Status: GOOD ( 17.61 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Requesting an interrupt with IRQF_ONESHOT will run the primary handler in the hard-IRQ context even in the force-threaded mode. The force-threaded mode is used by PREEMPT_RT in order to avoid acquiring sleeping locks (spinlock_t) in hard-IRQ context. This combination makes it impossible and leads to "sleeping while atomic" warnings. Use one interrupt handler for both handlers (primary and secondary) and drop the IRQF_ONESHOT flag which is not needed. Fixes: e359b4411c283 ("serial: stm32: fix threaded interrupt handling") Reviewed-by: Sebastian Andrzej Siewior Tested-by: Valentin Caron # V3 Signed-off-by: Marek Vasut Cc: stable@vger.kernel.org --- Cc: Alexandre Torgue Cc: Erwan Le Ray Cc: Greg Kroah-Hartman Cc: Jiri Slaby Cc: Maxime Coquelin Cc: Sebastian Andrzej Siewior Cc: Thomas Gleixner Cc: Valentin Caron Cc: linux-arm-kernel@lists.infradead.org Cc: linux-stm32@st-md-mailman.stormreply.com To: linux-serial@vger.kernel.org --- V2: - Update patch subject, was: serial: stm32: Move hard IRQ handling to threaded interrupt context - Use request_irq() instead, rename the IRQ handler function V3: - Update the commit message per suggestion from Sebastian - Add RB from Sebastian - Add Fixes tag V4: - Remove uart_console() deadlock check from stm32_usart_of_dma_rx_probe() - Use plain spin_lock()/spin_unlock() instead of the _irqsave/_irqrestore variants in IRQ handler - Add TB from Valentin V5: - Add CC stable@ - Do not move the sr variable, removes one useless hunk from the patch --- drivers/tty/serial/stm32-usart.c | 31 ++++--------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c index a1490033aa164..1e24bee2b0ef7 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c @@ -797,23 +797,9 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) spin_unlock(&port->lock); } - if (stm32_usart_rx_dma_enabled(port)) - return IRQ_WAKE_THREAD; - else - return IRQ_HANDLED; -} - -static irqreturn_t stm32_usart_threaded_interrupt(int irq, void *ptr) -{ - struct uart_port *port = ptr; - struct tty_port *tport = &port->state->port; - struct stm32_port *stm32_port = to_stm32_port(port); - unsigned int size; - unsigned long flags; - /* Receiver timeout irq for DMA RX */ - if (!stm32_port->throttled) { - spin_lock_irqsave(&port->lock, flags); + if (stm32_usart_rx_dma_enabled(port) && !stm32_port->throttled) { + spin_lock(&port->lock); size = stm32_usart_receive_chars(port, false); uart_unlock_and_check_sysrq_irqrestore(port, flags); if (size) @@ -1015,10 +1001,8 @@ static int stm32_usart_startup(struct uart_port *port) u32 val; int ret; - ret = request_threaded_irq(port->irq, stm32_usart_interrupt, - stm32_usart_threaded_interrupt, - IRQF_ONESHOT | IRQF_NO_SUSPEND, - name, port); + ret = request_irq(port->irq, stm32_usart_interrupt, + IRQF_NO_SUSPEND, name, port); if (ret) return ret; @@ -1601,13 +1585,6 @@ static int stm32_usart_of_dma_rx_probe(struct stm32_port *stm32port, struct dma_slave_config config; int ret; - /* - * Using DMA and threaded handler for the console could lead to - * deadlocks. - */ - if (uart_console(port)) - return -ENODEV; - stm32port->rx_buf = dma_alloc_coherent(dev, RX_BUF_L, &stm32port->rx_dma_buf, GFP_KERNEL);