Path: csiph.com!weretis.net!feeder4.news.weretis.net!news.mixmin.net!aioe.org!bofh.it!news.nic.it!robomod From: Masahiro Yamada Newsgroups: linux.kernel Subject: [Question] devm_kmalloc() for DMA ? Date: Wed, 08 Mar 2017 12:10:02 +0100 Message-ID: X-Original-To: dmaengine@vger.kernel.org, linux-arm-kernel Dkim-Filter: OpenDKIM Filter v2.10.3 conssluserg-05.nifty.com v28Axo6X026919 Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1488970790; bh=sB0f/71WsZSF48sogT2p+ulDc7UDnsHOFk5jtXaJbHc=; h=From:Date:Subject:To:Cc:From; b=g5hVV8eA0sKNVKYN3EWIlHGnhrM+0yzoBVvUZcbVYLNx2wxp/YKgTMLSl46arpYyp JhRZkUEqM34ea+HqbmcUwJizfvAJeIakYPvc9rBVAQQLcA5OJNwnKfaBNVnsHS+I7f TT7585UNPmnDFusdAzCm5PoaduaI20yR9mNschToVt99AEP3V3u7p6p5W6+FotdGMo a9oNhtuX5ULj5bon3ros4cSUcMvWF719RHB3Kvcs1l/1IaikREph5YKgj5bTd/aAmJ tyhTllCS1uJKKO/wN56+nvUWdXqF6SGKpdgA+oaKIVxCrnnJNp699kYvkzztHjUUQK LryYIsFYbrG5Q== X-Nifty-Srcip: [209.85.220.173] X-Gm-Message-State: AMke39lKolXtLx5kG11+vjm8psBSQoKXu6IJZ+4Dm+ZxsAth+bvUJqK9KVIJ7tUowUHcJ6I2KEr4YbnEGosuJw== X-Received: by 10.129.75.88 with SMTP id y85mr1359025ywa.86.1488970789301; Wed, 08 Mar 2017 02:59:49 -0800 (PST) MIME-Version: 1.0 X-Gmail-Original-Message-ID: Content-Type: text/plain; charset=UTF-8 Sender: robomod@news.nic.it List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Approved: robomod@news.nic.it Lines: 85 Organization: linux.* mail to news gateway X-Original-Cc: Russell King - ARM Linux , Arnd Bergmann , Linux Kernel Mailing List , Tejun Heo , "James E.J. Bottomley" , "David S. Miller" , masahiroy@kernel.org X-Original-Date: Wed, 8 Mar 2017 19:59:48 +0900 X-Original-Message-ID: X-Original-Sender: linux-kernel-owner@vger.kernel.org Xref: csiph.com linux.kernel:1595056 Hi experts, I have a question about how to allocate DMA-safe buffer. In my understanding, kmalloc() returns memory with DMA safe alignment in order to avoid cache-sharing problem when used for DMA. The alignment is decided by ARCH_DMA_MINALIGN. For example, on modern ARM 32bit boards, this value is typically 64. So, memory returned by kmalloc() has at least 64 byte alignment. On the other hand, devm_kmalloc() does not return enough-aligned memory. On my board (ARM 32bit), devm_kmalloc() returns (ARCH_DMA_MINALIGN aligned address) + 0x10. The reason of the offset 0x10 is obvious. struct devres { struct devres_node node; /* -- 3 pointers */ unsigned long long data[]; /* guarantee ull alignment */ }; Management data is located at the top of struct devres. Then, devm_kmalloc() returns dr->data. The "unsigned long long" guarantees the returned memory has 0x10 alignment, but I think this may not be enough for DMA. I noticed this when I was seeing drivers/mtd/nand/denali.c The code looks as follows: denali->buf.buf = devm_kzalloc(denali->dev, mtd->writesize + mtd->oobsize, GFP_KERNEL); if (!denali->buf.buf) { ret = -ENOMEM; goto failed_req_irq; } /* Is 32-bit DMA supported? */ ret = dma_set_mask(denali->dev, DMA_BIT_MASK(32)); if (ret) { dev_err(denali->dev, "No usable DMA configuration\n"); goto failed_req_irq; } denali->buf.dma_buf = dma_map_single(denali->dev, denali->buf.buf, mtd->writesize + mtd->oobsize, DMA_BIDIRECTIONAL); Memory buffer is allocated by devm_kzalloc(), then passed to dma_map_single(). Could this be a potential problem in general? Is devm_kmalloc() not recommended for buffer that can be DMA-mapped? Any advice is appreciated. -- Best Regards Masahiro Yamada