* [PATCH] mmc: jz4740: Apply DMA engine limits to maximum segment size
@ 2022-04-11 15:37 Aidan MacDonald
2022-04-21 13:54 ` Ulf Hansson
0 siblings, 1 reply; 2+ messages in thread
From: Aidan MacDonald @ 2022-04-11 15:37 UTC (permalink / raw)
To: paul, ulf.hansson; +Cc: linux-mips, linux-mmc, linux-kernel
Do what is done in other DMA-enabled MMC host drivers (cf. host/mmci.c) and
limit the maximum segment size based on the DMA engine's capabilities. This
is needed to avoid warnings like the following with CONFIG_DMA_API_DEBUG=y.
------------[ cut here ]------------
WARNING: CPU: 0 PID: 21 at kernel/dma/debug.c:1162 debug_dma_map_sg+0x2f4/0x39c
DMA-API: jz4780-dma 13420000.dma-controller: mapping sg segment longer than device claims to support [len=98304] [max=65536]
CPU: 0 PID: 21 Comm: kworker/0:1H Not tainted 5.18.0-rc1 #19
Workqueue: kblockd blk_mq_run_work_fn
Stack : 81575aec 00000004 80620000 80620000 80620000 805e7358 00000009 801537ac
814c832c 806276e3 806e34b4 80620000 81575aec 00000001 81575ab8 09291444
00000000 00000000 805e7358 81575958 ffffffea 8157596c 00000000 636f6c62
6220646b 80387a70 0000000f 6d5f6b6c 80620000 00000000 81575ba4 00000009
805e170c 80896640 00000001 00010000 00000000 00000000 00006098 806e0000
...
Call Trace:
[<80107670>] show_stack+0x84/0x120
[<80528cd8>] __warn+0xb8/0xec
[<80528d78>] warn_slowpath_fmt+0x6c/0xb8
[<8016f1d4>] debug_dma_map_sg+0x2f4/0x39c
[<80169d4c>] __dma_map_sg_attrs+0xf0/0x118
[<8016a27c>] dma_map_sg_attrs+0x14/0x28
[<804f66b4>] jz4740_mmc_prepare_dma_data+0x74/0xa4
[<804f6714>] jz4740_mmc_pre_request+0x30/0x54
[<804f4ff4>] mmc_blk_mq_issue_rq+0x6e0/0x7bc
[<804f5590>] mmc_mq_queue_rq+0x220/0x2d4
[<8038b2c0>] blk_mq_dispatch_rq_list+0x480/0x664
[<80391040>] blk_mq_do_dispatch_sched+0x2dc/0x370
[<80391468>] __blk_mq_sched_dispatch_requests+0xec/0x164
[<80391540>] blk_mq_sched_dispatch_requests+0x44/0x94
[<80387900>] __blk_mq_run_hw_queue+0xb0/0xcc
[<80134c14>] process_one_work+0x1b8/0x264
[<80134ff8>] worker_thread+0x2ec/0x3b8
[<8013b13c>] kthread+0x104/0x10c
[<80101dcc>] ret_from_kernel_thread+0x14/0x1c
---[ end trace 0000000000000000 ]---
Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
---
drivers/mmc/host/jz4740_mmc.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/drivers/mmc/host/jz4740_mmc.c b/drivers/mmc/host/jz4740_mmc.c
index 7ab1b38a7be5..b1d563b2ed1b 100644
--- a/drivers/mmc/host/jz4740_mmc.c
+++ b/drivers/mmc/host/jz4740_mmc.c
@@ -247,6 +247,26 @@ static int jz4740_mmc_acquire_dma_channels(struct jz4740_mmc_host *host)
return PTR_ERR(host->dma_rx);
}
+ /*
+ * Limit the maximum segment size in any SG entry according to
+ * the parameters of the DMA engine device.
+ */
+ if (host->dma_tx) {
+ struct device *dev = host->dma_tx->device->dev;
+ unsigned int max_seg_size = dma_get_max_seg_size(dev);
+
+ if (max_seg_size < host->mmc->max_seg_size)
+ host->mmc->max_seg_size = max_seg_size;
+ }
+
+ if (host->dma_rx) {
+ struct device *dev = host->dma_rx->device->dev;
+ unsigned int max_seg_size = dma_get_max_seg_size(dev);
+
+ if (max_seg_size < host->mmc->max_seg_size)
+ host->mmc->max_seg_size = max_seg_size;
+ }
+
return 0;
}
--
2.35.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] mmc: jz4740: Apply DMA engine limits to maximum segment size
2022-04-11 15:37 [PATCH] mmc: jz4740: Apply DMA engine limits to maximum segment size Aidan MacDonald
@ 2022-04-21 13:54 ` Ulf Hansson
0 siblings, 0 replies; 2+ messages in thread
From: Ulf Hansson @ 2022-04-21 13:54 UTC (permalink / raw)
To: Aidan MacDonald; +Cc: paul, linux-mips, linux-mmc, linux-kernel
On Mon, 11 Apr 2022 at 17:37, Aidan MacDonald
<aidanmacdonald.0x0@gmail.com> wrote:
>
> Do what is done in other DMA-enabled MMC host drivers (cf. host/mmci.c) and
> limit the maximum segment size based on the DMA engine's capabilities. This
> is needed to avoid warnings like the following with CONFIG_DMA_API_DEBUG=y.
>
> ------------[ cut here ]------------
> WARNING: CPU: 0 PID: 21 at kernel/dma/debug.c:1162 debug_dma_map_sg+0x2f4/0x39c
> DMA-API: jz4780-dma 13420000.dma-controller: mapping sg segment longer than device claims to support [len=98304] [max=65536]
> CPU: 0 PID: 21 Comm: kworker/0:1H Not tainted 5.18.0-rc1 #19
> Workqueue: kblockd blk_mq_run_work_fn
> Stack : 81575aec 00000004 80620000 80620000 80620000 805e7358 00000009 801537ac
> 814c832c 806276e3 806e34b4 80620000 81575aec 00000001 81575ab8 09291444
> 00000000 00000000 805e7358 81575958 ffffffea 8157596c 00000000 636f6c62
> 6220646b 80387a70 0000000f 6d5f6b6c 80620000 00000000 81575ba4 00000009
> 805e170c 80896640 00000001 00010000 00000000 00000000 00006098 806e0000
> ...
> Call Trace:
> [<80107670>] show_stack+0x84/0x120
> [<80528cd8>] __warn+0xb8/0xec
> [<80528d78>] warn_slowpath_fmt+0x6c/0xb8
> [<8016f1d4>] debug_dma_map_sg+0x2f4/0x39c
> [<80169d4c>] __dma_map_sg_attrs+0xf0/0x118
> [<8016a27c>] dma_map_sg_attrs+0x14/0x28
> [<804f66b4>] jz4740_mmc_prepare_dma_data+0x74/0xa4
> [<804f6714>] jz4740_mmc_pre_request+0x30/0x54
> [<804f4ff4>] mmc_blk_mq_issue_rq+0x6e0/0x7bc
> [<804f5590>] mmc_mq_queue_rq+0x220/0x2d4
> [<8038b2c0>] blk_mq_dispatch_rq_list+0x480/0x664
> [<80391040>] blk_mq_do_dispatch_sched+0x2dc/0x370
> [<80391468>] __blk_mq_sched_dispatch_requests+0xec/0x164
> [<80391540>] blk_mq_sched_dispatch_requests+0x44/0x94
> [<80387900>] __blk_mq_run_hw_queue+0xb0/0xcc
> [<80134c14>] process_one_work+0x1b8/0x264
> [<80134ff8>] worker_thread+0x2ec/0x3b8
> [<8013b13c>] kthread+0x104/0x10c
> [<80101dcc>] ret_from_kernel_thread+0x14/0x1c
>
> ---[ end trace 0000000000000000 ]---
>
> Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
Applied for next, thanks!
Kind regards
Uffe
> ---
> drivers/mmc/host/jz4740_mmc.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/drivers/mmc/host/jz4740_mmc.c b/drivers/mmc/host/jz4740_mmc.c
> index 7ab1b38a7be5..b1d563b2ed1b 100644
> --- a/drivers/mmc/host/jz4740_mmc.c
> +++ b/drivers/mmc/host/jz4740_mmc.c
> @@ -247,6 +247,26 @@ static int jz4740_mmc_acquire_dma_channels(struct jz4740_mmc_host *host)
> return PTR_ERR(host->dma_rx);
> }
>
> + /*
> + * Limit the maximum segment size in any SG entry according to
> + * the parameters of the DMA engine device.
> + */
> + if (host->dma_tx) {
> + struct device *dev = host->dma_tx->device->dev;
> + unsigned int max_seg_size = dma_get_max_seg_size(dev);
> +
> + if (max_seg_size < host->mmc->max_seg_size)
> + host->mmc->max_seg_size = max_seg_size;
> + }
> +
> + if (host->dma_rx) {
> + struct device *dev = host->dma_rx->device->dev;
> + unsigned int max_seg_size = dma_get_max_seg_size(dev);
> +
> + if (max_seg_size < host->mmc->max_seg_size)
> + host->mmc->max_seg_size = max_seg_size;
> + }
> +
> return 0;
> }
>
> --
> 2.35.1
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-04-21 13:54 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-11 15:37 [PATCH] mmc: jz4740: Apply DMA engine limits to maximum segment size Aidan MacDonald
2022-04-21 13:54 ` Ulf Hansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).