diff mbox series

[1/2] mmc: cavium: Set the correct dma max segment size for mmc_host

Message ID 20190726023049.27055-2-haokexin@gmail.com (mailing list archive)
State New, archived
Headers show
Series mmc: cavium: Fix two calltraces when the | expand

Commit Message

Kevin Hao July 26, 2019, 2:30 a.m. UTC
We have set the mmc_host.max_seg_size to 8M, but the dma max segment
size of PCI device is set to 64K by default in function pci_device_add().
The mmc_host.max_seg_size is used to set the max segment size of
the blk queue. Then this mismatch will trigger a calltrace like below
when a bigger than 64K segment request arrives at mmc dev. So we should
consider the limitation of the cvm_mmc_host when setting the
mmc_host.max_seg_size.
  DMA-API: thunderx_mmc 0000:01:01.4: mapping sg segment longer than device claims to support [len=131072] [max=65536]
  WARNING: CPU: 6 PID: 238 at kernel/dma/debug.c:1221 debug_dma_map_sg+0x2b8/0x350
  Modules linked in:
  CPU: 6 PID: 238 Comm: kworker/6:1H Not tainted 5.3.0-rc1-next-20190724-yocto-standard+ #62
  Hardware name: Marvell OcteonTX CN96XX board (DT)
  Workqueue: kblockd blk_mq_run_work_fn
  pstate: 80c00009 (Nzcv daif +PAN +UAO)
  pc : debug_dma_map_sg+0x2b8/0x350
  lr : debug_dma_map_sg+0x2b8/0x350
  sp : ffff00001770f9e0
  x29: ffff00001770f9e0 x28: ffffffff00000000
  x27: 00000000ffffffff x26: ffff800bc2c73180
  x25: ffff000010e83700 x24: 0000000000000002
  x23: 0000000000000001 x22: 0000000000000001
  x21: 0000000000000000 x20: ffff800bc48ba0b0
  x19: ffff800bc97e8c00 x18: ffffffffffffffff
  x17: 0000000000000000 x16: 0000000000000000
  x15: ffff000010e835c8 x14: 6874207265676e6f
  x13: 6c20746e656d6765 x12: 7320677320676e69
  x11: 7070616d203a342e x10: 31303a31303a3030
  x9 : 303020636d6d5f78 x8 : 35363d78616d5b20
  x7 : 00000000000002fd x6 : ffff000010fd57dc
  x5 : 0000000000000000 x4 : ffff0000106c61f0
  x3 : 00000000ffffffff x2 : 0000800bee060000
  x1 : 7010678df3041a00 x0 : 0000000000000000
  Call trace:
   debug_dma_map_sg+0x2b8/0x350
   cvm_mmc_request+0x3c4/0x988
   __mmc_start_request+0x9c/0x1f8
   mmc_start_request+0x7c/0xb0
   mmc_blk_mq_issue_rq+0x5c4/0x7b8
   mmc_mq_queue_rq+0x11c/0x278
   blk_mq_dispatch_rq_list+0xb0/0x568
   blk_mq_do_dispatch_sched+0x6c/0x108
   blk_mq_sched_dispatch_requests+0x110/0x1b8
   __blk_mq_run_hw_queue+0xb0/0x118
   blk_mq_run_work_fn+0x28/0x38
   process_one_work+0x210/0x490
   worker_thread+0x48/0x458
   kthread+0x130/0x138
   ret_from_fork+0x10/0x1c

Signed-off-by: Kevin Hao <haokexin@gmail.com>
---
 drivers/mmc/host/cavium.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Ulf Hansson Aug. 2, 2019, 3:16 p.m. UTC | #1
