All of lore.kernel.org
 help / color / mirror / Atom feed
From: FUJITA Tomonori <tomof@acm.org>
To: akpm@linux-foundation.org
Cc: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org,
	paulus@samba.org, fujita.tomonori@lab.ntt.co.jp
Subject: [PATCH -mm 04/11] ppc: make iommu respect the segment size limits
Date: Wed, 24 Oct 2007 19:48:13 +0900	[thread overview]
Message-ID: <20071024171642A.tomof@acm.org> (raw)
In-Reply-To: <67bb10d9f4e9473ddc84d9839114602c1966f19f.tomof@acm.org>

This patch makes iommu respect segment size limits when merging sg
lists.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---
 arch/powerpc/kernel/dma_64.c |    2 +-
 arch/powerpc/kernel/iommu.c  |    8 ++++++--
 include/asm-powerpc/iommu.h  |    2 +-
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/kernel/dma_64.c b/arch/powerpc/kernel/dma_64.c
index 14206e3..1806d96 100644
--- a/arch/powerpc/kernel/dma_64.c
+++ b/arch/powerpc/kernel/dma_64.c
@@ -68,7 +68,7 @@ static void dma_iommu_unmap_single(struct device *dev, dma_addr_t dma_handle,
 static int dma_iommu_map_sg(struct device *dev, struct scatterlist *sglist,
 			    int nelems, enum dma_data_direction direction)
 {
-	return iommu_map_sg(dev->archdata.dma_data, sglist, nelems,
+	return iommu_map_sg(dev, sglist, nelems,
 			    device_to_mask(dev), direction);
 }
 
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
index 2d0c9ef..7a5d247 100644
--- a/arch/powerpc/kernel/iommu.c
+++ b/arch/powerpc/kernel/iommu.c
@@ -270,15 +270,17 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
 	spin_unlock_irqrestore(&(tbl->it_lock), flags);
 }
 
-int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
+int iommu_map_sg(struct device *dev, struct scatterlist *sglist,
 		 int nelems, unsigned long mask,
 		 enum dma_data_direction direction)
 {
+	struct iommu_table *tbl = dev->archdata.dma_data;
 	dma_addr_t dma_next = 0, dma_addr;
 	unsigned long flags;
 	struct scatterlist *s, *outs, *segstart;
 	int outcount, incount, i;
 	unsigned long handle;
+	unsigned int max_seg_size;
 
 	BUG_ON(direction == DMA_NONE);
 
@@ -297,6 +299,7 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
 
 	spin_lock_irqsave(&(tbl->it_lock), flags);
 
+	max_seg_size = dma_get_max_seg_size(dev);
 	for_each_sg(sglist, s, nelems, i) {
 		unsigned long vaddr, npages, entry, slen;
 
@@ -338,7 +341,8 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
 			/* We cannot merge if:
 			 * - allocated dma_addr isn't contiguous to previous allocation
 			 */
-			if (novmerge || (dma_addr != dma_next)) {
+			if (novmerge || (dma_addr != dma_next) ||
+			    (outs->dma_length + s->length > max_seg_size)) {
 				/* Can't merge: create a new segment */
 				segstart = s;
 				outcount++;
diff --git a/include/asm-powerpc/iommu.h b/include/asm-powerpc/iommu.h
index 4a82fdc..5225f05 100644
--- a/include/asm-powerpc/iommu.h
+++ b/include/asm-powerpc/iommu.h
@@ -80,7 +80,7 @@ extern void iommu_free_table(struct device_node *dn);
 extern struct iommu_table *iommu_init_table(struct iommu_table * tbl,
 					    int nid);
 
-extern int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist,
+extern int iommu_map_sg(struct device *dev, struct scatterlist *sglist,
 			int nelems, unsigned long mask,
 			enum dma_data_direction direction);
 extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist,
-- 
1.5.2.4


  parent reply	other threads:[~2007-10-24 10:53 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-24 10:47 [PATCH -mm 0/11] fix iommu sg merging problem FUJITA Tomonori
2007-10-24 10:48 ` [PATCH -mm 01/11] add device_dma_parameters structure FUJITA Tomonori
2007-10-24 11:33   ` Jeff Garzik
2007-10-24 10:48 ` [PATCH -mm 02/11] PCI: add device_dma_parameters support FUJITA Tomonori
2007-10-24 11:34   ` Jeff Garzik
2007-10-24 13:41     ` FUJITA Tomonori
2007-10-24 10:48 ` [PATCH -mm 03/11] x86: make pci-gart iommu respect the segment size limits FUJITA Tomonori
2007-10-24 10:48 ` FUJITA Tomonori [this message]
2007-10-24 10:48 ` [PATCH -mm 05/11] IA64: make sba_iommu " FUJITA Tomonori
2007-10-24 10:48 ` [PATCH -mm 06/11] alpha: make pci_iommu " FUJITA Tomonori
2007-10-24 10:48 ` [PATCH -mm 07/11] sparc64: make iommu " FUJITA Tomonori
2007-10-24 10:48 ` [PATCH -mm 08/11] parisc: " FUJITA Tomonori
2007-10-24 11:35   ` Jeff Garzik
2007-10-24 10:48 ` [PATCH -mm 09/11] call blk_queue_segment_boundary in __scsi_alloc_queue FUJITA Tomonori
2007-10-24 11:39   ` Jeff Garzik
2007-10-24 14:15     ` FUJITA Tomonori
2007-10-24 14:28       ` Jens Axboe
2007-10-24 14:36         ` FUJITA Tomonori
2007-10-24 14:36           ` FUJITA Tomonori
2007-10-24 14:34       ` Jeff Garzik
2007-10-24 10:48 ` [PATCH -mm 10/11] sata_inic162x: use pci_set_dma_max_seg_size FUJITA Tomonori
2007-10-24 11:39   ` Jeff Garzik
2007-10-24 10:48 ` [PATCH -mm 11/11] aacraid: " FUJITA Tomonori
2007-10-24 11:31   ` Jeff Garzik
2007-10-24 11:35     ` FUJITA Tomonori
2007-10-24 13:34     ` Salyzyn, Mark
2007-10-24 13:34       ` Salyzyn, Mark
2007-10-24 13:34   ` Salyzyn, Mark
2007-10-24 13:34     ` Salyzyn, Mark
2007-10-24 16:21     ` FUJITA Tomonori
2007-10-24 16:25       ` Salyzyn, Mark
2007-10-24 16:25         ` Salyzyn, Mark
2007-10-24 11:40 ` [PATCH -mm 0/11] fix iommu sg merging problem Jeff Garzik
2007-10-24 14:32   ` FUJITA Tomonori
2007-10-24 13:24 ` Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20071024171642A.tomof@acm.org \
    --to=tomof@acm.org \
    --cc=akpm@linux-foundation.org \
    --cc=fujita.tomonori@lab.ntt.co.jp \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=paulus@samba.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.