From patchwork Wed Jul 27 21:32:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 72913 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp524326qga; Wed, 27 Jul 2016 14:33:23 -0700 (PDT) X-Received: by 10.66.123.42 with SMTP id lx10mr52948807pab.95.1469655203740; Wed, 27 Jul 2016 14:33:23 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a6si8301860pfb.49.2016.07.27.14.33.22; Wed, 27 Jul 2016 14:33:23 -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; dkim=pass header.i=@linaro.org; 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; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757929AbcG0VdM (ORCPT + 29 others); Wed, 27 Jul 2016 17:33:12 -0400 Received: from mail-pf0-f175.google.com ([209.85.192.175]:36247 "EHLO mail-pf0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751849AbcG0VdI (ORCPT ); Wed, 27 Jul 2016 17:33:08 -0400 Received: by mail-pf0-f175.google.com with SMTP id h186so14453006pfg.3 for ; Wed, 27 Jul 2016 14:33:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=Jw2isNst5//LZzt+dyuz7l1QyupW10YipFjMHcVw/es=; b=PzxlQiferCckdQxjBDKnhNgjVzoNuH3c4zINsDsPSRuSTLslXSwr54uoYYlxGxJysl Na7v+Y/mIo2s2Ria4yI787haASVGpatGIeMF5EqqvlkdVr6gzEhYtHyG55r+2gn2G/hU i3b2lLkzLMa9m3/PZZptCmk/bCxrsS5jRkzh0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Jw2isNst5//LZzt+dyuz7l1QyupW10YipFjMHcVw/es=; b=hYbnY6kAs2Tzx5xN3X2lvbpRJdHYTLwtbu0x+1iYWRDGHr/7ELAgkLKwdLZcjr7MSM giCgUkP3PTe7qdHhFWOhzunw2V9dgniORAxQh5aVGLoe6VKNHnnSIAdIlZWaEIk1skXJ NGGriOSUSSVCaxsAdxIYv8CEbR+1MUqr1O+Kia8wUBenmwgSsdknCtMgBWxiQ9agEk+1 wHj3SDJJverMhsKS4AZPO4D49uiHyRNoCywNEhLWwVdIHFx8dPhL1XbggdcPrF6wHrK8 uYn30EaLNBX8H3Xn2BPffFFw9BB9RRw4GnkU0yoLI7GwTyWxSsVZR/GsbXbg3phGy0F5 DDuw== X-Gm-Message-State: AEkoouuMqFRx1TGVNRKQ1/vnFIUUuyZo35VGTHU2ZFBK1ML56Np7zcSTVjFRcqzgiLeHALBC X-Received: by 10.98.60.217 with SMTP id b86mr53501856pfk.129.1469655187334; Wed, 27 Jul 2016 14:33:07 -0700 (PDT) Received: from localhost ([104.132.1.108]) by smtp.gmail.com with ESMTPSA id p4sm11408294pfp.60.2016.07.27.14.33.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Jul 2016 14:33:06 -0700 (PDT) From: Viresh Kumar To: Dan Williams , Vinod Koul Cc: linaro-kernel@lists.linaro.org, Greg Kroah-Hartman , Viresh Kumar , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] dmaengine: device must have at least one channel Date: Wed, 27 Jul 2016 14:32:58 -0700 Message-Id: <4a6e2283fb7736c33fb733c310314d7bc135cd6d.1469654853.git.viresh.kumar@linaro.org> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The DMA device can't be registered if it doesn't have any channels registered at all. Moreover, it leads to memory leak and is reported by kmemleak as (on 3.10 kernel, and same shall happen on mainline): unreferenced object 0xffffffc09e597240 (size 64): comm "swapper/0", pid 1, jiffies 4294877736 (age 7060.280s) hex dump (first 32 bytes): 00 00 00 00 c0 ff ff ff 30 00 00 ff 00 00 00 ff ........0....... 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff ................ backtrace: [] create_object+0x148/0x2a0 [] kmemleak_alloc+0x80/0xbc [] kmem_cache_alloc_trace+0x120/0x1ac [] dma_async_device_register+0x160/0x46c [] foo_probe+0x1a0/0x264 [] platform_drv_probe+0x14/0x20 [] driver_probe_device+0x160/0x374 [] __driver_attach+0x60/0x90 [] bus_for_each_dev+0x7c/0xb0 [] driver_attach+0x1c/0x28 [] bus_add_driver+0x124/0x248 [] driver_register+0x90/0x110 [] platform_driver_register+0x58/0x64 [] foo_driver_init+0x10/0x1c [] do_one_initcall+0xac/0x148 [] kernel_init_freeable+0x1a0/0x258 Return -ENODEV from dma_async_device_register() on such a case. Signed-off-by: Viresh Kumar --- Hi Vinod, Sorry if the fundamentals behind this patch are completely incorrect, i.e. We *can't* register a dma device with 0 channels. Its been long that I have worked on dma stuff :) drivers/dma/dmaengine.c | 7 +++++++ 1 file changed, 7 insertions(+) -- 2.7.4 diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 8c9f45fd55fc..6b535262ac5d 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c @@ -997,6 +997,13 @@ int dma_async_device_register(struct dma_device *device) } chan->client_count = 0; } + + if (!chancnt) { + dev_err(device->dev, "%s: device has no channels!\n", __func__); + rc = -ENODEV; + goto err_out; + } + device->chancnt = chancnt; mutex_lock(&dma_list_mutex);