diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-12-23 16:24:15 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-12-23 16:24:15 +0100 |
commit | bf8bd66d0580f296f257d371ee41a0a137b541c7 (patch) | |
tree | 4c7f7471005b4436d40ba52edd51214d12331f25 /crypto/async_tx | |
parent | 8ae936690972dfcad73d0dde1095b9f32af5ee95 (diff) | |
parent | 1ccedb7cdba6886939dd8b4c8f965a826f696e56 (diff) |
Merge branch 'x86/apic' into x86/irq
Conflicts:
arch/x86/kernel/apic.c
Diffstat (limited to 'crypto/async_tx')
-rw-r--r-- | crypto/async_tx/async_xor.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c index c029d3eb9ef..595b78672b3 100644 --- a/crypto/async_tx/async_xor.c +++ b/crypto/async_tx/async_xor.c @@ -53,10 +53,17 @@ do_async_xor(struct dma_chan *chan, struct page *dest, struct page **src_list, int xor_src_cnt; dma_addr_t dma_dest; - dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_FROM_DEVICE); - for (i = 0; i < src_cnt; i++) + /* map the dest bidrectional in case it is re-used as a source */ + dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_BIDIRECTIONAL); + for (i = 0; i < src_cnt; i++) { + /* only map the dest once */ + if (unlikely(src_list[i] == dest)) { + dma_src[i] = dma_dest; + continue; + } dma_src[i] = dma_map_page(dma->dev, src_list[i], offset, len, DMA_TO_DEVICE); + } while (src_cnt) { async_flags = flags; |