Received: by 2002:a05:6358:c692:b0:131:369:b2a3 with SMTP id fe18csp920697rwb; Wed, 26 Jul 2023 05:12:01 -0700 (PDT) X-Google-Smtp-Source: APBJJlFQSUA6ey2tjD02cPNPbP1SXESFww3VjRLzLq12TXeVH1h702ULOLYWf3MPZjLdKI+qJtkG X-Received: by 2002:a05:6a20:3d10:b0:133:71e4:c172 with SMTP id y16-20020a056a203d1000b0013371e4c172mr2338181pzi.15.1690373520932; Wed, 26 Jul 2023 05:12:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690373520; cv=none; d=google.com; s=arc-20160816; b=zJ/Z3SgJhOMofCthYGCej4E9++HsZPMRyH4c8JOUBILMpLP47j/9HF1YVHsE9E2O9s 6jf/c3jXboAVJPuOSCGPV2DtFVzD8MKJaIudHHaYXXnDxPak7hu/DKKuLkJKoOI8d/tl jotEIWhymHDCy3Z71fbm5zaT+MD2p7OsiXcL/aAYCS01agOerCbul2XeFvxQCIAYez4Z n8oX+nw9KqtEaYFYULFFWvhsurZNOpJZ6Gn1DQR35ii3W1qQ8JKOgdM142F774WqpqgH B1mtwqNK7+PczIjv2UmhRPs7+HWK1/85g+FPQugbeYBHF/ZeknwvcsHSSv2c5TcP9K0r Y+4g== 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=3SELQNWCM0Vfw3jXEg+B1K9VTFsk/ohvBXYAV3q7aEg=; fh=BKImpfg5oVb6WYxmv4FXiLk5hrMq0yqkZpBZd/MQH8E=; b=1K7YFEYNY+d1oklrw50Vt51IzAasXMnYglMOYlSbQ7vEdjp0oJ8YhPMPhGfKbYu1AC h1IocRTQRYQquKW1DmwAk6i/U4+0H6iacZHWrJx2OFlBZwYUlutop+q9GnqDzwH2yLN3 +HOH4BYnubo5qsFhAcENgRVyWIkBVsBMBSWNXcL1WDSZrkjlI4y7GZQI14b41iWPay0A kJL5dOhLWbxbl0aXg1SFg2zDz1CIZbw+cRJlO1M+DE/coB8JsVLO6b1B5f8qXKNyhpvP isph3tC27sn/mhMeuECFUjAi3guMeQpShRvTdiyLdPK74ymlknUDsdIE6gZe2t9UrxgS YZAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=VFoAMxMo; 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 b9-20020a63d809000000b005579d6bdf7esi13164454pgh.856.2023.07.26.05.11.42; Wed, 26 Jul 2023 05:12:00 -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=VFoAMxMo; 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 S232617AbjGZLR2 (ORCPT + 99 others); Wed, 26 Jul 2023 07:17:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50394 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232458AbjGZLRR (ORCPT ); Wed, 26 Jul 2023 07:17:17 -0400 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5ED3271C; Wed, 26 Jul 2023 04:17:05 -0700 (PDT) Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1b89cfb4571so52378915ad.3; Wed, 26 Jul 2023 04:17:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1690370225; x=1690975025; h=message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3SELQNWCM0Vfw3jXEg+B1K9VTFsk/ohvBXYAV3q7aEg=; b=VFoAMxMovxl0is1nUMBnCSNE9X5PgOjqbXMiaQ0q6vw1eawI5Rw9c/TaEYx+CtgVNq eLbLeqdNQO4MbKLFqZp0306yByHdqsMGdgDZW9BfBayclUurcDjgTmykcml0NwwOzKiJ 4BNytXk7PUC38VPUsj0sFBPZV9/rY1oXSRPf++d6eDudmWuKilJ6XGLh0FUwbrv/LH3Y xrtdkSMVt3/6BOk+QYapRvSKc4+A8m/fYDk/9kKshfu8pZsz+a96OSZsPEz7tNpeQBje HU0lae0F5wnYcq40IM92aFGy4XnUv1qINNiQQdmWIwQuVTPJvG/7t5fwiC0NKVuZfDrz wn+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690370225; x=1690975025; h=message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3SELQNWCM0Vfw3jXEg+B1K9VTFsk/ohvBXYAV3q7aEg=; b=Lpghc9GJt6ikddCT0Hfj5GNgt1zqyPRVBKiM17YXH96QuO99wkYcGnemrKMNYkOZSi UXYIRxyXnwHl92gsVDocj6+EDTF7TN656qPccXnufGEbMTR7MaBC9FyVR7qLhLcq/Mtq jCx0NBujUX9x31ZdsqpR+esRbZem0N6htXKKZK1MMNr1MLAB1pYPobGBLmzUHTw4cSpe R9H/XP9xAm9uGpX1NTvtIbRAWzdVtOzoQJ/WJcXnGSZhsUXzQwozChk2D21s6o9XxAR/ tBXCxarxaPxg9kdENOYcvgc+QrnyLwvEVr3qBpmKy6B4KEZJnQvN+7LfvKSvMsayZuXv wwrg== X-Gm-Message-State: ABy/qLZ7wl748FgR7+3AOAbEi0H+eaPpwTdQ3jErixQgiCho8B+pqyVQ zJtGzuWueobuEPBmR6cZWuM= X-Received: by 2002:a17:903:2308:b0:1b8:400a:48f2 with SMTP id d8-20020a170903230800b001b8400a48f2mr2189158plh.62.1690370225095; Wed, 26 Jul 2023 04:17:05 -0700 (PDT) Received: from 377044c6c369.cse.ust.hk (191host097.mobilenet.cse.ust.hk. [143.89.191.97]) by smtp.gmail.com with ESMTPSA id jh11-20020a170903328b00b001bb3beb2bc6sm5676141plb.65.2023.07.26.04.17.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Jul 2023 04:17:04 -0700 (PDT) From: Chengfeng Ye To: vkoul@kernel.org, rsahu@apm.com, lho@apm.com, allen.lkml@gmail.com, romain.perier@gmail.com, dan.j.williams@intel.com Cc: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, Chengfeng Ye Subject: [PATCH] dmaengine: xgene: Fix potential deadlock on &chan->lock Date: Wed, 26 Jul 2023 11:16:30 +0000 Message-Id: <20230726111630.25670-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_NONE,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 xgene_dma_cleanup_descriptors() is invoked by both tasklet xgene_dma_tasklet_cb() under softirq context and xgene_dma_free_chan_resources() callback that executed under process context, the lock aquicision of &chan->lock inside xgene_dma_cleanup_descriptors() should disable irq otherwise deadlock could happen if the tasklet softirq preempts the execution of process context code while the lock is held in process context on the same CPU. Possible deadlock scenario: xgene_dma_free_chan_resources() -> xgene_dma_cleanup_descriptors() -> spin_lock(&chan->lock) -> xgene_dma_tasklet_cb() -> xgene_dma_cleanup_descriptors() -> spin_lock(&chan->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 plx_dma_process_desc() to disable irq while lock is held. Signed-off-by: Chengfeng Ye --- drivers/dma/xgene-dma.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/dma/xgene-dma.c b/drivers/dma/xgene-dma.c index 3589b4ef50b8..e766511badcf 100644 --- a/drivers/dma/xgene-dma.c +++ b/drivers/dma/xgene-dma.c @@ -689,11 +689,12 @@ static void xgene_dma_cleanup_descriptors(struct xgene_dma_chan *chan) struct xgene_dma_desc_sw *desc_sw, *_desc_sw; struct xgene_dma_desc_hw *desc_hw; struct list_head ld_completed; + unsigned long flags; u8 status; INIT_LIST_HEAD(&ld_completed); - spin_lock(&chan->lock); + spin_lock_irqsave(&chan->lock, flags); /* Clean already completed and acked descriptors */ xgene_dma_clean_completed_descriptor(chan); @@ -762,7 +763,7 @@ static void xgene_dma_cleanup_descriptors(struct xgene_dma_chan *chan) */ xgene_chan_xfer_ld_pending(chan); - spin_unlock(&chan->lock); + spin_unlock_irqrestore(&chan->lock, flags); /* Run the callback for each descriptor, in order */ list_for_each_entry_safe(desc_sw, _desc_sw, &ld_completed, node) { -- 2.17.1