From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756723AbbEUPxJ (ORCPT ); Thu, 21 May 2015 11:53:09 -0400 Received: from mga03.intel.com ([134.134.136.65]:60995 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755093AbbEUPxH (ORCPT ); Thu, 21 May 2015 11:53:07 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,469,1427785200"; d="scan'208";a="733160194" Date: Thu, 21 May 2015 21:23:46 +0530 From: Vinod Koul To: Geert Uytterhoeven Cc: dmaengine@vger.kernel.org, LKML Subject: Re: Modifying sg_dma_len(sg)? Message-ID: <20150521155346.GQ3140@localhost> References: <20150519040147.GG3140@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 19, 2015 at 08:51:54AM +0200, Geert Uytterhoeven wrote: > On Tue, May 19, 2015 at 6:01 AM, Vinod Koul wrote: > > On Fri, May 15, 2015 at 03:46:27PM +0200, Geert Uytterhoeven wrote: > > > > am ccing LKML, perhaps this needs wider discussion.. > > > >> Several drivers reuse mapped scatterlists, and modify sg_dma_len(sg) to > >> match the actual number of bytes they want to transfer. > >> > >> Hence during driver shutdown, dma_unmap_sg() is called with a scatterlist > >> that has modified lengths, compared to the original passed to dma_map_sg(). > >> If CONFIG_DMA_API_DEBUG=y, this causes warnings like: > >> > >> WARNING: CPU: 0 PID: 20 at lib/dma-debug.c:1103 check_unmap+0x24c/0x85c() > >> rcar-dmac e6700000.dma-controller: DMA-API: device driver frees > >> DMA memory with different size [device address=0x000000006e15f000] > >> [map size=4096 bytes] [unmap size=3 bytes] > >> > >> The warning can be silenced by restoring the original sg_dma_len() just before > >> calling dma_unmap_sg(), but it looks like no driver actually does that. > > Right, but should the drivers map with one length and then modify the > > length later on, why not map only the size that is required... > > This is mostly done in serial drivers, which set up an initial mapping, and > reuse it with different lengths, depending on the amount of data to transfer > at that time. > > > So driver should always unmap and remap with the right length whenever it is > > required to change the length. Perhaps a dma_remap_sg() API to do so > > properly. > > > > I do not think modifying length directly should be encouraged... > > In cases where there's only a single segment, I think it's better to use > dma_map_single() instead of dma_map_sg(). > Then the actual length to transfer can easily be passed to > dmaengine_prep_slave_single(), right? Sounds right to me -- ~Vinod