On Fri, 26 Jul 2019 at 04:32, Kevin Hao <haokexin@xxxxxxxxx> 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@xxxxxxxxx> 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 >