From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752546AbcF2BbN (ORCPT ); Tue, 28 Jun 2016 21:31:13 -0400 Received: from mailout3.samsung.com ([203.254.224.33]:51141 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752440AbcF2BbK (ORCPT ); Tue, 28 Jun 2016 21:31:10 -0400 X-AuditID: cbfee68f-f79476d000001429-96-577324dbaf5f Message-id: <577324DA.9010703@samsung.com> Date: Wed, 29 Jun 2016 10:31:06 +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 Cc: Seung-Woo Kim , Ulf Hansson , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] mmc: dw_mmc: fix unmap sg twice when finding data err References: <1466753992-13727-1-git-send-email-shawn.lin@rock-chips.com> In-reply-to: <1466753992-13727-1-git-send-email-shawn.lin@rock-chips.com> Content-type: text/plain; charset=windows-1252 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprMIsWRmVeSWpSXmKPExsWyRsSkUPe2SnG4wZpOSYvLu+awWRz5389o cefJelaLGZNfslkcXxvuwOpx59oeNo+/s/azePRtWcXo8XmTXABLFJdNSmpOZllqkb5dAlfG ix+PWQp2KFTMWfyEuYFxhXQXIweHhICJxOadaV2MnECmmMSFe+vZuhi5OIQEVjBKTFw0kREi YSKxd9Z0JojEUkaJmUtuQTkPGCX+LfnOAlLFK6Al8bFxAZjNIqAq0fX2OxOIzSagI7H923Ew W1QgTOLBur2sEPWCEj8m3wOrFxHQkLhx9jrYamaBXkaJhlaI1cICXhLbj26Aumkeo8SaA0fY QBKcAp4SW/6uYQP5gVlAT+L+RS2QMLOAvMTmNW+ZQeolBPaxS1x7s4AV4iIBiW+TD7FA/Cwr sekAM8RrkhIHV9xgmcAoNgvJTbMQps5CMnUBI/MqRtHUguSC4qT0ImO94sTc4tK8dL3k/NxN jMC4Ov3vWf8OxrsHrA8xCnAwKvHwTrhUFC7EmlhWXJl7iNEU6IiJzFKiyfnA6M0riTc0NjOy MDUxNTYytzRTEuddKPUzWEggPbEkNTs1tSC1KL6oNCe1+BAjEwenVAPjtvhdUw9f53gVc8Ok 6lG2RlrlLx/PrNPvtDVtrq3s897ObxrkHHOkvLPf1HbayqP/VzV33hLYzHQ+nvm0e8HUn89a bzJMPDnznsWTycsvhClGzjec3KFYpGzb4+PN1M0wc+F+ccarJ79diV4dxpR4pV72rIQh75V4 vh2v7b9ee9zMnO8UPC9TiaU4I9FQi7moOBEA2LBKvKYCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrIIsWRmVeSWpSXmKPExsVy+t9jAd3bKsXhBr+vCVtc3jWHzeLI/35G iztP1rNazJj8ks3i+NpwB1aPO9f2sHn8nbWfxaNvyypGj8+b5AJYohoYbTJSE1NSixRS85Lz UzLz0m2VvIPjneNNzQwMdQ0tLcyVFPISc1NtlVx8AnTdMnOA9ioplCXmlAKFAhKLi5X07TBN CA1x07WAaYzQ9Q0JgusxMkADCWsYM178eMxSsEOhYs7iJ8wNjCukuxg5OSQETCT2zprOBGGL SVy4t56ti5GLQ0hgKaPEzCW3mCCcB4wS/5Z8ZwGp4hXQkvjYuADMZhFQleh6+x2sm01AR2L7 t+NgtqhAmMSDdXtZIeoFJX5MvgdWLyKgIXHj7HWwDcwCvYwSDa0TGUESwgJeEtuPboBaPY9R Ys2BI2wgCU4BT4ktf9cA2RxAHXoS9y9qgYSZBeQlNq95yzyBUWAWkh2zEKpmIalawMi8ilEi tSC5oDgpPdcwL7Vcrzgxt7g0L10vOT93EyM4ep9J7WA8uMv9EKMAB6MSD++LK0XhQqyJZcWV uYcYJTiYlUR45ysXhwvxpiRWVqUW5ccXleakFh9iNAUGwkRmKdHkfGBiySuJNzQ2MTOyNDI3 tDAyNlcS5338f12YkEB6YklqdmpqQWoRTB8TB6dUAyPTpZ/TewWLzzZ+vBwg+OJhdteck/FX g5J7F7CobF1p9tmT3ddHdHvQtfwUmUtHmw4frv5bcOfyYvtVwaejPO2OPW1k3c7/4eFl+aDT xaeEFiQbbFtu8K/g2PlfzfsP6MV+D57HF776T8iSqWdrb965PEG339BeY9mdILvG7RkX1n1K Pn5zresDJZbijERDLeai4kQAQwHc2fQCAAA= 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 Shawn, On 06/24/2016 04:39 PM, Shawn Lin wrote: > DATA_OVER(the same for RI/TI of IDMAC) interrupt may come > up together with data error interrupts. If so, the interrupt > routine set EVENT_DATA_ERR to the pending_events and schedule > the tasklet but we may still fallback to the IDMAC interrupt > case as the tasklet may come up a little late, namely right > after the IDMAC interrupt checking. This will casue dw_mmc > unmap sg twice. We can easily see it with CONFIG_DMA_API_DEBUG > enabled. > > 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 ]--- > > Reported-by: Seung-Woo Kim > Signed-off-by: Shawn Lin Applied this patch on my repository. Thanks! Best Regards, Jaehoon Chung > --- > > drivers/mmc/host/dw_mmc.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index 8012858..7e88541 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -2473,7 +2473,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); > @@ -2481,7 +2482,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); > } > } > >