diff mbox series

net: ethernet: ti: davinci_cpdma: fix warning "device driver frees DMA memory with different size"

Message ID 20191209111924.22555-1-grygorii.strashko@ti.com
State Accepted
Commit 8a2b22203f8596729c54eba221b4044351bfe167
Headers show
Series net: ethernet: ti: davinci_cpdma: fix warning "device driver frees DMA memory with different size" | expand

Commit Message

Grygorii Strashko Dec. 9, 2019, 11:19 a.m. UTC
The TI CPSW(s) driver produces warning with DMA API debug options enabled:

WARNING: CPU: 0 PID: 1033 at kernel/dma/debug.c:1025 check_unmap+0x4a8/0x968
DMA-API: cpsw 48484000.ethernet: device driver frees DMA memory with different size
 [device address=0x00000000abc6aa02] [map size=64 bytes] [unmap size=42 bytes]
CPU: 0 PID: 1033 Comm: ping Not tainted 5.3.0-dirty #41
Hardware name: Generic DRA72X (Flattened Device Tree)
[<c0112c60>] (unwind_backtrace) from [<c010d270>] (show_stack+0x10/0x14)
[<c010d270>] (show_stack) from [<c09bc564>] (dump_stack+0xd8/0x110)
[<c09bc564>] (dump_stack) from [<c013b93c>] (__warn+0xe0/0x10c)
[<c013b93c>] (__warn) from [<c013b9ac>] (warn_slowpath_fmt+0x44/0x6c)
[<c013b9ac>] (warn_slowpath_fmt) from [<c01e0368>] (check_unmap+0x4a8/0x968)
[<c01e0368>] (check_unmap) from [<c01e08a8>] (debug_dma_unmap_page+0x80/0x90)
[<c01e08a8>] (debug_dma_unmap_page) from [<c0752414>] (__cpdma_chan_free+0x114/0x16c)
[<c0752414>] (__cpdma_chan_free) from [<c07525c4>] (__cpdma_chan_process+0x158/0x17c)
[<c07525c4>] (__cpdma_chan_process) from [<c0753690>] (cpdma_chan_process+0x3c/0x5c)
[<c0753690>] (cpdma_chan_process) from [<c0758660>] (cpsw_tx_mq_poll+0x48/0x94)
[<c0758660>] (cpsw_tx_mq_poll) from [<c0803018>] (net_rx_action+0x108/0x4e4)
[<c0803018>] (net_rx_action) from [<c010230c>] (__do_softirq+0xec/0x598)
[<c010230c>] (__do_softirq) from [<c0143914>] (do_softirq.part.4+0x68/0x74)
[<c0143914>] (do_softirq.part.4) from [<c0143a44>] (__local_bh_enable_ip+0x124/0x17c)
[<c0143a44>] (__local_bh_enable_ip) from [<c0871590>] (ip_finish_output2+0x294/0xb7c)
[<c0871590>] (ip_finish_output2) from [<c0875440>] (ip_output+0x210/0x364)
[<c0875440>] (ip_output) from [<c0875e2c>] (ip_send_skb+0x1c/0xf8)
[<c0875e2c>] (ip_send_skb) from [<c08a7fd4>] (raw_sendmsg+0x9a8/0xc74)
[<c08a7fd4>] (raw_sendmsg) from [<c07d6b90>] (sock_sendmsg+0x14/0x24)
[<c07d6b90>] (sock_sendmsg) from [<c07d8260>] (__sys_sendto+0xbc/0x100)
[<c07d8260>] (__sys_sendto) from [<c01011ac>] (__sys_trace_return+0x0/0x14)
Exception stack(0xea9a7fa8 to 0xea9a7ff0)
...

The reason is that cpdma_chan_submit_si() now stores original buffer length
(sw_len) in CPDMA descriptor instead of adjusted buffer length (hw_len)
used to map the buffer.

Hence, fix an issue by passing correct buffer length in CPDMA descriptor.

Cc: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Fixes: 6670acacd59e ("net: ethernet: ti: davinci_cpdma: add dma mapped submit")
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

---
changes in v3:
 - removed swlen local var

 drivers/net/ethernet/ti/davinci_cpdma.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

-- 
2.17.1

Comments

Ivan Khoronzhuk Dec. 9, 2019, 8:39 p.m. UTC | #1
On Mon, Dec 09, 2019 at 01:19:24PM +0200, Grygorii Strashko wrote:
>The TI CPSW(s) driver produces warning with DMA API debug options enabled:

>

>WARNING: CPU: 0 PID: 1033 at kernel/dma/debug.c:1025 check_unmap+0x4a8/0x968