On Fri, 26 Jul 2019 at 04:32, Kevin Hao <haokexin@gmail.com> wrote:
>
> We have set the mmc_host.max_seg_size to 8M, but the dma max segment
> size of PCI device is set to 64K by default in function pci_device_add().
> The mmc_host.max_seg_size is used to set the max segment size of
> the blk queue. Then this mismatch will trigger a calltrace like below
> when a bigger than 64K segment request arrives at mmc dev. So we should
> consider the limitation of the cvm_mmc_host when setting the
> mmc_host.max_seg_size.
>   DMA-API: thunderx_mmc 0000:01:01.4: mapping sg segment longer than device claims to support [len=131072] [max=65536]
>   WARNING: CPU: 6 PID: 238 at kernel/dma/debug.c:1221 debug_dma_map_sg+0x2b8/0x350
>   Modules linked in:
>   CPU: 6 PID: 238 Comm: kworker/6:1H Not tainted 5.3.0-rc1-next-20190724-yocto-standard+ #62
>   Hardware name: Marvell OcteonTX CN96XX board (DT)
>   Workqueue: kblockd blk_mq_run_work_fn
>   pstate: 80c00009 (Nzcv daif +PAN +UAO)
>   pc : debug_dma_map_sg+0x2b8/0x350
>   lr : debug_dma_map_sg+0x2b8/0x350
>   sp : ffff00001770f9e0
>   x29: ffff00001770f9e0 x28: ffffffff00000000
>   x27: 00000000ffffffff x26: ffff800bc2c73180
>   x25: ffff000010e83700 x24: 0000000000000002
>   x23: 0000000000000001 x22: 0000000000000001
>   x21: 0000000000000000 x20: ffff800bc48ba0b0
>   x19: ffff800bc97e8c00 x18: ffffffffffffffff
>   x17: 0000000000000000 x16: 0000000000000000
>   x15: ffff000010e835c8 x14: 6874207265676e6f
>   x13: 6c20746e656d6765 x12: 7320677320676e69
>   x11: 7070616d203a342e x10: 31303a31303a3030
>   x9 : 303020636d6d5f78 x8 : 35363d78616d5b20
>   x7 : 00000000000002fd x6 : ffff000010fd57dc
>   x5 : 0000000000000000 x4 : ffff0000106c61f0
>   x3 : 00000000ffffffff x2 : 0000800bee060000
>   x1 : 7010678df3041a00 x0 : 0000000000000000
>   Call trace:
>    debug_dma_map_sg+0x2b8/0x350
>    cvm_mmc_request+0x3c4/0x988
>    __mmc_start_request+0x9c/0x1f8
>    mmc_start_request+0x7c/0xb0
>    mmc_blk_mq_issue_rq+0x5c4/0x7b8
>    mmc_mq_queue_rq+0x11c/0x278
>    blk_mq_dispatch_rq_list+0xb0/0x568
>    blk_mq_do_dispatch_sched+0x6c/0x108
>    blk_mq_sched_dispatch_requests+0x110/0x1b8
>    __blk_mq_run_hw_queue+0xb0/0x118
>    blk_mq_run_work_fn+0x28/0x38
>    process_one_work+0x210/0x490
>    worker_thread+0x48/0x458
>    kthread+0x130/0x138
>    ret_from_fork+0x10/0x1c
>
> Signed-off-by: Kevin Hao <haokexin@gmail.com>

Applied for fixes and by adding a stable/fixes tag, thanks!

Kind regards
Uffe


> ---
>  drivers/mmc/host/cavium.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/cavium.c b/drivers/mmc/host/cavium.c
> index ed5cefb83768..c956813bc6bd 100644
> --- a/drivers/mmc/host/cavium.c
> +++ b/drivers/mmc/host/cavium.c
> @@ -1046,7 +1046,8 @@ int cvm_mmc_of_slot_probe(struct device *dev, struct cvm_mmc_host *host)
>                 mmc->max_segs = 1;
>
>         /* DMA size field can address up to 8 MB */
> -       mmc->max_seg_size = 8 * 1024 * 1024;
> +       mmc->max_seg_size = min_t(unsigned int, 8 * 1024 * 1024,
> +                                 dma_get_max_seg_size(host->dev));
>         mmc->max_req_size = mmc->max_seg_size;
>         /* External DMA is in 512 byte blocks */
>         mmc->max_blk_size = 512;
> --
> 2.14.4
>
diff mbox series

Patch

diff --git a/drivers/mmc/host/cavium.c b/drivers/mmc/host/cavium.c
index ed5cefb83768..c956813bc6bd 100644
--- a/drivers/mmc/host/cavium.c
+++ b/drivers/mmc/host/cavium.c
@@ -1046,7 +1046,8 @@  int cvm_mmc_of_slot_probe(struct device *dev, struct cvm_mmc_host *host)
 		mmc->max_segs = 1;
 
 	/* DMA size field can address up to 8 MB */
-	mmc->max_seg_size = 8 * 1024 * 1024;
+	mmc->max_seg_size = min_t(unsigned int, 8 * 1024 * 1024,
+				  dma_get_max_seg_size(host->dev));
 	mmc->max_req_size = mmc->max_seg_size;
 	/* External DMA is in 512 byte blocks */
 	mmc->max_blk_size = 512;