diff mbox series

[net] net: atlantic: Fix DMA mapping for PTP hwts ring

Message ID 20240201094752.883026-1-ivecera@redhat.com (mailing list archive)
State Accepted
Commit 2e7d3b67630dfd8f178c41fa2217aa00e79a5887
Delegated to: Netdev Maintainers
Headers show
Series [net] net: atlantic: Fix DMA mapping for PTP hwts ring | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net
netdev/ynl success SINGLE THREAD; Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1068 this patch: 1068
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers success CCed 0 of 0 maintainers
netdev/build_clang success Errors and warnings before: 1081 this patch: 1081
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 1086 this patch: 1086
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 42 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/contest success net-next-2024-02-02--15-00 (tests: 720)

Commit Message

Ivan Vecera Feb. 1, 2024, 9:47 a.m. UTC
Function aq_ring_hwts_rx_alloc() maps extra AQ_CFG_RXDS_DEF bytes
for PTP HWTS ring but then generic aq_ring_free() does not take this
into account.
Create and use a specific function to free HWTS ring to fix this
issue.

Trace:
[  215.351607] ------------[ cut here ]------------
[  215.351612] DMA-API: atlantic 0000:4b:00.0: device driver frees DMA memory with different size [device address=0x00000000fbdd0000] [map size=34816 bytes] [unmap size=32768 bytes]
[  215.351635] WARNING: CPU: 33 PID: 10759 at kernel/dma/debug.c:988 check_unmap+0xa6f/0x2360
...
[  215.581176] Call Trace:
[  215.583632]  <TASK>
[  215.585745]  ? show_trace_log_lvl+0x1c4/0x2df
[  215.590114]  ? show_trace_log_lvl+0x1c4/0x2df
[  215.594497]  ? debug_dma_free_coherent+0x196/0x210
[  215.599305]  ? check_unmap+0xa6f/0x2360
[  215.603147]  ? __warn+0xca/0x1d0
[  215.606391]  ? check_unmap+0xa6f/0x2360
[  215.610237]  ? report_bug+0x1ef/0x370
[  215.613921]  ? handle_bug+0x3c/0x70
[  215.617423]  ? exc_invalid_op+0x14/0x50
[  215.621269]  ? asm_exc_invalid_op+0x16/0x20
[  215.625480]  ? check_unmap+0xa6f/0x2360
[  215.629331]  ? mark_lock.part.0+0xca/0xa40
[  215.633445]  debug_dma_free_coherent+0x196/0x210
[  215.638079]  ? __pfx_debug_dma_free_coherent+0x10/0x10
[  215.643242]  ? slab_free_freelist_hook+0x11d/0x1d0
[  215.648060]  dma_free_attrs+0x6d/0x130
[  215.651834]  aq_ring_free+0x193/0x290 [atlantic]
[  215.656487]  aq_ptp_ring_free+0x67/0x110 [atlantic]
...
[  216.127540] ---[ end trace 6467e5964dd2640b ]---
[  216.132160] DMA-API: Mapped at:
[  216.132162]  debug_dma_alloc_coherent+0x66/0x2f0
[  216.132165]  dma_alloc_attrs+0xf5/0x1b0
[  216.132168]  aq_ring_hwts_rx_alloc+0x150/0x1f0 [atlantic]
[  216.132193]  aq_ptp_ring_alloc+0x1bb/0x540 [atlantic]
[  216.132213]  aq_nic_init+0x4a1/0x760 [atlantic]

Fixes: 94ad94558b0f ("net: aquantia: add PTP rings infrastructure")
Signed-off-by: Ivan Vecera <ivecera@redhat.com>
---
 drivers/net/ethernet/aquantia/atlantic/aq_ptp.c  |  4 ++--
 drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 13 +++++++++++++
 drivers/net/ethernet/aquantia/atlantic/aq_ring.h |  1 +
 3 files changed, 16 insertions(+), 2 deletions(-)

Comments

