From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932558AbcFUFdD (ORCPT ); Tue, 21 Jun 2016 01:33:03 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:38068 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752465AbcFUFdA (ORCPT ); Tue, 21 Jun 2016 01:33:00 -0400 X-AuditID: cbfee68f-f79476d000001429-cf-5768d189a0ed Message-id: <5768D188.3080508@samsung.com> Date: Tue, 21 Jun 2016 14:32:56 +0900 From: Jaehoon Chung User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-version: 1.0 To: Shawn Lin , Seung-Woo Kim , ulf.hansson@linaro.org, linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: mmc: dw_mmc: warning with CONFIG_DMA_API_DEBUG References: <001501d1cace$9b8f2b60$d2ad8220$@samsung.com> <000801d1cb64$070dfb60$1529f220$@samsung.com> In-reply-to: Content-type: text/plain; charset=windows-1252 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpnkeLIzCtJLcpLzFFi42JZI2JSoNt5MSPc4MYHVovLu+awWRz5389o cefJelaLGZNfslkcXxvuwOpx59oeNo+/s/azePRtWcXo8XmTXABLFJdNSmpOZllqkb5dAlfG 3zUd7AUz/Ss+nfrB3sA4yaGLkZNDQsBEou/5SVYIW0ziwr31bF2MXBxCAisYJdbc/s0MU3Si /w0jRGIpo8TEvg6whJDAA0aJl7f5QWxeAS2JmXtPMYLYLAKqEjfXbgSbyiagI7H923EmEFtU IEziwbq9rBD1ghI/Jt9jARkqAjL0zsU/YM3CAtYS/ecmskJsW8skcWDjNzaQBKeAk8TLBXuB ijg4mAX0JO5f1AIJMwvIS2xe85YZpF5CYBO7xJf9E1kgrhCQ+Db5EAtIvYSArMSmA1DfSEoc XHGDZQKj6Cwkd8xCmDoLydQFjMyrGEVTC5ILipPSi4z1ihNzi0vz0vWS83M3MQLj5/S/Z/07 GO8esD7EKMDBqMTDK5CTES7EmlhWXJl7iNEU6IiJzFKiyfnAKM0riTc0NjOyMDUxNTYytzRT EuddKPUzWEggPbEkNTs1tSC1KL6oNCe1+BAjEwenVANjkHuF96ot90qTvN/dvXAyJSRzSdhk 0a1tSrJJK6ffuV4sErpubfZG9cKK25u/sje1OZ8puRm42PN24N+cjKLP2iyt0r/LNuS/3GCV L/nydtGmib+NJ+xdIzpNbtmT2PdPTlzbk9rHeVf9QIOS5r7LOxpSr2yvmrLbVv+Mzo19M+u2 cIVONonfocRSnJFoqMVcVJwIAO9iZTSaAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrCIsWRmVeSWpSXmKPExsVy+t9jAd2OixnhBh+e2lhc3jWHzeLI/35G iztP1rNazJj8ks3i+NpwB1aPO9f2sHn8nbWfxaNvyypGj8+b5AJYohoYbTJSE1NSixRS85Lz UzLz0m2VvIPjneNNzQwMdQ0tLcyVFPISc1NtlVx8AnTdMnOA9ioplCXmlAKFAhKLi5X07TBN CA1x07WAaYzQ9Q0JgusxMkADCWsYM/6u6WAvmOlf8enUD/YGxkkOXYycHBICJhIn+t8wQthi EhfurWfrYuTiEBJYyigxsa+DGSQhJPCAUeLlbX4Qm1dAS2Lm3lNgDSwCqhI3125kBbHZBHQk tn87zgRiiwqESTxYt5cVol5Q4sfkeywgQ0VAht65+AesWVjAWqL/3ERWiG1rmSQObPzGBpLg FHCSeLlgL1ARBwezgJ7E/YtaIGFmAXmJzWveMk9g5J+FZO4shKpZSKoWMDKvYpRILUguKE5K zzXMSy3XK07MLS7NS9dLzs/dxAiO0WdSOxgP7nI/xCjAwajEw1thmBEuxJpYVlyZe4hRgoNZ SYT34DmgEG9KYmVValF+fFFpTmrxIUZToMcnMkuJJucD00deSbyhsYmZkaWRuaGFkbG5kjjv 4//rwoQE0hNLUrNTUwtSi2D6mDg4pRoY92olzbFq4cwIevdxjaDF1teTXV6+uxAat/s+g+Kk 7wff8Lopt7zUzBa/f/F8pUdKcs5nizVs/fy5Stvlsh+81FrFcdBG+HtD4r2FN883yEiaNEsk hX84t3Nv/+VdBbb7QszZDh6ddsjg6ndFp+dv6q2Zhc57zrwhVy57oYzL69m7iK9CYXanlFiK MxINtZiLihMB1/g9DOcCAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi guys, On 06/21/2016 11:31 AM, Shawn Lin wrote: > On 2016/6/21 10:24, Seung-Woo Kim wrote: >> Hello Shawn, >> >>> -----Original Message----- >>> From: Shawn Lin [mailto:shawn.lin@rock-chips.com] >>> Sent: Tuesday, June 21, 2016 10:52 AM >>> To: Seung-Woo Kim; jh80.chung@samsung.com; ulf.hansson@linaro.org; linux-mmc@vger.kernel.org; linux- >>> kernel@vger.kernel.org >>> Cc: shawn.lin@rock-chips.com >>> Subject: Re: mmc: dw_mmc: warning with CONFIG_DMA_API_DEBUG >>> >>> On 2016/6/20 16:34, Seung-Woo Kim wrote: >>>> 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] >>> >>> Thanks for this report and fix. >>> >>> DTO(the same as IDMAC-RI/TI) interrupts may or may not come together >>> with DATA_ERR. If DATA_ERR occur without geting DTO, we should issue >>> CMD12 manually to generate DTO. It's a ugly deisgn for dwmmc but from >>> the vendor's ask. >>> >>> So you should never think we complete the xfer without >>> checking DATA_ERR. This way you got the warning. Well, EVENT_DATA_ERR is already checked in tasklet_func..and cleared that flags. >>> >>> So could you try this one: >> >> With your patch, there is no more the DMA API waring in my environment. > > Nice to hear that. Thanks for testing, Seung-Woo. Really? It's not solution..When send tuning command, it should be returned CRC error. Then it called the dw_mci_stop_dma() and also dma_ops->complete(). When i applied you suggestion, also produced.. :) [ 2.469916] [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [ 2.469934] [] (show_stack) from [] (dump_stack+0x74/0x94) [ 2.469949] [] (dump_stack) from [] (__warn+0xd4/0x100) [ 2.469961] [] (__warn) from [] (warn_slowpath_fmt+0x38/0x48) [ 2.469975] [] (warn_slowpath_fmt) from [] (check_unmap+0x828/0x8a8) [ 2.469991] [] (check_unmap) from [] (debug_dma_unmap_sg+0x5c/0x13c) [ 2.470012] [] (debug_dma_unmap_sg) from [] (dw_mci_dma_cleanup+0x68/0xa4) [ 2.470029] [] (dw_mci_dma_cleanup) from [] (dw_mci_stop_dma+0x30/0x40) [ 2.470045] [] (dw_mci_stop_dma) from [] (dw_mci_tasklet_func+0x340/0x3b4) [ 2.470063] [] (dw_mci_tasklet_func) from [] (tasklet_action+0x84/0x12c) [ 2.470076] [] (tasklet_action) from [] (__do_softirq+0xec/0x244) [ 2.470089] [] (__do_softirq) from [] (irq_exit+0xb4/0xf8) [ 2.470109] [] (irq_exit) from [] (__handle_domain_irq+0x70/0xe4) [ 2.470123] [] (__handle_domain_irq) from [] (gic_handle_irq+0x50/0x9c) [ 2.470135] [] (gic_handle_irq) from [] (__irq_svc+0x54/0x90) [ 2.470141] Exception stack(0xee3d3c58 to 0xee3d3ca0) [ 2.470148] 3c40: c0b1ef0c 0000000a [ 2.470159] 3c60: 00000001 0000005c 0000016d 00000000 c0b4f7a4 00000006 00000000 0000005c [ 2.470170] 3c80: 00000006 c0b671e8 60000013 ee3d3ca8 c0398e08 c015b830 60000013 ffffffff [ 2.470183] [] (__irq_svc) from [] (console_unlock+0x560/0x628) [ 2.470196] [] (console_unlock) from [] (vprintk_emit+0x1fc/0x508) [ 2.470211] [] (vprintk_emit) from [] (dev_vprintk_emit+0xf8/0x198) [ 2.470224] [] (dev_vprintk_emit) from [] (dev_printk_emit+0x1c/0x2c) [ 2.470235] [] (dev_printk_emit) from [] (__dev_printk+0x4c/0x70) [ 2.470246] [] (__dev_printk) from [] (_dev_info+0x38/0x48) [ 2.470258] [] (_dev_info) from [] (usb_new_device+0xe8/0x3d0) [ 2.470270] [] (usb_new_device) from [] (hub_event+0x760/0xff4) [ 2.470289] [] (hub_event) from [] (process_one_work+0x120/0x328) [ 2.470304] [] (process_one_work) from [] (worker_thread+0x2c/0x4ac) [ 2.470321] [] (worker_thread) from [] (kthread+0xd8/0xf4) [ 2.470335] [] (kthread) from [ > Hi Jaehoon, > > How about this? > >> >> Best Regards, >> - Seung-Woo Kim >> >>> >>> --- a/drivers/mmc/host/dw_mmc.c >>> +++ b/drivers/mmc/host/dw_mmc.c >>> @@ -2474,7 +2474,8 @@ static irqreturn_t dw_mci_interrupt(int irq, void >>> *dev_id) >>> mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_TI | >>> >>> SDMMC_IDMAC_INT_RI); >>> mci_writel(host, IDSTS64, SDMMC_IDMAC_INT_NI); >>> - host->dma_ops->complete((void *)host); >>> + if (!test_bit(EVENT_DATA_ERROR, >>> &host->pending_events)) >>> + host->dma_ops->complete((void *)host); >>> } >>> } else { >>> pending = mci_readl(host, IDSTS); >>> @@ -2482,7 +2483,8 @@ static irqreturn_t dw_mci_interrupt(int irq, void >>> *dev_id) >>> mci_writel(host, IDSTS, SDMMC_IDMAC_INT_TI | >>> >>> SDMMC_IDMAC_INT_RI); >>> mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI); >>> - host->dma_ops->complete((void *)host); >>> + if (!test_bit(EVENT_DATA_ERROR, >>> &host->pending_events)) >>> + host->dma_ops->complete((void *)host); >>> } >>> } >>> >>> >>>> [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 >>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >>>> the body of a message to majordomo@vger.kernel.org >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>>> >>> >>> >>> -- >>> Best Regards >>> Shawn Lin >>> >> >> >> >> >> > >