From mboxrd@z Thu Jan 1 00:00:00 1970 From: Seung-Woo Kim Subject: mmc: dw_mmc: warning with CONFIG_DMA_API_DEBUG Date: Mon, 20 Jun 2016 17:34:48 +0900 Message-ID: <001501d1cace$9b8f2b60$d2ad8220$@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Return-path: Received: from mailout3.samsung.com ([203.254.224.33]:59875 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753104AbcFTIeu (ORCPT ); Mon, 20 Jun 2016 04:34:50 -0400 Content-language: ko Sender: linux-mmc-owner@vger.kernel.org List-Id: linux-mmc@vger.kernel.org To: jh80.chung@samsung.com, ulf.hansson@linaro.org, linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, sw0312.kim@samsung.com Hi folks, During booting test on my Exynos5422 based Odroid-XU3, kernel compiled with CONFIG_DMA_API_DEBUG reported following warning: ------------[ cut here ]------------ WARNING: CPU: 0 PID: 0 at lib/dma-debug.c:1096 check_unmap+0x7bc/0xb38 dwmmc_exynos 12200000.mmc: DMA-API: device driver tries to free DMA memory it has not allocated [device address=0x000000006d9d2200] [size=128 bytes] Modules linked in: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.7.0-rc4 #26 Hardware name: SAMSUNG EXYNOS (Flattened Device Tree) [] (unwind_backtrace) from [] (show_stack+0x20/0x24) [] (show_stack) from [] (dump_stack+0x80/0x94) [] (dump_stack) from [] (__warn+0xf8/0x110) [] (__warn) from [] (warn_slowpath_fmt+0x48/0x50) [] (warn_slowpath_fmt) from [] (check_unmap+0x7bc/0xb38) [] (check_unmap) from [] (debug_dma_unmap_sg+0x118/0x148) [] (debug_dma_unmap_sg) from [] (dw_mci_dma_cleanup+0x7c/0xb8) [] (dw_mci_dma_cleanup) from [] (dw_mci_stop_dma+0x40/0x50) [] (dw_mci_stop_dma) from [] (dw_mci_tasklet_func+0x130/0x3b4) [] (dw_mci_tasklet_func) from [] (tasklet_action+0xb4/0x150) [] (tasklet_action) from [] (__do_softirq+0xe4/0x3cc) [] (__do_softirq) from [] (irq_exit+0xd0/0x10c) [] (irq_exit) from [] (__handle_domain_irq+0x90/0xfc) [] (__handle_domain_irq) from [] (gic_handle_irq+0x64/0xa8) [] (gic_handle_irq) from [] (__irq_svc+0x54/0x90) Exception stack(0xc1101ef8 to 0xc1101f40) 1ee0: 00000001 00000000 1f00: 00000000 c011b600 c1100000 c110753c 00000000 c11c3984 c11074d4 c1107548 1f20: 00000000 c1101f54 c1101f58 c1101f48 c010a1fc c010a200 60000013 ffffffff [] (__irq_svc) from [] (arch_cpu_idle+0x48/0x4c) [] (arch_cpu_idle) from [] (default_idle_call+0x30/0x3c) [] (default_idle_call) from [] (cpu_startup_entry+0x358/0x3b4) [] (cpu_startup_entry) from [] (rest_init+0x94/0x98) [] (rest_init) from [] (start_kernel+0x3a4/0x3b0) [] (start_kernel) from [<4000807c>] (0x4000807c) ---[ end trace 256f83eed365daf0 ]--- The warning occurs because after complete callback function, dw_mci_dmac_complete_dma() is called, then dw_mci_stop_dma() is called again. So it causes dma_unmap_sg() is called twice for same sg. It occurs during clock setting at booting time. Simply, clearing host->using_dma flag on dw_mci_dmac_complete_dma() and dw_mci_stop_dma() like following fixes the issue, but I am not sure this approach is proper. --- diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 2cc6123..a71c94b 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -388,6 +388,7 @@ static void dw_mci_stop_dma(struct dw_mci *host) if (host->using_dma) { host->dma_ops->stop(host); host->dma_ops->cleanup(host); + host->using_dma = 0; } /* Data transfer was stopped by the interrupt handler */ @@ -455,6 +456,7 @@ static void dw_mci_dmac_complete_dma(void *arg) DMA_FROM_DEVICE); host->dma_ops->cleanup(host); + host->using_dma = 0; /* * If the card was removed, data will be NULL. No point in trying to @@ -943,8 +945,6 @@ static int dw_mci_submit_data_dma(struct dw_mci *host, struct mmc_data *data) int sg_len; u32 temp; - host->using_dma = 0; - /* If we don't have a channel, we can't do DMA */ if (!host->use_dma) return -ENODEV; --- Best Regards, - Seung-Woo Kim