From patchwork Thu Jun 11 12:17:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 11599905 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B90CE618 for ; Thu, 11 Jun 2020 12:17:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9AFFD2078D for ; Thu, 11 Jun 2020 12:17:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1591877869; bh=TL+cCvJxcZMcr3rIlEDjazM57ouI9QtmzoB6fKwEDWs=; h=From:To:Cc:Subject:Date:List-ID:From; b=J5ZBNZo5P0oxz5+vtRezn8NMrtRVqR0Mo6hyEmgLs2iT9khtAx8cp0+KEncC3PruM Vc4BELNoYx0zoiQUOPZM8ALFlcuX2BNwrnM5VQz/RU2akJXib3jComXSB0QRsbfd+B q3twcE019uER8ymPBgEip0cJa2IFJqhjTLjqXrY0= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727769AbgFKMRt (ORCPT ); Thu, 11 Jun 2020 08:17:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:44694 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727097AbgFKMRt (ORCPT ); Thu, 11 Jun 2020 08:17:49 -0400 Received: from PC-kkoz.proceq.com (unknown [213.160.61.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 32C0320760; Thu, 11 Jun 2020 12:17:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1591877868; bh=TL+cCvJxcZMcr3rIlEDjazM57ouI9QtmzoB6fKwEDWs=; h=From:To:Cc:Subject:Date:From; b=McBN7Is8KkDw3Jq+G7qOZe8jTIG5ZeQjw598HNM7gyNmo5KZn5Zgcad1TovUuDtTi q6+5TNzob39RQvnvWqc/eloLWybEyPjzxg/MFOjsdC27uNqaHfqzPq43pFbqnfqKKV 5rfd+dSdnnWsuKBz6ijGHR9sQpT8VgntdnGLbRC4= From: Krzysztof Kozlowski To: Vinod Koul , Dan Williams , Robin Gong , Peng Ma , Fabio Estevam , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Krzysztof Kozlowski Subject: [PATCH 1/2] dmaengine: fsl-edma: Add lockdep assert for exported function Date: Thu, 11 Jun 2020 14:17:40 +0200 Message-Id: <1591877861-28156-1-git-send-email-krzk@kernel.org> X-Mailer: git-send-email 2.7.4 Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org Add lockdep assert for an exported function expected to be called under spin lock. Since this function is called in different modules, the lockdep assert will be self-documenting note about need for locking. Signed-off-by: Krzysztof Kozlowski Reviewed-by: Robin Gong --- drivers/dma/fsl-edma-common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c index 5697c3622699..4550818cca4a 100644 --- a/drivers/dma/fsl-edma-common.c +++ b/drivers/dma/fsl-edma-common.c @@ -589,6 +589,8 @@ void fsl_edma_xfer_desc(struct fsl_edma_chan *fsl_chan) { struct virt_dma_desc *vdesc; + lockdep_assert_held(&fsl_chan->vchan.lock); + vdesc = vchan_next_desc(&fsl_chan->vchan); if (!vdesc) return; From patchwork Thu Jun 11 12:17:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 11599907 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9CC66618 for ; Thu, 11 Jun 2020 12:17:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 83AAA2078D for ; Thu, 11 Jun 2020 12:17:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1591877874; bh=0K1+88Lwj0beX+rNYr54Ww8Eh+bQyL1InVpN0BEVars=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=Qa7fSp4nKDDYTxSrr1btOXk1dpxzvsVP51BMh5GhFA7Zf57OFHhohI4aOw3AY13K/ 7qunOzZKuUgNgCiFeud7tWYzE3kL849X5ojd8Ubpdjbobtxb/cHujEhHhiaS/7jrZm 37lKWOcr8pnVBD8ipPlgPDxtc0LfqbVYcJ8GyeAo= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727931AbgFKMRy (ORCPT ); Thu, 11 Jun 2020 08:17:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:44732 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727097AbgFKMRv (ORCPT ); Thu, 11 Jun 2020 08:17:51 -0400 Received: from PC-kkoz.proceq.com (unknown [213.160.61.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0754C20801; Thu, 11 Jun 2020 12:17:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1591877870; bh=0K1+88Lwj0beX+rNYr54Ww8Eh+bQyL1InVpN0BEVars=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Zbj1BWtTAkR3mu+IcmjYDx0Y/c3josgMOafjaVvfGSguZSemFH+8QNJ4qF+RImfid bSjDdGRPuLClXBR5fqVlYwdzbVgyumr0ifNHqYhOtJ0cEIyFF6ARh/SHkkdfLt0DQM iemiIxnAgtH9U82uJeWtL0XR2kbBBSudmfU4wL2s= From: Krzysztof Kozlowski To: Vinod Koul , Dan Williams , Robin Gong , Peng Ma , Fabio Estevam , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Krzysztof Kozlowski , stable@vger.kernel.org Subject: [PATCH 2/2] dmaengine: fsl-edma: Fix NULL pointer exception in fsl_edma_tx_handler Date: Thu, 11 Jun 2020 14:17:41 +0200 Message-Id: <1591877861-28156-2-git-send-email-krzk@kernel.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1591877861-28156-1-git-send-email-krzk@kernel.org> References: <1591877861-28156-1-git-send-email-krzk@kernel.org> Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org NULL pointer exception happens occasionally on serial output initiated by login timeout. This was reproduced only if kernel was built with significant debugging options and EDMA driver is used with serial console. col-vf50 login: root Password: Login timed out after 60 seconds. Unable to handle kernel NULL pointer dereference at virtual address 00000044 Internal error: Oops: 5 [#1] ARM CPU: 0 PID: 157 Comm: login Not tainted 5.7.0-next-20200610-dirty #4 Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree) (fsl_edma_tx_handler) from [<8016eb10>] (__handle_irq_event_percpu+0x64/0x304) (__handle_irq_event_percpu) from [<8016eddc>] (handle_irq_event_percpu+0x2c/0x7c) (handle_irq_event_percpu) from [<8016ee64>] (handle_irq_event+0x38/0x5c) (handle_irq_event) from [<801729e4>] (handle_fasteoi_irq+0xa4/0x160) (handle_fasteoi_irq) from [<8016ddcc>] (generic_handle_irq+0x34/0x44) (generic_handle_irq) from [<8016e40c>] (__handle_domain_irq+0x54/0xa8) (__handle_domain_irq) from [<80508bc8>] (gic_handle_irq+0x4c/0x80) (gic_handle_irq) from [<80100af0>] (__irq_svc+0x70/0x98) Exception stack(0x8459fe80 to 0x8459fec8) fe80: 72286b00 e3359f64 00000001 0000412d a0070013 85c98840 85c98840 a0070013 fea0: 8054e0d4 00000000 00000002 00000000 00000002 8459fed0 8081fbe8 8081fbec fec0: 60070013 ffffffff (__irq_svc) from [<8081fbec>] (_raw_spin_unlock_irqrestore+0x30/0x58) (_raw_spin_unlock_irqrestore) from [<8056cb48>] (uart_flush_buffer+0x88/0xf8) (uart_flush_buffer) from [<80554e60>] (tty_ldisc_hangup+0x38/0x1ac) (tty_ldisc_hangup) from [<8054c7f4>] (__tty_hangup+0x158/0x2bc) (__tty_hangup) from [<80557b90>] (disassociate_ctty.part.1+0x30/0x23c) (disassociate_ctty.part.1) from [<8011fc18>] (do_exit+0x580/0xba0) (do_exit) from [<801214f8>] (do_group_exit+0x3c/0xb4) (do_group_exit) from [<80121580>] (__wake_up_parent+0x0/0x14) Issue looks like race condition between interrupt handler fsl_edma_tx_handler() (called as result of fsl_edma_xfer_desc()) and terminating the transfer with fsl_edma_terminate_all(). The fsl_edma_tx_handler() handles interrupt for a transfer with already freed edesc and idle==true. Fixes: d6be34fbd39b ("dma: Add Freescale eDMA engine driver support") Cc: Signed-off-by: Krzysztof Kozlowski Reviewed-by: Robin Gong --- drivers/dma/fsl-edma.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/dma/fsl-edma.c b/drivers/dma/fsl-edma.c index eff7ebd8cf35..90bb72af306c 100644 --- a/drivers/dma/fsl-edma.c +++ b/drivers/dma/fsl-edma.c @@ -45,6 +45,13 @@ static irqreturn_t fsl_edma_tx_handler(int irq, void *dev_id) fsl_chan = &fsl_edma->chans[ch]; spin_lock(&fsl_chan->vchan.lock); + + if (!fsl_chan->edesc) { + /* terminate_all called before */ + spin_unlock(&fsl_chan->vchan.lock); + continue; + } + if (!fsl_chan->edesc->iscyclic) { list_del(&fsl_chan->edesc->vdesc.node); vchan_cookie_complete(&fsl_chan->edesc->vdesc);