>DMA-API: cpsw 48484000.ethernet: device driver frees DMA memory with different size

> [device address=0x00000000abc6aa02] [map size=64 bytes] [unmap size=42 bytes]

>CPU: 0 PID: 1033 Comm: ping Not tainted 5.3.0-dirty #41

>Hardware name: Generic DRA72X (Flattened Device Tree)

>[<c0112c60>] (unwind_backtrace) from [<c010d270>] (show_stack+0x10/0x14)

>[<c010d270>] (show_stack) from [<c09bc564>] (dump_stack+0xd8/0x110)

>[<c09bc564>] (dump_stack) from [<c013b93c>] (__warn+0xe0/0x10c)

>[<c013b93c>] (__warn) from [<c013b9ac>] (warn_slowpath_fmt+0x44/0x6c)

>[<c013b9ac>] (warn_slowpath_fmt) from [<c01e0368>] (check_unmap+0x4a8/0x968)

>[<c01e0368>] (check_unmap) from [<c01e08a8>] (debug_dma_unmap_page+0x80/0x90)

>[<c01e08a8>] (debug_dma_unmap_page) from [<c0752414>] (__cpdma_chan_free+0x114/0x16c)

>[<c0752414>] (__cpdma_chan_free) from [<c07525c4>] (__cpdma_chan_process+0x158/0x17c)

>[<c07525c4>] (__cpdma_chan_process) from [<c0753690>] (cpdma_chan_process+0x3c/0x5c)

>[<c0753690>] (cpdma_chan_process) from [<c0758660>] (cpsw_tx_mq_poll+0x48/0x94)

>[<c0758660>] (cpsw_tx_mq_poll) from [<c0803018>] (net_rx_action+0x108/0x4e4)

>[<c0803018>] (net_rx_action) from [<c010230c>] (__do_softirq+0xec/0x598)

>[<c010230c>] (__do_softirq) from [<c0143914>] (do_softirq.part.4+0x68/0x74)

>[<c0143914>] (do_softirq.part.4) from [<c0143a44>] (__local_bh_enable_ip+0x124/0x17c)

>[<c0143a44>] (__local_bh_enable_ip) from [<c0871590>] (ip_finish_output2+0x294/0xb7c)

>[<c0871590>] (ip_finish_output2) from [<c0875440>] (ip_output+0x210/0x364)

>[<c0875440>] (ip_output) from [<c0875e2c>] (ip_send_skb+0x1c/0xf8)

>[<c0875e2c>] (ip_send_skb) from [<c08a7fd4>] (raw_sendmsg+0x9a8/0xc74)

>[<c08a7fd4>] (raw_sendmsg) from [<c07d6b90>] (sock_sendmsg+0x14/0x24)

>[<c07d6b90>] (sock_sendmsg) from [<c07d8260>] (__sys_sendto+0xbc/0x100)

>[<c07d8260>] (__sys_sendto) from [<c01011ac>] (__sys_trace_return+0x0/0x14)

>Exception stack(0xea9a7fa8 to 0xea9a7ff0)

>...

>

>The reason is that cpdma_chan_submit_si() now stores original buffer length

>(sw_len) in CPDMA descriptor instead of adjusted buffer length (hw_len)

>used to map the buffer.

>

>Hence, fix an issue by passing correct buffer length in CPDMA descriptor.

>

>Cc: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>

>Fixes: 6670acacd59e ("net: ethernet: ti: davinci_cpdma: add dma mapped submit")

>Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

>---


Reviewed-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>


-- 
Regards,
Ivan Khoronzhuk
David Miller Dec. 9, 2019, 10:26 p.m. UTC | #2
From: Grygorii Strashko <grygorii.strashko@ti.com>

Date: Mon, 9 Dec 2019 13:19:24 +0200

> The TI CPSW(s) driver produces warning with DMA API debug options enabled:

> 

> WARNING: CPU: 0 PID: 1033 at kernel/dma/debug.c:1025 check_unmap+0x4a8/0x968

> DMA-API: cpsw 48484000.ethernet: device driver frees DMA memory with different size

>  [device address=0x00000000abc6aa02] [map size=64 bytes] [unmap size=42 bytes]

> CPU: 0 PID: 1033 Comm: ping Not tainted 5.3.0-dirty #41

> Hardware name: Generic DRA72X (Flattened Device Tree)

> [<c0112c60>] (unwind_backtrace) from [<c010d270>] (show_stack+0x10/0x14)

> [<c010d270>] (show_stack) from [<c09bc564>] (dump_stack+0xd8/0x110)

> [<c09bc564>] (dump_stack) from [<c013b93c>] (__warn+0xe0/0x10c)

