Received: by 2002:a05:6358:c692:b0:131:369:b2a3 with SMTP id fe18csp863902rwb; Wed, 26 Jul 2023 04:16:54 -0700 (PDT) X-Google-Smtp-Source: APBJJlHqMH0hqF+NfyqrFIxkQU7wko4ptF8VyGyfiS5wD4KQBzf1RQ0N5NvEplNy5zjGgjbe1A26 X-Received: by 2002:a05:6a00:2d97:b0:686:bd88:6062 with SMTP id fb23-20020a056a002d9700b00686bd886062mr1715922pfb.24.1690370213813; Wed, 26 Jul 2023 04:16:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690370213; cv=none; d=google.com; s=arc-20160816; b=L6SE2p1FXVvXZ7mhD/t9coptbWFCFSCELdXSw7u/Sum9+Wkwr5J4VPO0BlLXZXh041 yVC97jyRwejOwQTBeFF4OfgSBWOFgdeGzdSuRMfmCbiQpW7EUYcg0zw9u4JQWx8YjIRF /7yozPOLpDwIYlSUex5pcOYDxRMT4fArPSeRsv+bR+HJ3cVQS5fcn63HsSTayK3oFrRT fzCOqS0aBxBzYQE9xeYrFrpltoZ/r/+xCg4+cpOixdQBv5JykjZuKfw0A8+sDXDTvM6/ mxdVBJZFDrUjF+epWxOPnuRjnw+7f68cbot1P4pyna6Q274+bCkP2Xm4MfdXctORbe8d ZUbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from :dkim-signature; bh=xEZHGYX9dSDjbkw+aqvi35n/7qtSj+sTI/JiA4c39II=; fh=Vem/8MhsVYL9i6nNyIJ8shXvJcDkclAzgzJ+yDHc48Q=; b=Bo86PsyFnfCe3HcBUejsY8HjOpvt07qsvccA0e0KWJWiCHBNqjOqqWr3IUk3uM2jEX GquSu8nhwXzX/V+g7wbFXnIgnbOtFPMPL6oc7OO5eEJaNIUybs0mqb6H0IXdlMDaRUyM jiDM7elZdi9MXVqLVl4oeEwYedeicCDQJYnRIRug+QrmuUmr7gLDKU334iXDX3UOwDHU oEJbxSsmLjR8s3eCSEFlJYx+pYs1pz740DSCzlkVlB5Xj4UtXskvWhQU/UsHWJUJ+TnO Tez8V0Zqz0hY98KdFHeOFEnAkbVV65ThlKgP1JTMdiE1j6+cRdLE9YT4g499FaEMpDgh RwqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b="V8/deSWm"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 37-20020a631365000000b0055bc4075c1dsi12626750pgt.317.2023.07.26.04.16.40; Wed, 26 Jul 2023 04:16:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b="V8/deSWm"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232606AbjGZJKy (ORCPT + 99 others); Wed, 26 Jul 2023 05:10:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232726AbjGZJKX (ORCPT ); Wed, 26 Jul 2023 05:10:23 -0400 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1BB5D4C28; Wed, 26 Jul 2023 02:06:43 -0700 (PDT) Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-1b9e9765f2cso34354235ad.3; Wed, 26 Jul 2023 02:06:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1690362397; x=1690967197; h=message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xEZHGYX9dSDjbkw+aqvi35n/7qtSj+sTI/JiA4c39II=; b=V8/deSWmG396BLvgSvQm/q/sW8F4ll0rggeYWR5l7A1QI2BE44QCvNG7DhKQZO+nUz Hl5Q4LrptJuN29klB4Km3mt68+InGxb6/U7hco5KUJ3lQvQR4GYjfUFuGFXCGMxaml5q FMJZhM4dV4PMEfc8jYk/dt8fywgBl5rsoi3UojvQ+9GteT8aiF4/P5pKgdmYQ1AshnNa sXl9SwGwPRNdprlYrD3xXSpWrQ2EJcMZ4wAoIj8fNceR6yiqG2ivqD25XJ5VnI+TiDaO 03gqQUh7uPumgXfzNv3cW7w81plFxpU4kCzz8sVjJc/ReFbt9FYVjQDQr+Kk634bCYZG fjhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690362397; x=1690967197; h=message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xEZHGYX9dSDjbkw+aqvi35n/7qtSj+sTI/JiA4c39II=; b=l63F1IvDPX+rg4xVjnkFL1Zj+wnhfr+lf2nlUKvL3IbE5ITapRC4XArrgOfrTc1A51 BEtzC3Bcok23qElNXgmklNYx9pQSfOwz9YnLgLqxhLmrOT5d/9B5nL2vUS9zuGZnpNbF 5mX0Z0WJBBUpNIPODj0lxLYy29eIYWmuuaJcUYhIWYjXlWE0fpHbCTBb6YbiZG+Rc6GT D4F3bb7hdcMZj7uB16Ru8WFuoaOiIQxUvBf+/amcrs8NcWlCzV9H1mkySc4PU1iJIvaq FzFHb3s9yuHNRP/QRsEH7dujO46uQbQNlG3UFF+kiNOKAcQkySdqqped/UWT2tbpauet w6Iw== X-Gm-Message-State: ABy/qLZieuoQcUsH2+SmFq4OvETa8N3ze3GhO/jti4X8DxiHkIWSNk58 v/TcJTtEcEUlHNW0p17Z//c= X-Received: by 2002:a17:902:728a:b0:1b9:dea2:800f with SMTP id d10-20020a170902728a00b001b9dea2800fmr1046434pll.8.1690362397271; Wed, 26 Jul 2023 02:06:37 -0700 (PDT) Received: from 377044c6c369.cse.ust.hk (191host097.mobilenet.cse.ust.hk. [143.89.191.97]) by smtp.gmail.com with ESMTPSA id q7-20020a170902dac700b001b7feed285csm12538593plx.36.2023.07.26.02.06.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Jul 2023 02:06:36 -0700 (PDT) From: Chengfeng Ye To: vkoul@kernel.org, sugaya.taichi@socionext.com, orito.takao@socionext.com, len.baker@gmx.com, jaswinder.singh@linaro.org Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Chengfeng Ye Subject: [PATCH RESEND] dmaengine: milbeaut-hdmac: Fix potential deadlock on &mc->vc.lock Date: Wed, 26 Jul 2023 09:06:28 +0000 Message-Id: <20230726090628.1784-1-dg573847474@gmail.com> X-Mailer: git-send-email 2.17.1 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As &mc->vc.lock is acquired by milbeaut_hdmac_interrupt() under irq context, other acquisition of the same lock under process context should disable irq, otherwise deadlock could happen if the irq preempts the execution of process context code while the lock is held in process context on the same CPU. milbeaut_hdmac_chan_config(), milbeaut_hdmac_chan_resume() and milbeaut_hdmac_chan_pause() are such callback functions not disable irq by default. Possible deadlock scenario: milbeaut_hdmac_chan_config() -> spin_lock(&mc->vc.lock) -> milbeaut_hdmac_interrupt() -> spin_lock(&mc->vc.lock); (deadlock here) This flaw was found by an experimental static analysis tool I am developing for irq-related deadlock. The tentative patch fixes the potential deadlock by spin_lock_irqsave() in the three callback functions to disable irq while lock is held. Signed-off-by: Chengfeng Ye --- drivers/dma/milbeaut-hdmac.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/dma/milbeaut-hdmac.c b/drivers/dma/milbeaut-hdmac.c index 1b0a95892627..6151c830ff6e 100644 --- a/drivers/dma/milbeaut-hdmac.c +++ b/drivers/dma/milbeaut-hdmac.c @@ -214,10 +214,11 @@ milbeaut_hdmac_chan_config(struct dma_chan *chan, struct dma_slave_config *cfg) { struct virt_dma_chan *vc = to_virt_chan(chan); struct milbeaut_hdmac_chan *mc = to_milbeaut_hdmac_chan(vc); + unsigned long flags; - spin_lock(&mc->vc.lock); + spin_lock_irqsave(&mc->vc.lock, flags); mc->cfg = *cfg; - spin_unlock(&mc->vc.lock); + spin_unlock_irqrestore(&mc->vc.lock, flags); return 0; } @@ -226,13 +227,14 @@ static int milbeaut_hdmac_chan_pause(struct dma_chan *chan) { struct virt_dma_chan *vc = to_virt_chan(chan); struct milbeaut_hdmac_chan *mc = to_milbeaut_hdmac_chan(vc); + unsigned long flags; u32 val; - spin_lock(&mc->vc.lock); + spin_lock_irqsave(&mc->vc.lock, flags); val = readl_relaxed(mc->reg_ch_base + MLB_HDMAC_DMACA); val |= MLB_HDMAC_PB; writel_relaxed(val, mc->reg_ch_base + MLB_HDMAC_DMACA); - spin_unlock(&mc->vc.lock); + spin_unlock_irqrestore(&mc->vc.lock, flags); return 0; } @@ -241,13 +243,14 @@ static int milbeaut_hdmac_chan_resume(struct dma_chan *chan) { struct virt_dma_chan *vc = to_virt_chan(chan); struct milbeaut_hdmac_chan *mc = to_milbeaut_hdmac_chan(vc); + unsigned long flags; u32 val; - spin_lock(&mc->vc.lock); + spin_lock_irqsave(&mc->vc.lock, flags); val = readl_relaxed(mc->reg_ch_base + MLB_HDMAC_DMACA); val &= ~MLB_HDMAC_PB; writel_relaxed(val, mc->reg_ch_base + MLB_HDMAC_DMACA); - spin_unlock(&mc->vc.lock); + spin_unlock_irqrestore(&mc->vc.lock, flags); return 0; } -- 2.17.1