public inbox for linux-kernel@vger.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,
	kyle@parisc-linux.org, fujita.tomonori@lab.ntt.co.jp
Subject: [PATCH -mm 08/11] parisc: make iommu respect the segment size limits
Date: Wed, 24 Oct 2007 19:48:27 +0900	[thread overview]
Message-ID: <20071024172113Y.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>
---
 drivers/parisc/ccio-dma.c      |    2 +-
 drivers/parisc/iommu-helpers.h |    7 ++++++-
 drivers/parisc/sba_iommu.c     |    2 +-
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
index 7c60cbd..2ec7db1 100644
--- a/drivers/parisc/ccio-dma.c
+++ b/drivers/parisc/ccio-dma.c
@@ -941,7 +941,7 @@ ccio_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
 	** w/o this association, we wouldn't have coherent DMA!
 	** Access to the virtual address is what forces a two pass algorithm.
 	*/
-	coalesced = iommu_coalesce_chunks(ioc, sglist, nents, ccio_alloc_range);
+	coalesced = iommu_coalesce_chunks(ioc, dev, sglist, nents, ccio_alloc_range);
 
 	/*
 	** Program the I/O Pdir
diff --git a/drivers/parisc/iommu-helpers.h b/drivers/parisc/iommu-helpers.h
index 0a1f99a..97ba828 100644
--- a/drivers/parisc/iommu-helpers.h
+++ b/drivers/parisc/iommu-helpers.h
@@ -95,12 +95,14 @@ iommu_fill_pdir(struct ioc *ioc, struct scatterlist *startsg, int nents,
 */
 
 static inline unsigned int
-iommu_coalesce_chunks(struct ioc *ioc, struct scatterlist *startsg, int nents,
+iommu_coalesce_chunks(struct ioc *ioc, struct device *dev,
+		      struct scatterlist *startsg, int nents,
 		      int (*iommu_alloc_range)(struct ioc *, size_t))
 {
 	struct scatterlist *contig_sg;	   /* contig chunk head */
 	unsigned long dma_offset, dma_len; /* start/len of DMA stream */
 	unsigned int n_mappings = 0;
+	unsigned int max_seg_size = dma_get_max_seg_size(dev);
 
 	while (nents > 0) {
 
@@ -142,6 +144,9 @@ iommu_coalesce_chunks(struct ioc *ioc, struct scatterlist *startsg, int nents,
 					    IOVP_SIZE) > DMA_CHUNK_SIZE))
 				break;
 
+			if (startsg->length + dma_len > max_seg_size)
+				break;
+
 			/*
 			** Next see if we can append the next chunk (i.e.
 			** it must end on one page and begin on another
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c
index e527a0e..d06627c 100644
--- a/drivers/parisc/sba_iommu.c
+++ b/drivers/parisc/sba_iommu.c
@@ -946,7 +946,7 @@ sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
 	** w/o this association, we wouldn't have coherent DMA!
 	** Access to the virtual address is what forces a two pass algorithm.
 	*/
-	coalesced = iommu_coalesce_chunks(ioc, sglist, nents, sba_alloc_range);
+	coalesced = iommu_coalesce_chunks(ioc, dev, sglist, nents, sba_alloc_range);
 
 	/*
 	** Program the I/O Pdir
-- 
1.5.2.4


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

Thread overview: 31+ 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 ` [PATCH -mm 04/11] ppc: make " FUJITA Tomonori
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 ` FUJITA Tomonori [this message]
2007-10-24 11:35   ` [PATCH -mm 08/11] parisc: " 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: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 16:21     ` FUJITA Tomonori
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=20071024172113Y.tomof@acm.org \
    --to=tomof@acm.org \
    --cc=akpm@linux-foundation.org \
    --cc=fujita.tomonori@lab.ntt.co.jp \
    --cc=kyle@parisc-linux.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox