From patchwork Fri Aug 7 09:29:50 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haibo Chen X-Patchwork-Id: 6967161 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id C317EC05AC for ; Fri, 7 Aug 2015 09:29:56 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 38E84205F1 for ; Fri, 7 Aug 2015 09:29:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 540E3202A1 for ; Fri, 7 Aug 2015 09:29:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751883AbbHGJ3v (ORCPT ); Fri, 7 Aug 2015 05:29:51 -0400 Received: from mail-bl2on0107.outbound.protection.outlook.com ([65.55.169.107]:17248 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751483AbbHGJ3s (ORCPT ); Fri, 7 Aug 2015 05:29:48 -0400 Received: from BN3PR0301CA0038.namprd03.prod.outlook.com (10.160.180.176) by CY1PR03MB1421.namprd03.prod.outlook.com (10.163.17.143) with Microsoft SMTP Server (TLS) id 15.1.225.19; Fri, 7 Aug 2015 09:29:45 +0000 Received: from BN1BFFO11FD033.protection.gbl (2a01:111:f400:7c10::1:114) by BN3PR0301CA0038.outlook.office365.com (2a01:111:e400:4000::48) with Microsoft SMTP Server (TLS) id 15.1.225.19 via Frontend Transport; Fri, 7 Aug 2015 09:29:44 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; vger.kernel.org; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BN1BFFO11FD033.mail.protection.outlook.com (10.58.144.96) with Microsoft SMTP Server (TLS) id 15.1.243.9 via Frontend Transport; Fri, 7 Aug 2015 09:29:44 +0000 Received: from b51421-server.ap.freescale.net (b51421-server.ap.freescale.net [10.193.102.57]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t779TeZi014049; Fri, 7 Aug 2015 02:29:41 -0700 From: Haibo Chen To: , CC: , , , , , , Subject: [PATCH] mmc: sdhci: fix dma memory leak in sdhci_pre_req() Date: Fri, 7 Aug 2015 17:29:50 +0800 Message-ID: <1438939790-28310-1-git-send-email-haibo.chen@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD033; 1:s4lKTaWsT6YraMxGzO8SXRqdDddMq8NkRaxg8fTCfB/6D+rTvs+bQ/STaTEG0Fu2g63pK5NuECB4NsWzcPimz3y/9ZD3rEs12RuUFe5J5wcC3aIGydEXs3Xkhr5u1ZAjiA7jjof3efBpET4/8bPQdB2aCiJKj5KdCXMmVtgNyO+3CS4cxok7uljTNIZWh3Rml1Bi/XBmh/J6aFaDZBdR/4ks0Fh0amWwgUiFeCemuJydbGgBAbDQwzg+W0qjrC9iHDW5pUP52N8SrOqHVBPLXSu4IgHDu9I0B+Vj77p6XEY+6IAS8h42WymwRK+a7E8HzkbdLKa7lLLm8ww9wmJzQg== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(339900001)(189002)(199003)(19580405001)(48376002)(77096005)(62966003)(68736005)(77156002)(87936001)(92566002)(50226001)(50466002)(5003940100001)(189998001)(36756003)(46102003)(50986999)(104016003)(229853001)(33646002)(5001960100002)(69596002)(47776003)(19580395003)(64706001)(105606002)(86362001)(81156007)(85426001)(5001770100001)(5001860100001)(106466001)(97736004)(6806004)(5001830100001)(4001540100001); DIR:OUT; SFP:1102; SCL:1; SRVR:CY1PR03MB1421; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1421; 2:rEQT0N3wSlvQ7ruHmBu623bs9y5C1jz5EMG/rxcmp1esLmhHsiSG4LFxWwr1W3cAPWfWc8kszgbF+cDlyRA1vHZR/JJ0gWf9rcMU0Z3HA32lUsgxHuiO96HO8a8YIXEYKOcjN4DumhqblKR/9ziHN48UOuyYcj9oEyAQdtm0krE=; 3:iwmxxnr9r/kv9SZaH26iEEas308eIO5x0NHrSoevZHnZZ5d0mFGawl+at42y8N17a4s8oHgjq+HTIpLS443OlUPM54f7ZoOxZyGn1RWFqWbgfbLLK5g0U7y0aNUFS91UnpnEuJMdpUiiuvFi2bbki4+lJuxSzAXZ6oGrjKiO3LFp+MB32+CJwJCVEk6ySTOIhfVV7q6YA/oc026/9vUdWB47BHCzfz+Xtg9GrqsHz2Q=; 25:NEC+plLNWfm9wiahdsUHqhpGUFbn9u51CkMyVXqWWsBE5/FLxgGKjJaKgzbAMUBbU6mDVlgUqZxj+VoWTFg22Rw7/DpAdFqhUbmQS/s0+M0AXtOwo2neo/TNOYfFDTOsm7cZV1ypl6Tfz006h4Y/wxJKfky4git6hSY7vk0ABGV44iuLU0EIsiwOIhdLlKtNtVkwi0EDEbq5zBCrKsJAKyu1EcReqfAN60VsxUkJP6wlFLQ5XXJDJWTIrPJV8edq6LB8GNaGJKj5yI3ShraYSA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1421; X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1421; 20:xlwGF0ca8uP+lsfFCOlx0P43lLURa8CBivHoVdpIWns9FF/Vfzup36RLUKq9Ii9OR7NiqVOkiTdTjtwyZXFKNNJVaqDZsjIBvQXtFc98dXLFkebbTtCqiUfX6Subhy6DHz3GhXGzvUTEek0TvsLs89JrOezkePr8bANWZg71VP10q616aRCl4z3UXkEbbCIxqM+xJML3LH4eeIGkkOFsA+6n6d3rEyQ0suIpTrI9zaJYNP3zhLYmf/ByqdGZMdYuK+vL/PqMVNOOMUwo+YjUUen5odd2pQzdXdOn21c5hb/ZsrXveT6kiFeE0dqhz0NApa3HtpbSVvb1md5fvuZnreDTmpVQwpz1C1XpinSEmYg=; 4:t27p2fqEdl2Gg1DFLZ8RDTsUSdZn5CaTgQKbagAV2X3O3Fa2ztsgZaKS3j10kJqJc4XBXw4Wb9+c5B2jC5izzd0ty/7pbnsele5ILMEmTcpHH0aQGXoZPWMUy/pTRMCL2ckNWFeHv6aInmoRouSeibY2k07KCeASekVP4eRhpC1aFpywT0/0yEj14j58ctK4vwSuuGxBYPD5ikQp5nVKzdTB4/0dIyGVitNb7pxyQRTkQXnaqQeUjW5rKmNPAn6sxZNiiAkBH5caEstNy0nwF9W4PbA0b2zOL3E8tMIteck= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:CY1PR03MB1421; BCL:0; PCL:0; RULEID:; SRVR:CY1PR03MB1421; X-Forefront-PRVS: 066153096A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR03MB1421; 23:MUX1fi37suuzgQHAds+BNCq3rihRejSpg3bYtWDFi?= =?us-ascii?Q?ozbqpMRIMWYEanDRpFg4n4TMInqS4iZqhPMYOoAYdljy0pMoCp0zFY0ietoj?= =?us-ascii?Q?285f9S3ZAbbejlueX+HjfxeR45Erv7+SyP3pVV204saUxmEzuC9sdoJSO6CB?= =?us-ascii?Q?UAdtm3Vfsl8vmcWSUXxeSa0kSQmoEiy0ZEwy3ZLpDRWTs3Ss5Imq5bDZY2zg?= =?us-ascii?Q?ghUqPYkkIReNVLgJYktpFTaS5b94CN+duR6ASHa5iM2WPNLT8/BD/UeARlCr?= =?us-ascii?Q?cT0/VhNOAXbXDilzBSW5BaxRSMqpXuQNPbus/DI2DwdYjMPTvj0o5/76N0k0?= =?us-ascii?Q?USAEkRWdxJN8s2FZnXfKawWgesW5UewlgBJUgjrlB+yVzBya/RjjOLh7RMOp?= =?us-ascii?Q?x8r3RUEeDjDGPu7/o9f9ZB9rGMhGfdOiUaY1A+chX7gBcbU+ZVvBHSzVImQH?= =?us-ascii?Q?SS2vHyV4ovJfqGBwlw9+e8nLJVB3/4360xg0v/y5oHRFIjDRPR0t956ju8Tq?= =?us-ascii?Q?iiA+lQ/6+WNF9i9WMDpGbqfrvwfPcuqI7a+DEhKSbUjGDz8uXJS6BkLWHbLr?= =?us-ascii?Q?+71jsHnTu+SP7EVUorw1/8n9twvGTM1BFbrcCTgWEpa+/QS6t8Ll/Opx1Lr5?= =?us-ascii?Q?Neh4G3Di7dZoM7oWKatV83cnv6UxqqkuUn0kZGI7QMwtzQu29uLkjsce7Tn/?= =?us-ascii?Q?277UXZTd0Qt92DeMEttl6phYYCmZYPcv5tnLLR2qGQgEgNl15xd1fL1UUh73?= =?us-ascii?Q?TG3R83IKcvg+WqA8o7ARH08opVaCyxuOpy+PDubJWghfauFmVKL9ihv73/EW?= =?us-ascii?Q?LjZx0SUtcrlXEytZBDLIDvoJHJ2HkeszHQoqHcNeKWvall45jrHaZRIuNE+e?= =?us-ascii?Q?WGhu3kWBfKwunZJrh3jdnteCSTQX0nqKB/PI8WpS9yZm8TRUJbj24cQq0jpp?= =?us-ascii?Q?Uht6YbrVno/x9DKLVtaqTuXHu3kzLz4HBw3ytJEGk3vy8OHCYffeuWMik6LD?= =?us-ascii?Q?6YXdA3j0ogtnBoSRkZ9GbZfU7/q02NoYnln2OyivU3NLeu21pDIaJHEDESRT?= =?us-ascii?Q?L4fj5M=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR03MB1421; 5:+Bn4621Sb2OESBTDB0EsRSnJQSqj3PlIlzNW8cO4JRWbbOR/9p4fpJz0Iaz+KyptyZjMF2YGx0eGFGdtB08JT32QYjkgfvvYcsvZ3pB1N5rYAZDs2E5ZeyviqZkjFjMbgpJ+JjtDP/kObIUTlJ6qJg==; 24:0TWreq25SU4Z+/kN7k4Jc8qhgM3JCFQim6gXeCknysj6zgG6mtm3F8MauB0+JRMnmhOEIjFeEK106nWOgyRjhwoqn4ijqv9zTzJxIfDwixw=; 20:xzSOaQKF4cZsEfCh9owNDU2cODNumGSogMm7zl39S+SyT4S11NiWTGGivEQbporcOjVojnhzR8wLHL2XYPvCYg== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Aug 2015 09:29:44.4215 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR03MB1421 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently one mrq->data maybe execute dma_map_sg() twice when mmc subsystem prepare over one new request, and the following log show up: sdhci[sdhci_pre_dma_transfer] invalid cookie: 24, next-cookie 25 In this condition, mrq->date map a dma-memory(1) in sdhci_pre_req for the first time, and map another dma-memory(2) in sdhci_prepare_data for the second time. But driver only unmap the dma-memory(2), and dma-memory(1) never unmapped, which cause the dma memory leak issue. This patch use another method to map the dma memory for the mrq->data which can fix this dma memory leak issue. Fixes: commit 348487cb28e66b0 ("mmc: sdhci: use pipeline mmc requests to improve performance") Cc: stable@vger.kernel.org # 4.0+ Reported-by: Jiri Slaby Signed-off-by: Haibo Chen --- drivers/mmc/host/sdhci.c | 67 ++++++++++++++++++------------------------------ drivers/mmc/host/sdhci.h | 8 +++--- 2 files changed, 29 insertions(+), 46 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index c83d110..8d2864b 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -54,8 +54,7 @@ static void sdhci_finish_command(struct sdhci_host *); static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode); static void sdhci_enable_preset_value(struct sdhci_host *host, bool enable); static int sdhci_pre_dma_transfer(struct sdhci_host *host, - struct mmc_data *data, - struct sdhci_host_next *next); + struct mmc_data *data); static int sdhci_do_get_cd(struct sdhci_host *host); #ifdef CONFIG_PM @@ -495,7 +494,7 @@ static int sdhci_adma_table_pre(struct sdhci_host *host, goto fail; BUG_ON(host->align_addr & host->align_mask); - host->sg_count = sdhci_pre_dma_transfer(host, data, NULL); + host->sg_count = sdhci_pre_dma_transfer(host, data); if (host->sg_count < 0) goto unmap_align; @@ -634,9 +633,11 @@ static void sdhci_adma_table_post(struct sdhci_host *host, } } - if (!data->host_cookie) + if (data->host_cookie == COOKIE_MAPPED) { dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, direction); + data->host_cookie = COOKIE_UNMAPPED; + } } static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) @@ -832,7 +833,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) } else { int sg_cnt; - sg_cnt = sdhci_pre_dma_transfer(host, data, NULL); + sg_cnt = sdhci_pre_dma_transfer(host, data); if (sg_cnt <= 0) { /* * This only happens when someone fed @@ -948,11 +949,13 @@ static void sdhci_finish_data(struct sdhci_host *host) if (host->flags & SDHCI_USE_ADMA) sdhci_adma_table_post(host, data); else { - if (!data->host_cookie) + if (data->host_cookie == COOKIE_MAPPED) { dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, (data->flags & MMC_DATA_READ) ? DMA_FROM_DEVICE : DMA_TO_DEVICE); + data->host_cookie = COOKIE_UNMAPPED; + } } } @@ -2105,49 +2108,36 @@ static void sdhci_post_req(struct mmc_host *mmc, struct mmc_request *mrq, struct mmc_data *data = mrq->data; if (host->flags & SDHCI_REQ_USE_DMA) { - if (data->host_cookie) + if (data->host_cookie == COOKIE_GIVEN || + data->host_cookie == COOKIE_MAPPED) dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, data->flags & MMC_DATA_WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE); - mrq->data->host_cookie = 0; + data->host_cookie = COOKIE_UNMAPPED; } } static int sdhci_pre_dma_transfer(struct sdhci_host *host, - struct mmc_data *data, - struct sdhci_host_next *next) + struct mmc_data *data) { int sg_count; - if (!next && data->host_cookie && - data->host_cookie != host->next_data.cookie) { - pr_debug(DRIVER_NAME "[%s] invalid cookie: %d, next-cookie %d\n", - __func__, data->host_cookie, host->next_data.cookie); - data->host_cookie = 0; + if (data->host_cookie == COOKIE_MAPPED) { + data->host_cookie = COOKIE_GIVEN; + return data->sg_count; } - /* Check if next job is already prepared */ - if (next || - (!next && data->host_cookie != host->next_data.cookie)) { - sg_count = dma_map_sg(mmc_dev(host->mmc), data->sg, - data->sg_len, - data->flags & MMC_DATA_WRITE ? - DMA_TO_DEVICE : DMA_FROM_DEVICE); - - } else { - sg_count = host->next_data.sg_count; - host->next_data.sg_count = 0; - } + WARN_ON(data->host_cookie == COOKIE_GIVEN); + sg_count = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len, + data->flags & MMC_DATA_WRITE ? + DMA_TO_DEVICE : DMA_FROM_DEVICE); if (sg_count == 0) - return -EINVAL; + return -ENOSPC; - if (next) { - next->sg_count = sg_count; - data->host_cookie = ++next->cookie < 0 ? 1 : next->cookie; - } else - host->sg_count = sg_count; + data->sg_count = sg_count; + data->host_cookie = COOKIE_MAPPED; return sg_count; } @@ -2157,16 +2147,10 @@ static void sdhci_pre_req(struct mmc_host *mmc, struct mmc_request *mrq, { struct sdhci_host *host = mmc_priv(mmc); - if (mrq->data->host_cookie) { - mrq->data->host_cookie = 0; - return; - } + mrq->data->host_cookie = COOKIE_UNMAPPED; if (host->flags & SDHCI_REQ_USE_DMA) - if (sdhci_pre_dma_transfer(host, - mrq->data, - &host->next_data) < 0) - mrq->data->host_cookie = 0; + sdhci_pre_dma_transfer(host, mrq->data); } static void sdhci_card_event(struct mmc_host *mmc) @@ -3038,7 +3022,6 @@ int sdhci_add_host(struct sdhci_host *host) host->max_clk = host->ops->get_max_clock(host); } - host->next_data.cookie = 1; /* * In case of Host Controller v3.00, find out whether clock * multiplier is supported. diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 67046ca..7c02ff4 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -309,9 +309,10 @@ struct sdhci_adma2_64_desc { */ #define SDHCI_MAX_SEGS 128 -struct sdhci_host_next { - unsigned int sg_count; - s32 cookie; +enum sdhci_cookie { + COOKIE_UNMAPPED, + COOKIE_MAPPED, + COOKIE_GIVEN, }; struct sdhci_host { @@ -505,7 +506,6 @@ struct sdhci_host { unsigned int tuning_mode; /* Re-tuning mode supported by host */ #define SDHCI_TUNING_MODE_1 0 - struct sdhci_host_next next_data; unsigned long private[0] ____cacheline_aligned; };