iommu/dma: Restore scatterlist offsets correctly
With the change to stashing just the IOVA-page-aligned remainder of the
CPU-page offset rather than the whole thing, the failure path in
__invalidate_sg() also needs tweaking to account for that in the case of
differing page sizes where the two offsets may not be equivalent.
Similarly in __finalise_sg(), lest the architecture-specific wrappers
later get the wrong address for cache maintenance on sync or unmap.
Fixes: 164afb1d85
("iommu/dma: Use correct offset in map_sg")
Reported-by: Magnus Damm <damm+renesas@opensource.se>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Cc: stable@ver.kernel.org # v4.4+
Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
b70bb98448
commit
07b48ac4bb
|
@ -403,7 +403,7 @@ static int __finalise_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|||
unsigned int s_length = sg_dma_len(s);
|
||||
unsigned int s_dma_len = s->length;
|
||||
|
||||
s->offset = s_offset;
|
||||
s->offset += s_offset;
|
||||
s->length = s_length;
|
||||
sg_dma_address(s) = dma_addr + s_offset;
|
||||
dma_addr += s_dma_len;
|
||||
|
@ -422,7 +422,7 @@ static void __invalidate_sg(struct scatterlist *sg, int nents)
|
|||
|
||||
for_each_sg(sg, s, nents, i) {
|
||||
if (sg_dma_address(s) != DMA_ERROR_CODE)
|
||||
s->offset = sg_dma_address(s);
|
||||
s->offset += sg_dma_address(s);
|
||||
if (sg_dma_len(s))
|
||||
s->length = sg_dma_len(s);
|
||||
sg_dma_address(s) = DMA_ERROR_CODE;
|
||||
|
|
Loading…
Reference in New Issue