Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp4772198imm; Fri, 18 May 2018 10:22:15 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoic8PUF5V6/xXSqIeL9ITbTIa9waDJQ0ApDCUZmBhfkK5gnimhJcBmARCKwjQ4VDC9pysg X-Received: by 2002:a17:902:7615:: with SMTP id k21-v6mr10175068pll.97.1526664135285; Fri, 18 May 2018 10:22:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526664135; cv=none; d=google.com; s=arc-20160816; b=DjAM4NLTCcUCz5XgbvPdHRTOiLPHevnetiFhRL+MKQHoEPPL9fMfBSxUmMjWbQ7oFY SNDJtoexuWM0F886E8i4UHU41qFQcKyREL6BITz3s+yTf+A1gQBFO9YrXmKC7l4Ds/ce T9xIBKFhqgIiDgCgKVYzE3ihO9/EN7jezCVTeSCQgU+tT2PUjMmsD9Qv6qKgZdypioM/ RUGvDtlVlaiLCHQ94whD3yGrchABiiYUO13VOVBqX+tgC0pz2Po2ccXVIqSt9a7Fr6DG 6gp4e+X/2+GDklKL9mLoRP+JzZZnYwmhJobydGhtNUD22P4hhUxKap5YvjZjzVcQCIH9 8cZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=7qt/uRuMBddCIDi/LL5ro+iuIru1sUYQlgY5nx+ekVM=; b=JgQ4Yf7a0R+kXlzCC2QJIfWFlPYTuASvKPtdQQlw8cONCoPihsGdpHfDyAZEcxc9jt Mc1LOPy45wSdDmifLL60frPzACvj95C35VfOApX7kEij5FaHy2Zy7yDh70sY/j0Cid7e GgKHu9JunPwLEQysz90+rR9P08Qja7BvxIn71jfdPxL0xqFDcCv5qwh5EElbAlN4lg8z vw3L/sun9JdXNPHfKrR5heLp916MxIPsNk2ZZBQQo6dVaJgqBa7XjtMpsDg4LTPqLOyq NkhfRBkU3SmcQzRFFfUUP4Pte1POHj8EykmcUC5q5i9mqGjjVu0KDqyGUY69o0i5KxWK J9Ig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@synopsys.com header.s=mail header.b=RMk9RaUs; 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 sp=NONE dis=NONE) header.from=synopsys.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e33-v6si7586528pld.231.2018.05.18.10.21.59; Fri, 18 May 2018 10:22:15 -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=@synopsys.com header.s=mail header.b=RMk9RaUs; 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 sp=NONE dis=NONE) header.from=synopsys.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751696AbeERRU1 (ORCPT + 99 others); Fri, 18 May 2018 13:20:27 -0400 Received: from smtprelay.synopsys.com ([198.182.37.59]:58499 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751418AbeERRUW (ORCPT ); Fri, 18 May 2018 13:20:22 -0400 Received: from mailhost.synopsys.com (mailhost2.synopsys.com [10.13.184.66]) by smtprelay.synopsys.com (Postfix) with ESMTP id 8251D1E04FE; Fri, 18 May 2018 19:20:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1526664019; bh=+iq4xJnwKxUqDkpGUPhJDNbAQJFBtR6Rp6448TFwwJ8=; h=Subject:To:CC:References:From:Date:In-Reply-To:From; b=RMk9RaUs2Gc2ZiXlAkw0gNihqEIyAMDAEeD0g8Nq1Ov3Jq1IwdO6kN3znLVUQHugW 07jk9r3bGQvgXSAOuvnSnKq8HWsaX3bDo/kR1RMdMy/4hsX3OdoGa6pkRpwEDpYxuI 1K/MDs7u7fuNXDnejk0+CSdKDPunyNjQSzuB7eHO2caRz+t3hfhLRYAHcXXHWPk5+1 Q0cuZe+JiXPQQO/5EAtf84ZOdMtGhpYbJvPjhf2HhHW+OV2Dvb/7sEfbpUslPLY0nL ISYtM10SIuewrf8z3X/QslRB74WAWZ5wCrXnIbHbxJCe3jDdGCNXoaAzNIKC+Mccy4 9Ike49TRObeHQ== Received: from us01wehtc1.internal.synopsys.com (us01wehtc1.internal.synopsys.com [10.12.239.235]) by mailhost.synopsys.com (Postfix) with ESMTP id 14A073A76; Fri, 18 May 2018 10:20:18 -0700 (PDT) Received: from IN01WEHTCB.internal.synopsys.com (10.144.199.106) by us01wehtc1.internal.synopsys.com (10.12.239.231) with Microsoft SMTP Server (TLS) id 14.3.361.1; Fri, 18 May 2018 10:20:17 -0700 Received: from IN01WEHTCA.internal.synopsys.com (10.144.199.103) by IN01WEHTCB.internal.synopsys.com (10.144.199.105) with Microsoft SMTP Server (TLS) id 14.3.361.1; Fri, 18 May 2018 22:50:15 +0530 Received: from [10.10.161.52] (10.10.161.52) by IN01WEHTCA.internal.synopsys.com (10.144.199.243) with Microsoft SMTP Server (TLS) id 14.3.361.1; Fri, 18 May 2018 22:50:14 +0530 Subject: dma_sync_*_for_cpu and direction=TO_DEVICE (was Re: [PATCH 02/20] dma-mapping: provide a generic dma-noncoherent implementation) To: Alexey Brodkin , "hch@lst.de" CC: "linux-arch@vger.kernel.org" , "linux-xtensa@linux-xtensa.org" , "monstr@monstr.eu" , "linux-snps-arc@lists.infradead.org" , "linux-c6x-dev@linux-c6x.org" , "linux-parisc@vger.kernel.org" , "linux-sh@vger.kernel.org" , "linux-hexagon@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "iommu@lists.linux-foundation.org" , "linux-m68k@lists.linux-m68k.org" , "openrisc@lists.librecores.org" , "green.hu@gmail.com" , "linux-alpha@vger.kernel.org" , "sparclinux@vger.kernel.org" , "nios2-dev@lists.rocketboards.org" , "deanbo422@gmail.com" , "linux-arm-kernel@lists.infradead.org" , "linux-mm@kvack.org" , Andrew Morton References: <20180511075945.16548-1-hch@lst.de> <20180511075945.16548-3-hch@lst.de> From: Vineet Gupta Message-ID: <5ac5b1e3-9b96-9c7c-4dfe-f65be45ec179@synopsys.com> Date: Fri, 18 May 2018 10:20:02 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Originating-IP: [10.10.161.52] Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/18/2018 06:11 AM, Alexey Brodkin wrote: > void arch_sync_dma_for_device(struct device *dev, phys_addr_t paddr, > size_t size, enum dma_data_direction dir) > { > + if (dir != DMA_TO_DEVICE){ > + dump_stack(); > + printk(" *** %s@%d: DMA direction is %s instead of %s\n", > + __func__, __LINE__, dir_to_str(dir), dir_to_str(DMA_TO_DEVICE)); > + } > + > return _dma_cache_sync(dev, paddr, size, dir); > } > > void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr, > size_t size, enum dma_data_direction dir) > { > + if (dir != DMA_FROM_DEVICE) { > + dump_stack(); > + printk(" *** %s@%d: DMA direction is %s instead of %s\n", > + __func__, __LINE__, dir_to_str(dir), dir_to_str(DMA_FROM_DEVICE)); > + } > + > return _dma_cache_sync(dev, paddr, size, dir); > } ... > In case of MMC/DW_MCI (AKA DesignWare MobileStorage controller) that's an execution flow: > 1) __dw_mci_start_request() > 2) dw_mci_pre_dma_transfer() > 3) dma_map_sg(..., mmc_get_dma_dir(data)) > > Note mmc_get_dma_dir() is just "data->flags & MMC_DATA_WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE". > I.e. if we're preparing for sending data dma_noncoherent_map_sg() will have DMA_TO_DEVICE which > is quite OK for passing to dma_noncoherent_sync_sg_for_device() but in case of reading we'll have > DMA_FROM_DEVICE which we'll pass to dma_noncoherent_sync_sg_for_device() in dma_noncoherent_map_sg(). > > I'd say this is not entirely correct because IMHO arch_sync_dma_for_cpu() is supposed to only be used > in case of DMA_FROM_DEVICE and arch_sync_dma_for_device() only in case of DMA_TO_DEVICE. So roughly 10 years ago, some kernel rookie name Vineet Gupta, asked the exact same question :-) http://kernelnewbies.kernelnewbies.narkive.com/aGW1QcDv/query-about-dma-sync-for-cpu-and-direction-to-device I never understood the need for this direction. And if memory serves me right, at that time I was seeing twice the amount of cache flushing ! > But the real fix of my problem is: > ---------------------------------------->8------------------------------------ > --- a/lib/dma-noncoherent.c > +++ b/lib/dma-noncoherent.c > @@ -35,7 +35,7 @@ static dma_addr_t dma_noncoherent_map_page(struct device *dev, struct page *page > > addr = dma_direct_map_page(dev, page, offset, size, dir, attrs); > if (!dma_mapping_error(dev, addr) && !(attrs & DMA_ATTR_SKIP_CPU_SYNC)) > - arch_sync_dma_for_device(dev, page_to_phys(page), size, dir); > + arch_sync_dma_for_device(dev, page_to_phys(page) + offset, size, dir); > return addr; > } > ---------------------------------------->8------------------------------------ > > You seem to lost an offset in the page so if we happen to have a buffer not aligned to > a page boundary then we were obviously corrupting data outside our data :) Neat !