Jiri Pirko Feb. 1, 2024, 12:39 p.m. UTC | #1
Thu, Feb 01, 2024 at 10:47:51AM CET, ivecera@redhat.com wrote:
>Function aq_ring_hwts_rx_alloc() maps extra AQ_CFG_RXDS_DEF bytes
>for PTP HWTS ring but then generic aq_ring_free() does not take this
>into account.
>Create and use a specific function to free HWTS ring to fix this
>issue.
>
>Trace:
>[  215.351607] ------------[ cut here ]------------
>[  215.351612] DMA-API: atlantic 0000:4b:00.0: device driver frees DMA memory with different size [device address=0x00000000fbdd0000] [map size=34816 bytes] [unmap size=32768 bytes]
>[  215.351635] WARNING: CPU: 33 PID: 10759 at kernel/dma/debug.c:988 check_unmap+0xa6f/0x2360
>...
>[  215.581176] Call Trace:
>[  215.583632]  <TASK>
>[  215.585745]  ? show_trace_log_lvl+0x1c4/0x2df
>[  215.590114]  ? show_trace_log_lvl+0x1c4/0x2df
>[  215.594497]  ? debug_dma_free_coherent+0x196/0x210
>[  215.599305]  ? check_unmap+0xa6f/0x2360
>[  215.603147]  ? __warn+0xca/0x1d0
>[  215.606391]  ? check_unmap+0xa6f/0x2360
>[  215.610237]  ? report_bug+0x1ef/0x370
>[  215.613921]  ? handle_bug+0x3c/0x70
>[  215.617423]  ? exc_invalid_op+0x14/0x50
>[  215.621269]  ? asm_exc_invalid_op+0x16/0x20
>[  215.625480]  ? check_unmap+0xa6f/0x2360
>[  215.629331]  ? mark_lock.part.0+0xca/0xa40
>[  215.633445]  debug_dma_free_coherent+0x196/0x210
>[  215.638079]  ? __pfx_debug_dma_free_coherent+0x10/0x10
>[  215.643242]  ? slab_free_freelist_hook+0x11d/0x1d0
>[  215.648060]  dma_free_attrs+0x6d/0x130
>[  215.651834]  aq_ring_free+0x193/0x290 [atlantic]
>[  215.656487]  aq_ptp_ring_free+0x67/0x110 [atlantic]
>...
>[  216.127540] ---[ end trace 6467e5964dd2640b ]---
>[  216.132160] DMA-API: Mapped at:
>[  216.132162]  debug_dma_alloc_coherent+0x66/0x2f0
>[  216.132165]  dma_alloc_attrs+0xf5/0x1b0
>[  216.132168]  aq_ring_hwts_rx_alloc+0x150/0x1f0 [atlantic]
>[  216.132193]  aq_ptp_ring_alloc+0x1bb/0x540 [atlantic]
>[  216.132213]  aq_nic_init+0x4a1/0x760 [atlantic]
>
>Fixes: 94ad94558b0f ("net: aquantia: add PTP rings infrastructure")
>Signed-off-by: Ivan Vecera <ivecera@redhat.com>

