From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=204.191.154.188 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793721148; b=XAaIxdUExBQFkQz6kwXc96j7R/Dw1cYEk+Dkv4D4bbFV++F6RmIaGikb1barDxpLQkke vsMqA6M3rSG9V5qsFjUlL05AW7RGT4YF5m40sc8JWB3ZQ+3nlXsafEuaZ+JilNxgmuwNq 4CnozzQzEw9vOeyotgeKtW/CpUvYwqHbELHf9ZuIPhTyVWUUd6aRSW5ZTv9aYZ5giCjmN 7g/YzWi5HD4HKBLtLmA3XFnt+y5GAiS8Fym1iKnt7q5VxtWIkzeTG1UjJXRnhTKwwKEJz rwoMIRKfrXSBYXAd2Xy2lUYZO8CZUKQKPCtxgAARfTLXCtnGAat9ZhFb7ZNE0z1L1NQ== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793721148; h=DMARC-Filter:DKIM-Signature:Received:Received:From:To:Cc:Date: Message-ID:X-Mailer:In-Reply-To:References:MIME-Version: Content-Transfer-Encoding:X-SA-Exim-Connect-IP:X-SA-Exim-Rcpt-To: X-SA-Exim-Mail-From:X-Spam-Checker-Version:X-Spam-Level:X-Spam-Status: Subject:X-SA-Exim-Version:X-SA-Exim-Scanned; bh=sapGo8wuSlP/+yPQLJLtIVkX7Rv6VkLDT+Njt79RXUU=; b=xMqqmZmEguFj6UDy5rgetHdAxGoLtRpovb/eCelTCIDEFSklL7BvNGK4dKU/KmYkJ606 mjXczEBoE5i5j5ynVd+QUqMdes7LJTgHkZxUS3g3uvFXdWCk7Nqy2BJIJzRQl6Hddy+hY /pjKMo2g0Qqe7+oLoG/qdWHOIvh80mH1Kwuk/toYKPTaRRCU8YgF1vkK/PwCXVpagmAhj eHwrvbZyD21OttXchJUtdyLIZrIFuwxRl+8mH4UDlXxD727DBTn0qSLnLMt6I+JGxZVKM 5C0pEGJ+YlWmU7AJIcHPWTo51pqSj6oNj1281j8tGCOkfVbby5XJNo+GoxgZ3idIDtg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=deltatee.com; spf=pass smtp.mailfrom=deltatee.com; dkim=pass header.d=deltatee.com header.i=@deltatee.com header.a=rsa-sha256 header.s=20200525 header.b=C8LOc9Po; arc=none smtp.remote-ip=204.191.154.188 Received: from ale.deltatee.com (ale.deltatee.com [204.191.154.188]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C4232606A32E; Tue, 3 Nov 2026 15:52:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org C4232606A32E Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=deltatee.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=deltatee.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=deltatee.com header.i=@deltatee.com header.a=rsa-sha256 header.s=20200525 header.b=C8LOc9Po DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=deltatee.com; s=20200525; h=Subject:MIME-Version:References:In-Reply-To: Message-ID:Date:Cc:To:From:content-disposition; bh=sapGo8wuSlP/+yPQLJLtIVkX7Rv6VkLDT+Njt79RXUU=; b=C8LOc9Po9beKjiXbxVWePUddN/ cVeUxwkURG0OFXnKXo26HJtXy07jEdoqxaHw/oICIVmH5p8LtpW1YniDwv89EYv1ieFRWaYZ+XG+n VNh02GCbE5g3atqqbnhpMBGH5JVLOMYgLL0utJlDYilbsvjNANlZazocB8tSAfqIqSX6DOw34sBw8 xDCA2S6SQGH/7PacbYLAuATplSySjMAEcPZ2Ob6r55V0ArI80mFRIGyyHYzqybuNi2HRbCveGiZJw Z0bG10fYqqtBGoSczASzniYK7FgsRTyTW+KxkdPjAyTBqC2ksuqsLRVku+eThKk4rqYOcpKBzMf8G 0N4HdsYA==; Received: from donard.priv.deltatee.com ([172.16.1.31]) by ale.deltatee.com with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1xOGoD-000000091Qs-44uu; Tue, 03 Nov 2026 09:52:26 -0600 Received: from logang by donard.priv.deltatee.com with local (Exim 4.98.2) (envelope-from ) id 1xOGns-00000001w7b-0oRi; Tue, 03 Nov 2026 09:52:04 -0600 From: Logan Gunthorpe To: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, Vinod Koul Cc: Frank Li , Logan Gunthorpe Date: Tue, 3 Nov 2026 09:51:56 -0600 Message-ID: <20261103155202.461725-2-logang@deltatee.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20261103155202.461725-1-logang@deltatee.com> References: <20261103155202.461725-1-logang@deltatee.com> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 172.16.1.31 X-SA-Exim-Rcpt-To: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, vkoul@kernel.org, Frank.li@nxp.com, logang@deltatee.com X-SA-Exim-Mail-From: logang@deltatee.com X-Spam-Level: Subject: [PATCH 1/6] dmaengine: plx_dma: don't call pci_irq_vector() under rcu_read_lock() X-SA-Exim-Version: 4.2.1 (built Sun, 23 Feb 2025 07:57:16 +0000) X-SA-Exim-Scanned: Yes (on ale.deltatee.com) plx_dma_free_chan_resources() calls pci_irq_vector() inside an RCU read-side section, but msi_domain_get_virq() takes the mutex that protects the device's MSI descriptors. Releasing a channel, for example at the end of a dmatest run, triggers: BUG: sleeping function called from invalid context at kernel/locking/mutex.c:623 ... RCU nest depth: 1, expected: 0 Call Trace: __mutex_lock+0x113/0x2350 msi_domain_get_virq+0x227/0x2f0 pci_irq_vector+0x9a/0xc0 plx_dma_free_chan_resources+0x178/0x58f [plx_dma] dma_chan_put+0x157/0x380 dma_release_channel+0xac/0x2e0 Store the IRQ number at probe time and use it everywhere pci_irq_vector() was called, so the teardown path no longer needs to look it up. Fixes: c2dbcaa8c672 ("dmaengine: plx-dma: Implement hardware initialization and cleanup") Signed-off-by: Logan Gunthorpe --- drivers/dma/plx_dma.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/dma/plx_dma.c b/drivers/dma/plx_dma.c index 409898e92c32..0a7ad2473cb1 100644 --- a/drivers/dma/plx_dma.c +++ b/drivers/dma/plx_dma.c @@ -104,6 +104,7 @@ struct plx_dma_dev { struct dma_device dma_dev; struct dma_chan dma_chan; struct pci_dev __rcu *pdev; + int irq; void __iomem *bar; struct tasklet_struct desc_task; @@ -452,7 +453,6 @@ static void plx_dma_free_chan_resources(struct dma_chan *chan) { struct plx_dma_dev *plxdev = chan_to_plx_dma_dev(chan); size_t ring_sz = PLX_DMA_RING_COUNT * sizeof(*plxdev->hw_ring); - struct pci_dev *pdev; int irq = -1; int i; @@ -463,9 +463,8 @@ static void plx_dma_free_chan_resources(struct dma_chan *chan) plx_dma_stop(plxdev); rcu_read_lock(); - pdev = rcu_dereference(plxdev->pdev); - if (pdev) - irq = pci_irq_vector(pdev, 0); + if (rcu_dereference(plxdev->pdev)) + irq = plxdev->irq; rcu_read_unlock(); if (irq > 0) @@ -510,8 +509,9 @@ static int plx_dma_create(struct pci_dev *pdev) RCU_INIT_POINTER(plxdev->pdev, pdev); plxdev->bar = pcim_iomap_table(pdev)[0]; - rc = request_irq(pci_irq_vector(pdev, 0), plx_dma_isr, 0, - KBUILD_MODNAME, plxdev); + plxdev->irq = pci_irq_vector(pdev, 0); + + rc = request_irq(plxdev->irq, plx_dma_isr, 0, KBUILD_MODNAME, plxdev); if (rc) goto free_plx; @@ -545,7 +545,7 @@ static int plx_dma_create(struct pci_dev *pdev) put_device: put_device(&pdev->dev); - free_irq(pci_irq_vector(pdev, 0), plxdev); + free_irq(plxdev->irq, plxdev); free_plx: kfree(plxdev); @@ -594,7 +594,7 @@ static void plx_dma_remove(struct pci_dev *pdev) { struct plx_dma_dev *plxdev = pci_get_drvdata(pdev); - free_irq(pci_irq_vector(pdev, 0), plxdev); + free_irq(plxdev->irq, plxdev); rcu_assign_pointer(plxdev->pdev, NULL); synchronize_rcu(); -- 2.47.3