|
@@ -104,7 +104,11 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev,
|
|
|
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);
|
|
|
+ unsigned int max_seg_size = min(dma_get_max_seg_size(dev),
|
|
|
+ (unsigned)DMA_CHUNK_SIZE);
|
|
|
+ unsigned int max_seg_boundary = dma_get_seg_boundary(dev) + 1;
|
|
|
+ if (max_seg_boundary) /* check if the addition above didn't overflow */
|
|
|
+ max_seg_size = min(max_seg_size, max_seg_boundary);
|
|
|
|
|
|
while (nents > 0) {
|
|
|
|
|
@@ -138,14 +142,11 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev,
|
|
|
|
|
|
/*
|
|
|
** First make sure current dma stream won't
|
|
|
- ** exceed DMA_CHUNK_SIZE if we coalesce the
|
|
|
+ ** exceed max_seg_size if we coalesce the
|
|
|
** next entry.
|
|
|
*/
|
|
|
- if(unlikely(ALIGN(dma_len + dma_offset + startsg->length,
|
|
|
- IOVP_SIZE) > DMA_CHUNK_SIZE))
|
|
|
- break;
|
|
|
-
|
|
|
- if (startsg->length + dma_len > max_seg_size)
|
|
|
+ if (unlikely(ALIGN(dma_len + dma_offset + startsg->length, IOVP_SIZE) >
|
|
|
+ max_seg_size))
|
|
|
break;
|
|
|
|
|
|
/*
|