From nobody Sun Jun 14 07:34:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 950D02770A; Fri, 1 May 2026 06:35:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617339; cv=none; b=O+PFe81p7F2Sxds2vr53oPRuKz9UAMtc/p2ShqzNKI40UZGoPn/R9JIxo6HBJPO5NIkFw92Ik87U8fObpYQMlnPr8co+N2xgBUEXdgH45klVRlj2EcBR8Hl7lcBVJkD9yvsHLl0LcOIVqMd2V0CQ5N1P/T5mkwDQ65pO0q7nb+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617339; c=relaxed/simple; bh=XXU1K2WLKtohzllOvk1zXQ0oKkUYvIfV5iTsJ5+CamQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=K12zZfqOpo9x8b8j3Ry6INMLLQmnGtqji0QLaHRKwZRBiGX8KIipBr381Nv2BRZh13feZQX/yrWfW5o/qgYf3JVNO+dWmE+Txt3LRprxYgyXHYyUwP5VRNjGGiCxkNbIHEgh7u+yXah5I9Y25BkqmP4LO0R5B7iSBKgkj91PgAU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XG1LD8uh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="XG1LD8uh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 026CAC2BCB7; Fri, 1 May 2026 06:35:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777617339; bh=XXU1K2WLKtohzllOvk1zXQ0oKkUYvIfV5iTsJ5+CamQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XG1LD8uh1zKA90wmytCfmAxjQ4A4cKpMmMG9S3UJPYuFbQxG9T+nIqW4w8iVO0AG3 KDK8g0RdKAywJnW/PjJbiBZUgOhHoph9GxkD0i27nmprma8PTuP75My9vxhIrrl0QS KiBKFCWvLAHn8LtvKKfsGAo3mxrIdbKMjJYuIzy9T/MbKgX5qUndx5bs2wxamMw7g7 lzdemHMuN6DT5c4GN/Ey6bTdcm3porIGBLgaNXjpXdCFD1zAVYgV25x+7Q1L963Ozt qreQvF37Ttj4QRdf0a6D4XKgs8lTH5n3hNEmFigXujcHVH2qeu3SGv+tVH8BTjsrYo rtlv0oJUEKwzw== From: Leon Romanovsky To: Marek Szyprowski , Robin Murphy , Jon Mason , Dave Jiang , Allen Hubbe Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org, ntb@lists.linux.dev Subject: [PATCH v2 1/6] ntb: Store original DMA address for future release Date: Fri, 1 May 2026 09:35:05 +0300 Message-ID: <20260501-dma-attrs-debug-v2-1-8dbac75cd501@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> References: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-18f8f Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The DMA API requires that dma_free_attrs receive the exact dma_handle originally returned by the allocation function. Do not modify it. Fixes: fc5d1829f9bf ("NTB: transport: Try harder to alloc an aligned MW buf= fer") Signed-off-by: Leon Romanovsky Reviewed-by: Dave Jiang --- drivers/ntb/ntb_transport.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 7cabc82305d6b..771eb7d9f4356 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -223,6 +223,7 @@ struct ntb_transport_mw { void *alloc_addr; void *virt_addr; dma_addr_t dma_addr; + dma_addr_t original_dma_addr; }; =20 struct ntb_transport_client_dev { @@ -766,7 +767,7 @@ static void ntb_free_mw(struct ntb_transport_ctx *nt, i= nt num_mw) =20 ntb_mw_clear_trans(nt->ndev, PIDX, num_mw); dma_free_coherent(dma_dev, mw->alloc_size, - mw->alloc_addr, mw->dma_addr); + mw->alloc_addr, mw->original_dma_addr); mw->xlat_size =3D 0; mw->buff_size =3D 0; mw->alloc_size =3D 0; @@ -802,6 +803,7 @@ static int ntb_alloc_mw_buffer(struct ntb_transport_mw = *mw, return -ENOMEM; } virt_addr =3D alloc_addr; + mw->original_dma_addr =3D dma_addr; =20 /* * we must ensure that the memory address allocated is BAR size --=20 2.53.0 From nobody Sun Jun 14 07:34:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 769192770A; Fri, 1 May 2026 06:35:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617331; cv=none; b=tjLErntTornfkEIXZAKnrZLLhk+vpCGUNhkLPuiuU1vi0u8ceEv3jSgo9mMN0fLOavyFHj5H1qYAyzRiecHXH53IfXkvM9x9zcnnF5Rzy7IzeIbU7XxNdtfzsKBs1Dj4HpcDTBaykRFqp8+2Lq0+ZlR+wQ0phvEBeOtRp0YJmfY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617331; c=relaxed/simple; bh=mTWNzSRIXjAV+rv/PIoaynWXUFcrPJrX27oUCT/3C5Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DmY/txFRrzaYqMUfsRz2kLaEeIKkgagsNnKai+YSu8fyfORxThrdFc2b5wbnYhq42x4PuDKRbzQqAxq7BCo2D1b/s0LZYGTCVo1UjfcWxbpP1wODLvJ/1JyLvmVxi6J06mF71F3cCwskXEXRTQAfItcq1IHvjfqhclhwbvfRREw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ht0gRM7b; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ht0gRM7b" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7E3B6C2BCB7; Fri, 1 May 2026 06:35:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777617331; bh=mTWNzSRIXjAV+rv/PIoaynWXUFcrPJrX27oUCT/3C5Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ht0gRM7bXDDLDo14MTqfbpGLEvELUzeINxLo7cVZtabS958NkDbSOeUFXLCZ77VIb 5vKOLLpNNUraVRSufQdzWYkw4IaZtIQpzg0IwpbYs2QUDK+cFVcoE6R2HjeEH9zXqT dBLElN2BJ3+supQiKa4WZ6sL95jk9zw77DBqS7pZnvm16g+Y3k8zoRZo1zSHdczCJ6 fmX14jhnf79WmHANBtdc7h46+/5nwLJC1m9ZKjAk2hhSTuZXXJB+t/rdQCO0mhdEXP bJiWFvJkl/ohZPFQA7+40dQsoZVPdjlseZz+lL+P5U8572RACZG49iRSq9vUVYKaCh Wqvh9rgJsL0bw== From: Leon Romanovsky To: Marek Szyprowski , Robin Murphy , Jon Mason , Dave Jiang , Allen Hubbe Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org, ntb@lists.linux.dev Subject: [PATCH v2 2/6] ntb: Use consistent DMA attributes when freeing DMA mappings Date: Fri, 1 May 2026 09:35:06 +0300 Message-ID: <20260501-dma-attrs-debug-v2-2-8dbac75cd501@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> References: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-18f8f Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The counterpart of dma_alloc_attrs() is dma_free_attrs(), which must receive the same DMA attributes used during allocation. The code previously used dma_free_coherent(), which does not accept or apply any DMA attributes. Fixes: 061a785a114f ("ntb: Force physically contiguous allocation of rx rin= g buffers") Signed-off-by: Leon Romanovsky Reviewed-by: Dave Jiang --- drivers/ntb/ntb_transport.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 771eb7d9f4356..f59f926d4bfaa 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -766,8 +766,8 @@ static void ntb_free_mw(struct ntb_transport_ctx *nt, i= nt num_mw) return; =20 ntb_mw_clear_trans(nt->ndev, PIDX, num_mw); - dma_free_coherent(dma_dev, mw->alloc_size, - mw->alloc_addr, mw->original_dma_addr); + dma_free_attrs(dma_dev, mw->alloc_size, mw->alloc_addr, + mw->original_dma_addr, DMA_ATTR_FORCE_CONTIGUOUS); mw->xlat_size =3D 0; mw->buff_size =3D 0; mw->alloc_size =3D 0; @@ -828,8 +828,8 @@ static int ntb_alloc_mw_buffer(struct ntb_transport_mw = *mw, return 0; =20 err: - dma_free_coherent(ntb_dev, mw->alloc_size, alloc_addr, dma_addr); - + dma_free_attrs(ntb_dev, mw->alloc_size, alloc_addr, dma_addr, + DMA_ATTR_FORCE_CONTIGUOUS); return rc; } =20 --=20 2.53.0 From nobody Sun Jun 14 07:34:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD7AC35F165; Fri, 1 May 2026 06:35:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617335; cv=none; b=EBkhur9pQglN784vW6Zz+F1RxPZLiAzXVH1u7AqJWIQn3Q6LRchQxC2mk2qIK30DsCbD/geRzNRagjBEgxoB177gBYKI07BBvPZpVOMar538/c78j2VQD2o5O2wIL4fqLph0t/Y5cSZEqxlMMBqr+2xT1Axmt+7uB27bPPkyE4w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617335; c=relaxed/simple; bh=Nyii8LS3VFTqihhwtU86Uleg2NsguKtgy4deSAosxs8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LeczDgPE1/SU5fkNubc+8z9qQ0wlrcHrEI3rxJ3X9IyiNgHm/UazsDezn0dIn9SaHA7RqD62zqc6Ej7MaRiiirO4xN53Wg3fbZtlA4xSZnfChj2q5Ot/9NuhZ5fBwK0295iW1bJN7NYdeAlDFfriUfBrXrJ9cHSNyt6z2Dh0cwQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=W+p78jCp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="W+p78jCp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0212BC2BCB7; Fri, 1 May 2026 06:35:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777617335; bh=Nyii8LS3VFTqihhwtU86Uleg2NsguKtgy4deSAosxs8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=W+p78jCp2fICGx7XwPQrhmv4Axzcb4RN2w8OAke0ZJ87ItPaIyfp3Idu2Jl7j0GVf OAAT3jyEpduX9qTC3X8CjhNgwMYWjDkmjHKA+hihKdFwPOzn5jbbLogeEr6qLxcAQu 2aMZnZnYtWfYDmWpJ4doC3Cwzz1ZDV9reKi1n3xrlnJYMw96A/99iKQr5SS9lX3KIq g+M09kCZaQjh6Mp5hwWrIz5MtkHsBtIk76cWfUd/2clasl2ltXOZ7kUaa0OIccLtTQ Wkdhq8ZSAVZ0BBBMsEx3BSGlO+fflz3dGnQ+DRY7D/TlNDlop7f0eLbp30vIJBV8oP auJXrT349pmVQ== From: Leon Romanovsky To: Marek Szyprowski , Robin Murphy , Jon Mason , Dave Jiang , Allen Hubbe Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org, ntb@lists.linux.dev Subject: [PATCH v2 3/6] dma-debug: Remove unused DMA attribute parameter Date: Fri, 1 May 2026 09:35:07 +0300 Message-ID: <20260501-dma-attrs-debug-v2-3-8dbac75cd501@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> References: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-18f8f Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky debug_dma_alloc_pages() always receives a DMA attribute value of 0, because dma_alloc_pages() never receives any attributes from its callers. As preparation for upcoming patches, remove this unused attribute from the debug routine. Signed-off-by: Leon Romanovsky Reviewed-by: Samiullah Khawaja --- kernel/dma/debug.c | 5 ++--- kernel/dma/debug.h | 6 ++---- kernel/dma/mapping.c | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index 1a725edbbbf6a..3b53495337f5c 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c @@ -1567,8 +1567,7 @@ void debug_dma_sync_sg_for_device(struct device *dev,= struct scatterlist *sg, =20 void debug_dma_alloc_pages(struct device *dev, struct page *page, size_t size, int direction, - dma_addr_t dma_addr, - unsigned long attrs) + dma_addr_t dma_addr) { struct dma_debug_entry *entry; =20 @@ -1586,7 +1585,7 @@ void debug_dma_alloc_pages(struct device *dev, struct= page *page, entry->dev_addr =3D dma_addr; entry->direction =3D direction; =20 - add_dma_entry(entry, attrs); + add_dma_entry(entry, 0); } =20 void debug_dma_free_pages(struct device *dev, struct page *page, diff --git a/kernel/dma/debug.h b/kernel/dma/debug.h index da7be0bddcf67..24b8610850fbd 100644 --- a/kernel/dma/debug.h +++ b/kernel/dma/debug.h @@ -47,8 +47,7 @@ extern void debug_dma_sync_sg_for_device(struct device *d= ev, int nelems, int direction); extern void debug_dma_alloc_pages(struct device *dev, struct page *page, size_t size, int direction, - dma_addr_t dma_addr, - unsigned long attrs); + dma_addr_t dma_addr); extern void debug_dma_free_pages(struct device *dev, struct page *page, size_t size, int direction, dma_addr_t dma_addr); @@ -113,8 +112,7 @@ static inline void debug_dma_sync_sg_for_device(struct = device *dev, =20 static inline void debug_dma_alloc_pages(struct device *dev, struct page *= page, size_t size, int direction, - dma_addr_t dma_addr, - unsigned long attrs) + dma_addr_t dma_addr) { } =20 diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 23ed8eb9233e5..6cbefbd4158c8 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -733,7 +733,7 @@ struct page *dma_alloc_pages(struct device *dev, size_t= size, if (page) { trace_dma_alloc_pages(dev, page_to_virt(page), *dma_handle, size, dir, gfp, 0); - debug_dma_alloc_pages(dev, page, size, dir, *dma_handle, 0); + debug_dma_alloc_pages(dev, page, size, dir, *dma_handle); } else { trace_dma_alloc_pages(dev, NULL, 0, size, dir, gfp, 0); } --=20 2.53.0 From nobody Sun Jun 14 07:34:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0615235E947; Fri, 1 May 2026 06:35:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617349; cv=none; b=EH80m/RldjdSlpzrVTz9sNWAjYQhqi7DUxyeCng41F9sHmLOrRzx4uPvLpk4mXi6qZbUjvdiswUqZFz/st6VV/oo/ZxqXDS1BiH1Gs7IQqDz7mZU9b5nWafChct9fcxeoCWzadpp9XLgrQzc2nIqLze7hAB02G/CUHreu7p4py0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617349; c=relaxed/simple; bh=HJrpn+aNgMdOWPnmtanzs/jmRZW7gC7eZCqUOLhqwoc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=f+97bwkbLeGgAlAyQSWocaRpGVt+uba5bSL2W3aybNmUAhTqFEy1772mAIR65vXt4VurxBfXP+T6/4gLtDfl6cy+866IaLq4vL5HP3Npr3QwCOCcwBeI3s7SUwsL1Q+yx4TceRvA8L/VsBDF5HtOsVgRNnWKt13STn3JW/n4G3c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Xd4REYQJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Xd4REYQJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09C22C2BCB9; Fri, 1 May 2026 06:35:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777617348; bh=HJrpn+aNgMdOWPnmtanzs/jmRZW7gC7eZCqUOLhqwoc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Xd4REYQJ/6+sO6IufzPA2Xq9E+b3lyJW8AaZsyKkvbiVng9Ln+7Y+DvhiNhM1tua3 i6QpJMzZ2ZA6BbnmglYNFbhmy0AHyh34Ac3DmHQDnjj7blhIzwzk+kkKmnKGyRJFjo Na51XkhLy+Xhu84TocFJu/iKrQdQ7BzZN/bKDJk16/AcoJEgsnpbn18avUKiQfUzHp kAt05rDKk0PC7WULfRskUHWIPZ45lavAM4bSM9IXJU6CjL/HgOUXbyQWWOU3dEw7HY ljFbcWuCVewm4qTxlEu8WGIGfrZVxso4HDr3Pbp6wQ/vdEzib2tLESTNYGz+36KdAQ rSCFLnz45xj5Q== From: Leon Romanovsky To: Marek Szyprowski , Robin Murphy , Jon Mason , Dave Jiang , Allen Hubbe Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org, ntb@lists.linux.dev Subject: [PATCH v2 4/6] dma-debug: Record DMA attributes in debug entry Date: Fri, 1 May 2026 09:35:08 +0300 Message-ID: <20260501-dma-attrs-debug-v2-4-8dbac75cd501@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> References: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-18f8f Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky To enable reliable comparison of DMA attributes between map and unmap operations, store the attribute value in dma_debug_entry. Signed-off-by: Leon Romanovsky Reviewed-by: Samiullah Khawaja --- kernel/dma/debug.c | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index 3b53495337f5c..f07e6a1e9fbab 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c @@ -63,7 +63,7 @@ enum map_err_types { * @sg_mapped_ents: 'mapped_ents' from dma_map_sg * @paddr: physical start address of the mapping * @map_err_type: track whether dma_mapping_error() was checked - * @is_cache_clean: driver promises not to write to buffer while mapped + * @attrs: dma attributes * @stack_len: number of backtrace entries in @stack_entries * @stack_entries: stack of backtrace history */ @@ -78,7 +78,7 @@ struct dma_debug_entry { int sg_mapped_ents; phys_addr_t paddr; enum map_err_types map_err_type; - bool is_cache_clean; + unsigned long attrs; #ifdef CONFIG_STACKTRACE unsigned int stack_len; unsigned long stack_entries[DMA_DEBUG_STACKTRACE_ENTRIES]; @@ -478,6 +478,9 @@ static int active_cacheline_insert(struct dma_debug_ent= ry *entry, bool *overlap_cache_clean) { phys_addr_t cln =3D to_cacheline_number(entry); + bool is_cache_clean =3D entry->attrs & + (DMA_ATTR_DEBUGGING_IGNORE_CACHELINES | + DMA_ATTR_REQUIRE_COHERENT); unsigned long flags; int rc; =20 @@ -495,12 +498,15 @@ static int active_cacheline_insert(struct dma_debug_e= ntry *entry, if (rc =3D=3D -EEXIST) { struct dma_debug_entry *existing; =20 - active_cacheline_inc_overlap(cln, entry->is_cache_clean); + active_cacheline_inc_overlap(cln, is_cache_clean); existing =3D radix_tree_lookup(&dma_active_cacheline, cln); /* A lookup failure here after we got -EEXIST is unexpected. */ WARN_ON(!existing); if (existing) - *overlap_cache_clean =3D existing->is_cache_clean; + *overlap_cache_clean =3D + existing->attrs & + (DMA_ATTR_DEBUGGING_IGNORE_CACHELINES | + DMA_ATTR_REQUIRE_COHERENT); } spin_unlock_irqrestore(&radix_lock, flags); =20 @@ -544,12 +550,13 @@ void debug_dma_dump_mappings(struct device *dev) if (!dev || dev =3D=3D entry->dev) { cln =3D to_cacheline_number(entry); dev_info(entry->dev, - "%s idx %d P=3D%pa D=3D%llx L=3D%llx cln=3D%pa %s %s\n", + "%s idx %d P=3D%pa D=3D%llx L=3D%llx cln=3D%pa %s %s attrs=3D0x%lx\n= ", type2name[entry->type], idx, &entry->paddr, entry->dev_addr, entry->size, &cln, dir2name[entry->direction], - maperr2str[entry->map_err_type]); + maperr2str[entry->map_err_type], + entry->attrs); } } spin_unlock_irqrestore(&bucket->lock, flags); @@ -575,14 +582,15 @@ static int dump_show(struct seq_file *seq, void *v) list_for_each_entry(entry, &bucket->list, list) { cln =3D to_cacheline_number(entry); seq_printf(seq, - "%s %s %s idx %d P=3D%pa D=3D%llx L=3D%llx cln=3D%pa %s %s\n", + "%s %s %s idx %d P=3D%pa D=3D%llx L=3D%llx cln=3D%pa %s %s attrs=3D= 0x%lx\n", dev_driver_string(entry->dev), dev_name(entry->dev), type2name[entry->type], idx, &entry->paddr, entry->dev_addr, entry->size, &cln, dir2name[entry->direction], - maperr2str[entry->map_err_type]); + maperr2str[entry->map_err_type], + entry->attrs); } spin_unlock_irqrestore(&bucket->lock, flags); } @@ -594,16 +602,14 @@ DEFINE_SHOW_ATTRIBUTE(dump); * Wrapper function for adding an entry to the hash. * This function takes care of locking itself. */ -static void add_dma_entry(struct dma_debug_entry *entry, unsigned long att= rs) +static void add_dma_entry(struct dma_debug_entry *entry) { + unsigned long attrs =3D entry->attrs; bool overlap_cache_clean; struct hash_bucket *bucket; unsigned long flags; int rc; =20 - entry->is_cache_clean =3D attrs & (DMA_ATTR_DEBUGGING_IGNORE_CACHELINES | - DMA_ATTR_REQUIRE_COHERENT); - bucket =3D get_hash_bucket(entry, &flags); hash_bucket_add(bucket, entry); put_hash_bucket(bucket, flags); @@ -612,9 +618,10 @@ static void add_dma_entry(struct dma_debug_entry *entr= y, unsigned long attrs) if (rc =3D=3D -ENOMEM) { pr_err_once("cacheline tracking ENOMEM, dma-debug disabled\n"); global_disable =3D true; - } else if (rc =3D=3D -EEXIST && - !(attrs & DMA_ATTR_SKIP_CPU_SYNC) && - !(entry->is_cache_clean && overlap_cache_clean) && + } else if (rc =3D=3D -EEXIST && !(attrs & DMA_ATTR_SKIP_CPU_SYNC) && + !(attrs & (DMA_ATTR_DEBUGGING_IGNORE_CACHELINES | + DMA_ATTR_REQUIRE_COHERENT) && + overlap_cache_clean) && dma_get_cache_alignment() >=3D L1_CACHE_BYTES && !(IS_ENABLED(CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC) && is_swiotlb_active(entry->dev))) { @@ -1250,6 +1257,7 @@ void debug_dma_map_phys(struct device *dev, phys_addr= _t phys, size_t size, entry->size =3D size; entry->direction =3D direction; entry->map_err_type =3D MAP_ERR_NOT_CHECKED; + entry->attrs =3D attrs; =20 if (!(attrs & DMA_ATTR_MMIO)) { check_for_stack(dev, phys); @@ -1258,7 +1266,7 @@ void debug_dma_map_phys(struct device *dev, phys_addr= _t phys, size_t size, check_for_illegal_area(dev, phys_to_virt(phys), size); } =20 - add_dma_entry(entry, attrs); + add_dma_entry(entry); } =20 void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) @@ -1345,10 +1353,11 @@ void debug_dma_map_sg(struct device *dev, struct sc= atterlist *sg, entry->direction =3D direction; entry->sg_call_ents =3D nents; entry->sg_mapped_ents =3D mapped_ents; + entry->attrs =3D attrs; =20 check_sg_segment(dev, s); =20 - add_dma_entry(entry, attrs); + add_dma_entry(entry); } } =20 @@ -1440,8 +1449,9 @@ void debug_dma_alloc_coherent(struct device *dev, siz= e_t size, entry->size =3D size; entry->dev_addr =3D dma_addr; entry->direction =3D DMA_BIDIRECTIONAL; + entry->attrs =3D attrs; =20 - add_dma_entry(entry, attrs); + add_dma_entry(entry); } =20 void debug_dma_free_coherent(struct device *dev, size_t size, @@ -1585,7 +1595,7 @@ void debug_dma_alloc_pages(struct device *dev, struct= page *page, entry->dev_addr =3D dma_addr; entry->direction =3D direction; =20 - add_dma_entry(entry, 0); + add_dma_entry(entry); } =20 void debug_dma_free_pages(struct device *dev, struct page *page, --=20 2.53.0 From nobody Sun Jun 14 07:34:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B6B935E947; Fri, 1 May 2026 06:35:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617344; cv=none; b=J1Q/PMN+g8VUCHeyZzNcQDVn214izba02BF2QgbShPZsq/eNBAqyR8cQNilLtXMJrxP+RAnjJJJ74bAxoR/TFW25gHwrHDxmUYEkO2mTIZvtfp33AN758911dcAaIf5TW5CNC+qBQy7jsOOhNWKJlqbBt0xwpEH/NEuVsT6+AGg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617344; c=relaxed/simple; bh=R8UbzY2Jsl+wjKd3k1yLs0tqHlWeOTCKmTzgzTX5mwY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cp6dfLVBO2j8EEkwA4FHGx0e+eBE064Iqq03adA2OBh4w/c7mJYsuz7+XCfx3IKSg3GRbshXZ/8jnUvNuQZxUxqKkYE+SnMP60ss5h39fgK7KsuJVdPgS/0wp6UGLrzSo40dQSw5PMv0MkAciWRxqyvKYRTxHwt+LqYLQF8NT64= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LnemJXWH; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LnemJXWH" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 27A12C2BCB7; Fri, 1 May 2026 06:35:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777617344; bh=R8UbzY2Jsl+wjKd3k1yLs0tqHlWeOTCKmTzgzTX5mwY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LnemJXWHu2+mI+xhhNVsUDZY7x+WDnjHtRrwiUqSk/X0StW87IHeG0J/fo/InGNpx uFWcbHMyC5gz9HDEt57JiSbVTzLu1eEasFeMWBCy7qo2GuxjNrEJ8AZKCJhfZZwv+6 og3u5OO7TQK4Lu00lNhbuc9qpnJwaQ0wpuXa92Wh6Z2ljkx8yMSnxQuebhqo4F7W5z TkbLkpqZa9HfD8ZC+v8DSoL29mcpRktu1reSQQfB/77ZummltvvTl/zmvNH3OiFSe8 FbhMqm3P38obIawL+3X96wFnIFrig2TZpS95D+sEUOp+lseFwhm+fOUMeklvnAxdU1 pdgrCzk7Y+Q6Q== From: Leon Romanovsky To: Marek Szyprowski , Robin Murphy , Jon Mason , Dave Jiang , Allen Hubbe Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org, ntb@lists.linux.dev Subject: [PATCH v2 5/6] dma-debug: Feed DMA attribute for unmapping flows too Date: Fri, 1 May 2026 09:35:09 +0300 Message-ID: <20260501-dma-attrs-debug-v2-5-8dbac75cd501@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> References: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-18f8f Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky There are multiple unmapping flows which didn't provide DMA attributes, which limited DMA debug code to compare the mapping and unmapping attributes. Let's fix it. Signed-off-by: Leon Romanovsky Reviewed-by: Samiullah Khawaja --- kernel/dma/debug.c | 13 ++++++++----- kernel/dma/debug.h | 19 +++++++++++-------- kernel/dma/mapping.c | 8 ++++---- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index f07e6a1e9fbab..3dfed51c3d9aa 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c @@ -1307,8 +1307,8 @@ void debug_dma_mapping_error(struct device *dev, dma_= addr_t dma_addr) } EXPORT_SYMBOL(debug_dma_mapping_error); =20 -void debug_dma_unmap_phys(struct device *dev, dma_addr_t dma_addr, - size_t size, int direction) +void debug_dma_unmap_phys(struct device *dev, dma_addr_t dma_addr, size_t = size, + int direction, unsigned long attrs) { struct dma_debug_entry ref =3D { .type =3D dma_debug_phy, @@ -1316,6 +1316,7 @@ void debug_dma_unmap_phys(struct device *dev, dma_add= r_t dma_addr, .dev_addr =3D dma_addr, .size =3D size, .direction =3D direction, + .attrs =3D attrs, }; =20 if (unlikely(dma_debug_disabled())) @@ -1381,7 +1382,7 @@ static int get_nr_mapped_entries(struct device *dev, } =20 void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, - int nelems, int dir) + int nelems, int dir, unsigned long attrs) { struct scatterlist *s; int mapped_ents =3D 0, i; @@ -1399,6 +1400,7 @@ void debug_dma_unmap_sg(struct device *dev, struct sc= atterlist *sglist, .size =3D sg_dma_len(s), .direction =3D dir, .sg_call_ents =3D nelems, + .attrs =3D attrs, }; =20 if (mapped_ents && i >=3D mapped_ents) @@ -1454,8 +1456,8 @@ void debug_dma_alloc_coherent(struct device *dev, siz= e_t size, add_dma_entry(entry); } =20 -void debug_dma_free_coherent(struct device *dev, size_t size, - void *virt, dma_addr_t dma_addr) +void debug_dma_free_coherent(struct device *dev, size_t size, void *virt, + dma_addr_t dma_addr, unsigned long attrs) { struct dma_debug_entry ref =3D { .type =3D dma_debug_coherent, @@ -1463,6 +1465,7 @@ void debug_dma_free_coherent(struct device *dev, size= _t size, .dev_addr =3D dma_addr, .size =3D size, .direction =3D DMA_BIDIRECTIONAL, + .attrs =3D attrs, }; =20 /* handle vmalloc and linear addresses */ diff --git a/kernel/dma/debug.h b/kernel/dma/debug.h index 24b8610850fbd..13e384633c32a 100644 --- a/kernel/dma/debug.h +++ b/kernel/dma/debug.h @@ -14,21 +14,22 @@ extern void debug_dma_map_phys(struct device *dev, phys= _addr_t phys, unsigned long attrs); =20 extern void debug_dma_unmap_phys(struct device *dev, dma_addr_t addr, - size_t size, int direction); + size_t size, int direction, + unsigned long attrs); =20 extern void debug_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, int mapped_ents, int direction, unsigned long attrs); =20 extern void debug_dma_unmap_sg(struct device *dev, struct scatterlist *sgl= ist, - int nelems, int dir); + int nelems, int dir, unsigned long attrs); =20 extern void debug_dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t dma_addr, void *virt, unsigned long attrs); =20 -extern void debug_dma_free_coherent(struct device *dev, size_t size, - void *virt, dma_addr_t addr); +extern void debug_dma_free_coherent(struct device *dev, size_t size, void = *virt, + dma_addr_t addr, unsigned long attrs); =20 extern void debug_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, @@ -59,7 +60,8 @@ static inline void debug_dma_map_phys(struct device *dev,= phys_addr_t phys, } =20 static inline void debug_dma_unmap_phys(struct device *dev, dma_addr_t add= r, - size_t size, int direction) + size_t size, int direction, + unsigned long attrs) { } =20 @@ -70,8 +72,8 @@ static inline void debug_dma_map_sg(struct device *dev, s= truct scatterlist *sg, } =20 static inline void debug_dma_unmap_sg(struct device *dev, - struct scatterlist *sglist, - int nelems, int dir) + struct scatterlist *sglist, int nelems, + int dir, unsigned long attrs) { } =20 @@ -82,7 +84,8 @@ static inline void debug_dma_alloc_coherent(struct device= *dev, size_t size, } =20 static inline void debug_dma_free_coherent(struct device *dev, size_t size, - void *virt, dma_addr_t addr) + void *virt, dma_addr_t addr, + unsigned long attrs) { } =20 diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 6cbefbd4158c8..f010b3cc0ece4 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -225,7 +225,7 @@ void dma_unmap_phys(struct device *dev, dma_addr_t addr= , size_t size, else if (ops->unmap_phys) ops->unmap_phys(dev, addr, size, dir, attrs); trace_dma_unmap_phys(dev, addr, size, dir, attrs); - debug_dma_unmap_phys(dev, addr, size, dir); + debug_dma_unmap_phys(dev, addr, size, dir, attrs); } EXPORT_SYMBOL_GPL(dma_unmap_phys); =20 @@ -351,7 +351,7 @@ void dma_unmap_sg_attrs(struct device *dev, struct scat= terlist *sg, =20 BUG_ON(!valid_dma_direction(dir)); trace_dma_unmap_sg(dev, sg, nents, dir, attrs); - debug_dma_unmap_sg(dev, sg, nents, dir); + debug_dma_unmap_sg(dev, sg, nents, dir, attrs); if (dma_map_direct(dev, ops) || arch_dma_unmap_sg_direct(dev, sg, nents)) dma_direct_unmap_sg(dev, sg, nents, dir, attrs); @@ -693,7 +693,7 @@ void dma_free_attrs(struct device *dev, size_t size, vo= id *cpu_addr, if (!cpu_addr) return; =20 - debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); + debug_dma_free_coherent(dev, size, cpu_addr, dma_handle, attrs); if (dma_alloc_direct(dev, ops) || arch_dma_free_direct(dev, dma_handle)) dma_direct_free(dev, size, cpu_addr, dma_handle, attrs); else if (use_dma_iommu(dev)) @@ -840,7 +840,7 @@ void dma_free_noncontiguous(struct device *dev, size_t = size, struct sg_table *sgt, enum dma_data_direction dir) { trace_dma_free_sgt(dev, sgt, size, dir); - debug_dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir); + debug_dma_unmap_sg(dev, sgt->sgl, sgt->orig_nents, dir, 0); =20 if (use_dma_iommu(dev)) iommu_dma_free_noncontiguous(dev, size, sgt, dir); --=20 2.53.0 From nobody Sun Jun 14 07:34:44 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0E2835E947; Fri, 1 May 2026 06:35:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617354; cv=none; b=RoYkGO9EEG8Z+Xxpga20l/a36ORI9LOA9ASQhJpzCZHmGcJOhnqg0VQ7lhmlfMmvjojem/+y7t7Ywu/aGdGs5noEPRJGqbipM3G5+ijJ5RMQK0Uc7SZq0oLqet65Vw+JHQtJcy/uqhfNvV9ActuDqteKkVfiLNafWQGu9PIzcvw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777617354; c=relaxed/simple; bh=S0yiXMvQJK/N6ps9wR2OP0iUguuljk4MVax88ktyVjM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TKLfxoJuFyGI5KLT5OTDY2fVsYaIbd+HXbbF9ynnUTXgoHwWtqClu5rTE4V3A069IEbMDtCn7bWpFNgj2NZiWKeXgFHCnFs3NU/DGR4qLA3HDccFWfBxRz3k/FeTOXcNAfYA/5APau5yuyYdUnJFMKR/WjH9zkCGSNFjsT0Z36I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O5jyVPII; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="O5jyVPII" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1C8C9C2BCB7; Fri, 1 May 2026 06:35:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777617353; bh=S0yiXMvQJK/N6ps9wR2OP0iUguuljk4MVax88ktyVjM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O5jyVPIIt5PlIAM/78tnqB22z98xvekkMwe8yuScR41A7Yd+zL6j2Nr1KicsieWs2 Ur9B1cYgjCIlW63Sl19+mnq7ojcXK0i20tasaXl+T2y7ZKbvYrtCIrKUnmdcG3UkpL hTJzqbO0CCsZKy+soGSn6r2FeUAlJ49m1tpF0Sku6JSj3qhusgm4moWD7BHQUCuj8q PTS+QKrDlaUgxhYKNiE0I/eoGJ2PHWB6h1eRq/H/NIRPT8aCnDubrhF+VkwofEfhkq 9wy+g3vm3xe9AZNMMhBxNippgT+RgyEpTOWpSl2tNOgOXVfLC6fdQOjp5e1OWdzy2A 31cHM7JJQVmYQ== From: Leon Romanovsky To: Marek Szyprowski , Robin Murphy , Jon Mason , Dave Jiang , Allen Hubbe Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org, ntb@lists.linux.dev Subject: [PATCH v2 6/6] dma-debug: Ensure mappings are created and released with matching attributes Date: Fri, 1 May 2026 09:35:10 +0300 Message-ID: <20260501-dma-attrs-debug-v2-6-8dbac75cd501@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> References: <20260501-dma-attrs-debug-v2-0-8dbac75cd501@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" X-Mailer: b4 0.15-dev-18f8f Content-Transfer-Encoding: quoted-printable From: Leon Romanovsky The DMA API expects that callers use the same attributes when mapping and unmapping. Add tracking to verify this and catch mismatches. Signed-off-by: Leon Romanovsky Reviewed-by: Samiullah Khawaja --- kernel/dma/debug.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/kernel/dma/debug.c b/kernel/dma/debug.c index 3dfed51c3d9aa..c38efc1ac8d6c 100644 --- a/kernel/dma/debug.c +++ b/kernel/dma/debug.c @@ -1074,6 +1074,29 @@ static void check_unmap(struct dma_debug_entry *ref) type2name[entry->type]); } =20 + /* + * This may be no bug in reality - but DMA API still expects + * that entry is unmapped with same attributes as it was mapped. + * + * DMA_ATTR_UNMAP_VALID lists the attributes that must be identical + * between map and unmap. Any attribute outside this set (e.g. + * DMA_ATTR_NO_WARN, DMA_ATTR_SKIP_CPU_SYNC) is allowed to differ. + */ +#define DMA_ATTR_UNMAP_VALID = \ + (DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_FORCE_CONTIGUOUS | \ + DMA_ATTR_MMIO | DMA_ATTR_REQUIRE_COHERENT | DMA_ATTR_PRIVILEGED | \ + DMA_ATTR_CC_SHARED) + if ((ref->attrs & DMA_ATTR_UNMAP_VALID) !=3D + (entry->attrs & DMA_ATTR_UNMAP_VALID)) { + err_printk(ref->dev, entry, + "device driver frees " + "DMA memory with different attributes " + "[device address=3D0x%016llx] [size=3D%llu bytes] " + "[mapped with 0x%lx] [unmapped with 0x%lx]\n", + ref->dev_addr, ref->size, entry->attrs, ref->attrs); + } +#undef DMA_ATTR_UNMAP_VALID + hash_bucket_del(entry); put_hash_bucket(bucket, flags); =20 --=20 2.53.0