On Mon, May 18, 2009 at 05:59:46PM -0700, Dan Williams wrote: > diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c > index 6290d05..3caecdd 100644 > --- a/crypto/async_tx/async_xor.c > +++ b/crypto/async_tx/async_xor.c > @@ -33,11 +33,10 @@ > /* do_async_xor - dma map the pages and perform the xor with an engine */ > static __async_inline struct dma_async_tx_descriptor * > do_async_xor(struct dma_chan *chan, struct page *dest, struct page **src_list, > - unsigned int offset, int src_cnt, size_t len, > + unsigned int offset, int src_cnt, size_t len, dma_addr_t *dma_src, > struct async_submit_ctl *submit) > { > struct dma_device *dma = chan->device; > - dma_addr_t *dma_src = (dma_addr_t *) src_list; > struct dma_async_tx_descriptor *tx = NULL; > int src_off = 0; > int i; > @@ -125,9 +124,14 @@ do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset, > int xor_src_cnt; > int src_off = 0; > void *dest_buf; > - void **srcs = (void **) src_list; > + void **srcs; > > - /* reuse the 'src_list' array to convert to buffer pointers */ > + if (submit->scribble) > + srcs = (void **) submit->scribble; Unnecessary cast as submit->scribble is void *. > @@ -171,17 +175,26 @@ async_xor(struct page *dest, struct page **src_list, unsigned int offset, > struct dma_chan *chan = async_tx_find_channel(submit, DMA_XOR, > &dest, 1, src_list, > src_cnt, len); > + dma_addr_t *dma_src = NULL; > + > BUG_ON(src_cnt <= 1); > > - if (chan) { > + if (submit->scribble) > + dma_src = submit->scribble; > + else if (sizeof(dma_addr_t) <= sizeof(struct page *)) > + dma_src = (dma_addr_t *) src_list; > + > + if (dma_src && chan) { > /* run the xor asynchronously */ > pr_debug("%s (async): len: %zu\n", __func__, len); > > return do_async_xor(chan, dest, src_list, offset, src_cnt, len, > - submit); > + dma_src, submit); > } else { Don't we need to fall back to sync xor if src_cnt exceeds what the device can handle, i.e. if it is larger than chan->device->max_xor? async_xor_val() further down has a check for this condition. Thanks Andre -- The only person who always got his work done by Friday was Robinson Crusoe
Attachment:
signature.asc
Description: Digital signature