> [<c013b93c>] (__warn) from [<c013b9ac>] (warn_slowpath_fmt+0x44/0x6c)

> [<c013b9ac>] (warn_slowpath_fmt) from [<c01e0368>] (check_unmap+0x4a8/0x968)

> [<c01e0368>] (check_unmap) from [<c01e08a8>] (debug_dma_unmap_page+0x80/0x90)

> [<c01e08a8>] (debug_dma_unmap_page) from [<c0752414>] (__cpdma_chan_free+0x114/0x16c)

> [<c0752414>] (__cpdma_chan_free) from [<c07525c4>] (__cpdma_chan_process+0x158/0x17c)

> [<c07525c4>] (__cpdma_chan_process) from [<c0753690>] (cpdma_chan_process+0x3c/0x5c)

> [<c0753690>] (cpdma_chan_process) from [<c0758660>] (cpsw_tx_mq_poll+0x48/0x94)

> [<c0758660>] (cpsw_tx_mq_poll) from [<c0803018>] (net_rx_action+0x108/0x4e4)

> [<c0803018>] (net_rx_action) from [<c010230c>] (__do_softirq+0xec/0x598)

> [<c010230c>] (__do_softirq) from [<c0143914>] (do_softirq.part.4+0x68/0x74)

> [<c0143914>] (do_softirq.part.4) from [<c0143a44>] (__local_bh_enable_ip+0x124/0x17c)

> [<c0143a44>] (__local_bh_enable_ip) from [<c0871590>] (ip_finish_output2+0x294/0xb7c)

> [<c0871590>] (ip_finish_output2) from [<c0875440>] (ip_output+0x210/0x364)

> [<c0875440>] (ip_output) from [<c0875e2c>] (ip_send_skb+0x1c/0xf8)

> [<c0875e2c>] (ip_send_skb) from [<c08a7fd4>] (raw_sendmsg+0x9a8/0xc74)

> [<c08a7fd4>] (raw_sendmsg) from [<c07d6b90>] (sock_sendmsg+0x14/0x24)

> [<c07d6b90>] (sock_sendmsg) from [<c07d8260>] (__sys_sendto+0xbc/0x100)

> [<c07d8260>] (__sys_sendto) from [<c01011ac>] (__sys_trace_return+0x0/0x14)

> Exception stack(0xea9a7fa8 to 0xea9a7ff0)

> ...

> 

> The reason is that cpdma_chan_submit_si() now stores original buffer length

> (sw_len) in CPDMA descriptor instead of adjusted buffer length (hw_len)

> used to map the buffer.

> 

> Hence, fix an issue by passing correct buffer length in CPDMA descriptor.

> 

> Cc: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>

> Fixes: 6670acacd59e ("net: ethernet: ti: davinci_cpdma: add dma mapped submit")

> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>

> ---

> changes in v3:

>  - removed swlen local var


Applied and queued up for -stable, thanks.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c
index 37ba708ac781..6614fa3089b2 100644
--- a/drivers/net/ethernet/ti/davinci_cpdma.c
+++ b/drivers/net/ethernet/ti/davinci_cpdma.c
@@ -1018,7 +1018,6 @@  static int cpdma_chan_submit_si(struct submit_info *si)
 	struct cpdma_chan		*chan = si->chan;
 	struct cpdma_ctlr		*ctlr = chan->ctlr;
 	int				len = si->len;
-	int				swlen = len;
 	struct cpdma_desc __iomem	*desc;
 	dma_addr_t			buffer;
 	u32				mode;
@@ -1046,7 +1045,6 @@  static int cpdma_chan_submit_si(struct submit_info *si)
 	if (si->data_dma) {
 		buffer = si->data_dma;
 		dma_sync_single_for_device(ctlr->dev, buffer, len, chan->dir);
-		swlen |= CPDMA_DMA_EXT_MAP;
 	} else {
 		buffer = dma_map_single(ctlr->dev, si->data_virt, len, chan->dir);
 		ret = dma_mapping_error(ctlr->dev, buffer);
@@ -1065,7 +1063,8 @@  static int cpdma_chan_submit_si(struct submit_info *si)
 	writel_relaxed(mode | len, &desc->hw_mode);
 	writel_relaxed((uintptr_t)si->token, &desc->sw_token);
 	writel_relaxed(buffer, &desc->sw_buffer);
-	writel_relaxed(swlen, &desc->sw_len);
+	writel_relaxed(si->data_dma ? len | CPDMA_DMA_EXT_MAP : len,
+		       &desc->sw_len);
 	desc_read(desc, sw_len);
 
 	__cpdma_chan_submit(chan, desc);