Re: [PATCH 1/2] arm: msm: Add System MMU support.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: FUJITA Tomonori
Date: Thursday, July 29, 2010 - 11:14 pm

On Thu, 29 Jul 2010 12:47:26 +0100
Russell King - ARM Linux <linux@arm.linux.org.uk> wrote:


Ah, sorry about the bug. Surely, the for_device needs to do the same
as the for_cpu. I've attached the updated patch.

We need to fix dmabounce.c anyway (even if we keep the sync_range API)
because drivers use the sync API to do a partial sync.



It would have been nice if you had opposed when this issue was
discussed...

commit 8127bfc5645db0e050468e0ff971b4081f73ddcf
Author: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Date:   Wed Mar 10 15:23:18 2010 -0800

    DMA-API.txt: remove dma_sync_single_range description


As you said, the range API might be safer (since it requires more
information). However, there were already drivers using the
dma_sync_single_for API to do a partial sync (i.e. do a sync on
range).

Inspecting all the usage of the dma_sync_single_for API to see which
drivers to do a partial sync looks unrealistic. So keeping the
dma_sync_single_range_for API is pointless since drivers keep using 
dma_sync_single_for API.

And the majority of implementations doesn't use 'range' information,
i.e., the implementation of dma_sync_single_for and
dma_sync_single_range_for API is identical.



Strict checking would be nice. If architectures can do such easily, we
had better to do so.

However, I'm not sure we need to take special care for the
dma_sync_single_for API. In general, misuse of the majority of the DMA
functions is deadly.

=
From: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Subject: [PATCH] ARM: dmabounce: fix partial sync in dma_sync_single_* API

Some network drivers do a partial sync with
dma_sync_single_for_{device|cpu}. The dma_addr argument might not be
the same as one as passed into the mapping API.

This adds some tricks to find_safe_buffer() for
dma_sync_single_for_{device|cpu}.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---
 arch/arm/common/dmabounce.c |   32 +++++++++++++++++++++++---------
 1 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c
index cc0a932..dbd30dc 100644
--- a/arch/arm/common/dmabounce.c
+++ b/arch/arm/common/dmabounce.c
@@ -163,7 +163,8 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr,
 
 /* determine if a buffer is from our "safe" pool */
 static inline struct safe_buffer *