Reviewed-by: Jiri Pirko <jiri@nvidia.com>
patchwork-bot+netdevbpf@kernel.org Feb. 3, 2024, 4:50 a.m. UTC | #2
Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Thu,  1 Feb 2024 10:47:51 +0100 you wrote:
> Function aq_ring_hwts_rx_alloc() maps extra AQ_CFG_RXDS_DEF bytes
> for PTP HWTS ring but then generic aq_ring_free() does not take this
> into account.
> Create and use a specific function to free HWTS ring to fix this
> issue.
> 
> Trace:
> [  215.351607] ------------[ cut here ]------------
> [  215.351612] DMA-API: atlantic 0000:4b:00.0: device driver frees DMA memory with different size [device address=0x00000000fbdd0000] [map size=34816 bytes] [unmap size=32768 bytes]
> [  215.351635] WARNING: CPU: 33 PID: 10759 at kernel/dma/debug.c:988 check_unmap+0xa6f/0x2360
> ...
> [  215.581176] Call Trace:
> [  215.583632]  <TASK>
> [  215.585745]  ? show_trace_log_lvl+0x1c4/0x2df
> [  215.590114]  ? show_trace_log_lvl+0x1c4/0x2df
> [  215.594497]  ? debug_dma_free_coherent+0x196/0x210
> [  215.599305]  ? check_unmap+0xa6f/0x2360
> [  215.603147]  ? __warn+0xca/0x1d0
> [  215.606391]  ? check_unmap+0xa6f/0x2360
> [  215.610237]  ? report_bug+0x1ef/0x370
> [  215.613921]  ? handle_bug+0x3c/0x70
> [  215.617423]  ? exc_invalid_op+0x14/0x50
> [  215.621269]  ? asm_exc_invalid_op+0x16/0x20
> [  215.625480]  ? check_unmap+0xa6f/0x2360
> [  215.629331]  ? mark_lock.part.0+0xca/0xa40
> [  215.633445]  debug_dma_free_coherent+0x196/0x210
> [  215.638079]  ? __pfx_debug_dma_free_coherent+0x10/0x10
> [  215.643242]  ? slab_free_freelist_hook+0x11d/0x1d0
> [  215.648060]  dma_free_attrs+0x6d/0x130
> [  215.651834]  aq_ring_free+0x193/0x290 [atlantic]
> [  215.656487]  aq_ptp_ring_free+0x67/0x110 [atlantic]
> ...
> [  216.127540] ---[ end trace 6467e5964dd2640b ]---
> [  216.132160] DMA-API: Mapped at:
> [  216.132162]  debug_dma_alloc_coherent+0x66/0x2f0
> [  216.132165]  dma_alloc_attrs+0xf5/0x1b0
> [  216.132168]  aq_ring_hwts_rx_alloc+0x150/0x1f0 [atlantic]
> [  216.132193]  aq_ptp_ring_alloc+0x1bb/0x540 [atlantic]
> [  216.132213]  aq_nic_init+0x4a1/0x760 [atlantic]
> 
> [...]

Here is the summary with links:
  - [net] net: atlantic: Fix DMA mapping for PTP hwts ring
    https://git.kernel.org/netdev/net/c/2e7d3b67630d

You are awesome, thank you!
diff mbox series

Patch

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
index abd4832e4ed2..5acb3e16b567 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
@@ -993,7 +993,7 @@  int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic)
 	return 0;
 
 err_exit_hwts_rx:
-	aq_ring_free(&aq_ptp->hwts_rx);
+	aq_ring_hwts_rx_free(&aq_ptp->hwts_rx);
 err_exit_ptp_rx:
 	aq_ring_free(&aq_ptp->ptp_rx);
 err_exit_ptp_tx:
@@ -1011,7 +1011,7 @@  void aq_ptp_ring_free(struct aq_nic_s *aq_nic)
 
 	aq_ring_free(&aq_ptp->ptp_tx);
 	aq_ring_free(&aq_ptp->ptp_rx);
-	aq_ring_free(&aq_ptp->hwts_rx);
+	aq_ring_hwts_rx_free(&aq_ptp->hwts_rx);
 
 	aq_ptp_skb_ring_release(&aq_ptp->skb_ring);
 }
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
index cda8597b4e14..f7433abd6591 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
@@ -919,6 +919,19 @@  void aq_ring_free(struct aq_ring_s *self)
 	}
 }
 
+void aq_ring_hwts_rx_free(struct aq_ring_s *self)
+{
+	if (!self)
+		return;
+
+	if (self->dx_ring) {
+		dma_free_coherent(aq_nic_get_dev(self->aq_nic),
+				  self->size * self->dx_size + AQ_CFG_RXDS_DEF,
+				  self->dx_ring, self->dx_ring_pa);
+		self->dx_ring = NULL;
+	}
+}
+
 unsigned int aq_ring_fill_stats_data(struct aq_ring_s *self, u64 *data)
 {
 	unsigned int count;
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
index 52847310740a..d627ace850ff 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.h
@@ -210,6 +210,7 @@  int aq_ring_rx_fill(struct aq_ring_s *self);
 int aq_ring_hwts_rx_alloc(struct aq_ring_s *self,
 			  struct aq_nic_s *aq_nic, unsigned int idx,
 			  unsigned int size, unsigned int dx_size);
+void aq_ring_hwts_rx_free(struct aq_ring_s *self);
 void aq_ring_hwts_rx_clean(struct aq_ring_s *self, struct aq_nic_s *aq_nic);
 
 unsigned int aq_ring_fill_stats_data(struct aq_ring_s *self, u64 *data);