Skip to content

Commit

Permalink
[PATCH] ppc64: iommu vmerge fix
Browse files Browse the repository at this point in the history
This fixes a bug in the PPC64 iommu vmerge code which results in the
potential for iommu_unmap_sg to go off unmapping more than it should.

This was found on a test system which resulted in PCI bus errors due to
PCI memory being unmapped while DMAs were still in progress.

Signed-off-by: Brian King <brking@us.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Brian King authored and Linus Torvalds committed Aug 17, 2005
1 parent 75e8727 commit ac9af7c
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions arch/ppc64/kernel/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
dma_addr_t dma_next = 0, dma_addr;
unsigned long flags;
struct scatterlist *s, *outs, *segstart;
int outcount;
int outcount, incount;
unsigned long handle;

BUG_ON(direction == DMA_NONE);
Expand All @@ -252,6 +252,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,

outs = s = segstart = &sglist[0];
outcount = 1;
incount = nelems;
handle = 0;

/* Init first segment length for backout at failure */
Expand Down Expand Up @@ -338,10 +339,10 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,

DBG("mapped %d elements:\n", outcount);

/* For the sake of iommu_free_sg, we clear out the length in the
/* For the sake of iommu_unmap_sg, we clear out the length in the
* next entry of the sglist if we didn't fill the list completely
*/
if (outcount < nelems) {
if (outcount < incount) {
outs++;
outs->dma_address = DMA_ERROR_CODE;
outs->dma_length = 0;
Expand Down

0 comments on commit ac9af7c

Please sign in to comment.