-find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr)
+find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_addr,
+		 int for_sync)
 {
 	struct safe_buffer *b, *rb = NULL;
 	unsigned long flags;
@@ -171,9 +172,17 @@ find_safe_buffer(struct dmabounce_device_info *device_info, dma_addr_t safe_dma_
 	read_lock_irqsave(&device_info->lock, flags);
 
 	list_for_each_entry(b, &device_info->safe_buffers, node)
-		if (b->safe_dma_addr == safe_dma_addr) {
-			rb = b;
-			break;
+		if (for_sync) {
+			if (b->safe_dma_addr <= safe_dma_addr &&
+			    safe_dma_addr < b->safe_dma_addr + b->size) {
+				rb = b;
+				break;
+			}
+		} else {
+			if (b->safe_dma_addr == safe_dma_addr) {
+				rb = b;
+				break;
+			}
 		}
 
 	read_unlock_irqrestore(&device_info->lock, flags);
@@ -205,7 +214,8 @@ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer *
 /* ************************************************** */
 
 static struct safe_buffer *find_safe_buffer_dev(struct device *dev,
-		dma_addr_t dma_addr, const char *where)
+						dma_addr_t dma_addr, const char *where,
+						int for_sync)
 {
 	if (!dev || !dev->archdata.dmabounce)
 		return NULL;
@@ -216,7 +226,7 @@ static struct safe_buffer *find_safe_buffer_dev(struct device *dev,
 			pr_err("unknown device: Trying to %s invalid mapping\n", where);
 		return NULL;
 	}
-	return find_safe_buffer(dev->archdata.dmabounce, dma_addr);
+	return find_safe_buffer(dev->archdata.dmabounce, dma_addr, for_sync);
 }
 
 static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,
@@ -286,7 +296,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,
 static inline void unmap_single(struct device *dev, dma_addr_t dma_addr,
 		size_t size, enum dma_data_direction dir)
 {
-	struct safe_buffer *buf = find_safe_buffer_dev(dev, dma_addr, "unmap");
+	struct safe_buffer *buf = find_safe_buffer_dev(dev, dma_addr, "unmap", 0);
 
 	if (buf) {
 		BUG_ON(buf->size != size);
@@ -398,7 +408,7 @@ int dmabounce_sync_for_cpu(struct device *dev, dma_addr_t addr,
 	dev_dbg(dev, "%s(dma=%#x,off=%#lx,sz=%zx,dir=%x)\n",
 		__func__, addr, off, sz, dir);
 
-	buf = find_safe_buffer_dev(dev, addr, __func__);
+	buf = find_safe_buffer_dev(dev, addr, __func__, 1);
 	if (!buf)
 		return 1;
 
@@ -411,6 +421,8 @@ int dmabounce_sync_for_cpu(struct device *dev, dma_addr_t addr,
 	DO_STATS(dev->archdata.dmabounce->bounce_count++);
 
 	if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {
+		if (addr != buf->safe_dma_addr)
+			off = addr - buf->safe_dma_addr;
 		dev_dbg(dev, "%s: copy back safe %p to unsafe %p size %d\n",
 			__func__, buf->safe + off, buf->ptr + off, sz);
 		memcpy(buf->ptr + off, buf->safe + off, sz);
@@ -427,7 +439,7 @@ int dmabounce_sync_for_device(struct device *dev, dma_addr_t addr,
 	dev_dbg(dev, "%s(dma=%#x,off=%#lx,sz=%zx,dir=%x)\n",
 		__func__, addr, off, sz, dir);
 
-	buf = find_safe_buffer_dev(dev, addr, __func__);
+	buf = find_safe_buffer_dev(dev, addr, __func__, 1);
 	if (!buf)
 		return 1;
 
@@ -440,6 +452,8 @@ int dmabounce_sync_for_device(struct device *dev, dma_addr_t addr,
 	DO_STATS(dev->archdata.dmabounce->bounce_count++);
 
 	if (dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL) {
+		if (addr != buf->safe_dma_addr)
+			off = addr - buf->safe_dma_addr;
 		dev_dbg(dev, "%s: copy out unsafe %p to safe %p, size %d\n",
 			__func__,buf->ptr + off, buf->safe + off, sz);
 		memcpy(buf->safe + off, buf->ptr + off, sz);
-- 
1.6.5


--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 1/2] arm: msm: Add System MMU support., Stepan Moskovchenko, (Tue Jul 27, 3:41 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Daniel Walker, (Tue Jul 27, 3:43 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Wed Jul 28, 1:39 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., stepanm, (Wed Jul 28, 10:39 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Wed Jul 28, 10:50 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Russell King - ARM Linux, (Wed Jul 28, 2:21 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Wed Jul 28, 8:35 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Wed Jul 28, 9:15 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Thu Jul 29, 1:12 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Thu Jul 29, 1:26 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Thu Jul 29, 1:35 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Thu Jul 29, 1:40 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Thu Jul 29, 1:46 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Thu Jul 29, 2:06 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Thu Jul 29, 2:14 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Thu Jul 29, 2:25 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Thu Jul 29, 2:28 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Thu Jul 29, 2:44 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Thu Jul 29, 3:01 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Thu Jul 29, 4:25 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Russell King - ARM Linux, (Thu Jul 29, 4:47 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Thu Jul 29, 5:12 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Thu Jul 29, 6:01 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., stepanm, (Thu Jul 29, 10:19 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Thu Jul 29, 11:14 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Fri Jul 30, 1:01 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Fri Jul 30, 2:59 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Benjamin Herrenschmidt, (Fri Jul 30, 7:30 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Benjamin Herrenschmidt, (Fri Jul 30, 8:15 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Arnd Bergmann, (Sat Jul 31, 2:37 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Mon Aug 2, 12:48 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Mon Aug 2, 12:58 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Benjamin Herrenschmidt, (Mon Aug 2, 1:03 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Mon Aug 2, 1:10 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Mon Aug 2, 1:30 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Mon Aug 2, 1:35 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Russell King - ARM Linux, (Mon Aug 2, 2:03 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Mon Aug 2, 2:20 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Mon Aug 2, 2:45 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Russell King - ARM Linux, (Mon Aug 2, 3:04 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., FUJITA Tomonori, (Mon Aug 2, 8:26 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Zach Pfeffer, (Mon Aug 2, 1:29 pm)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Tue Aug 3, 2:23 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Stepan Moskovchenko, (Tue Aug 3, 11:43 am)
Re: [PATCH 1/2] arm: msm: Add System MMU support., Roedel, Joerg, (Wed Aug 4, 2:52 am)