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 |
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>
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 --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);
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(-)