From patchwork Tue Sep 5 08:10:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 111637 Delivered-To: patch@linaro.org Received: by 10.140.94.166 with SMTP id g35csp2519218qge; Tue, 5 Sep 2017 01:10:58 -0700 (PDT) X-Google-Smtp-Source: ADKCNb5HRw4AKmUlLpWvN8ebkNDJbzz3nsrAjCe5YV0/1y+VxnYfzEjRCBFzZS+/wlt0iAS8vfrj X-Received: by 10.98.74.74 with SMTP id x71mr2923502pfa.236.1504599058342; Tue, 05 Sep 2017 01:10:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504599058; cv=none; d=google.com; s=arc-20160816; b=q6lwR74HZDfOVlRGJmUqau1EiOEewB37y5t8pdWQOiLVYNiPYfDyN3X2uo7TvPP1Tp KKwhZ5n5O7gUT4VD7M+uF7+pWHzYKclzG6EySlWIqIbY+Xd/w1cuA/b+KGtyHAFuliLS gm1KkMKmLNdjPfNxZGqkNqYjx1C8Vf51532hea1RiMMvBk0jRCBkgnQyXj8yuXEy5b86 eeHon4wNXadFRTkJpm2+aOKNoWqvJn/yeGnp6GNRbMaC2bZDECk37CP6BfdUwcapjKbq MoQoB1T0lFT7cQfjPl2GUHR5QgoI1jR4r6M1JIIycwesG7AvwfxxfXzF9leEG0bQmmWu /hiw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=6N7kmjF1RsKmpbfk5aehESX40PD16FvGBx04ZSc4Fos=; b=C96gkqGBtwz8jIkjvfa5hvQYgmBgZL/nlWpcGEje12VwWN3zjWiBW77XEh8ksARtNy CTC3JDzHq+gTh26KA/TJIaGCbmfBJkZiBYHdzP7nXV9kBM4guAYzTDg3hCyYWfVlGSqE pqMeH3M8mQE05jzKX9YcHODOdnIIjMkzR6e0GwgjcHvsKd8VdtnXeXk/SiwA8/w4vqag 2SYPF6n3Vlzm/kNhBOI/dAwBZkaOysy+wpYmJvgtuwLmXDH/e41z1MxLEGVhAkbVzoZq fhhxvVSWctfaOYpYuv0UARucHgEImBWMrR4HzZ3leVRjD5D/M5DU4x4yG6cOkC5kgfWt jmEA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z96si114217plh.513.2017.09.05.01.10.58; Tue, 05 Sep 2017 01:10:58 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751734AbdIEIKz (ORCPT + 26 others); Tue, 5 Sep 2017 04:10:55 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:61614 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751630AbdIEIKq (ORCPT ); Tue, 5 Sep 2017 04:10:46 -0400 Received: from wuerfel.lan ([95.208.190.237]) by mrelayeu.kundenserver.de (mreue103 [212.227.15.145]) with ESMTPA (Nemesis) id 0M4kN3-1dYxrf0Ilp-00yvnj; Tue, 05 Sep 2017 10:10:30 +0200 From: Arnd Bergmann To: Christoph Hellwig , Marek Szyprowski , Greg Kroah-Hartman Cc: Arnd Bergmann , Robin Murphy , Vladimir Murzin , Mark Craske , "George G. Davis" , Bastian Hecht , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH] dma-coherent: fix dma_declare_coherent_memory() logic error Date: Tue, 5 Sep 2017 10:10:09 +0200 Message-Id: <20170905081026.1198405-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:Gv6WhhwVw8nRe6kJFiEQv+KnlGmx52VA4nRcmLgPAiTAN4EeV9B bESjUF6tbhLIrAj8M5zs0QGOBO/H24toPpJgwVO9YMhhLE7sRVI/mTX3N/r/ttkn95+7soB ZuzBOumpld53CX29ouWp3M0B/jQpgw96/hsanZ/TxUS4p/nceBB4iTZ6eqnXwfOYQaQ+Nxm X7HAofCxxMEW++kT+JaTw== X-UI-Out-Filterresults: notjunk:1; V01:K0:n2fV/L8xxzE=:9mmz7varWaHqZ4qeQ5mCHz nW24ZIJqgaQAQcD2WwjdDLezwvI8x9Lc8Viv8LEWFHktOFXarvNhJh+66HKOBwJ9W+lKZD9VR wmXYX7F7PXkgdkKSvDBY8n9e19cMU4u4SrSEpNo2S34rd/rmzKCfwWCCiP/u2n2RiIR0xtxaL W6qwEWz9prlOyY6VbBXCzAFwbPVzNSm1XXGBdWqGG89/iMbUClDhBrTFctn00hYjyNk/s1oKh qX+0DqIt8PSUCgiCsXb87bY36RnVT2F+KE8tkLZyEONsSd8PEqlB6pGr+g3P6jYRXtyH/Wd44 1dNlLlNOcDFsNeDT0rZ6y+Y760J9S4V1siXcZZYhb4luA7LCsn9kwEuD/O1en7CLa0+4nUF0l y6ugEklkQ+zMhAdQp1gkxQ0aB5uUwtB1XLRbPjy4U51hQulJFgI4zVAm3os84SYz3ijUd53+z nv3Xn+r8bZ7E/3qdoax7IhBnVuVe45Sb47uaM9RqRdTrJO4hsBUdGlkCnIjsEdq6vvIhoEZMq Z0EOtnf4j+Fe6xtQzATO9zQfdzyrpDnXocUCcglOSR5HwbLvRcdbOMm5LcSeVPNhDQEIFtHav xSjvQPIOoTdo6pPSRQKtBqzElLHpGGSKKWZnHMeji+fX7sIIPGnlbeTssMpA+xHg2FqPNENQX fByuuQ+Nyr8FntpoU465cbfNZPciPIMHUucZOrWsmuelpWzXAkkkLiyPal418jQYhrHu3IVpX MHOCl8HtRCAdOC8IqjjkIKZh+wqtS4w+KgwHhA== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A recent change interprets the return code of dma_init_coherent_memory as an error value, but it is instead a boolean, where 'true' indicates success. This leads causes the caller to always do the wrong thing, and also triggers a compile-time warning about it: drivers/base/dma-coherent.c: In function 'dma_declare_coherent_memory': drivers/base/dma-coherent.c:99:15: error: 'mem' may be used uninitialized in this function [-Werror=maybe-uninitialized] I ended up changing the code a little more, to give use the usual error handling, as this seemed the best way to fix up the warning and make the code look reasonable at the same time. Fixes: 2436bdcda53f ("dma-coherent: remove the DMA_MEMORY_MAP and DMA_MEMORY_IO flags") Signed-off-by: Arnd Bergmann --- drivers/base/dma-coherent.c | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) -- 2.9.0 diff --git a/drivers/base/dma-coherent.c b/drivers/base/dma-coherent.c index f82a504583d4..a39b2166b145 100644 --- a/drivers/base/dma-coherent.c +++ b/drivers/base/dma-coherent.c @@ -37,7 +37,7 @@ static inline dma_addr_t dma_get_device_base(struct device *dev, return mem->device_base; } -static bool dma_init_coherent_memory( +static int dma_init_coherent_memory( phys_addr_t phys_addr, dma_addr_t device_addr, size_t size, int flags, struct dma_coherent_mem **mem) { @@ -45,20 +45,28 @@ static bool dma_init_coherent_memory( void __iomem *mem_base = NULL; int pages = size >> PAGE_SHIFT; int bitmap_size = BITS_TO_LONGS(pages) * sizeof(long); + int ret; - if (!size) + if (!size) { + ret = -EINVAL; goto out; + } mem_base = memremap(phys_addr, size, MEMREMAP_WC); - if (!mem_base) + if (!mem_base) { + ret = -EINVAL; goto out; - + } dma_mem = kzalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL); - if (!dma_mem) + if (!dma_mem) { + ret = -ENOMEM; goto out; + } dma_mem->bitmap = kzalloc(bitmap_size, GFP_KERNEL); - if (!dma_mem->bitmap) + if (!dma_mem->bitmap) { + ret = -ENOMEM; goto out; + } dma_mem->virt_base = mem_base; dma_mem->device_base = device_addr; @@ -68,13 +76,13 @@ static bool dma_init_coherent_memory( spin_lock_init(&dma_mem->spinlock); *mem = dma_mem; - return true; + return 0; out: kfree(dma_mem); if (mem_base) memunmap(mem_base); - return false; + return ret; } static void dma_release_coherent_memory(struct dma_coherent_mem *mem) @@ -338,14 +346,18 @@ static struct reserved_mem *dma_reserved_default_memory __initdata; static int rmem_dma_device_init(struct reserved_mem *rmem, struct device *dev) { struct dma_coherent_mem *mem = rmem->priv; + int ret; + + if (!mem) + return -ENODEV; - if (!mem && - !dma_init_coherent_memory(rmem->base, rmem->base, rmem->size, - DMA_MEMORY_EXCLUSIVE, - &mem)) { + ret = dma_init_coherent_memory(rmem->base, rmem->base, rmem->size, + DMA_MEMORY_EXCLUSIVE, &mem); + + if (ret) { pr_err("Reserved memory: failed to init DMA memory pool at %pa, size %ld MiB\n", &rmem->base, (unsigned long)rmem->size / SZ_1M); - return -ENODEV; + return ret; } mem->use_dev_dma_pfn_offset = true; rmem->priv = mem;