Re: [PATCH v2 04/11] async_xor: permit callers to pass in a 'dma/page scribble' region
From: Andre Noll <hidden>
Date: 2009-05-20 08:08:18
On Mon, May 18, 2009 at 05:59:46PM -0700, Dan Williams wrote:
quoted hunk ↗ jump to hunk
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 *.
quoted hunk ↗ jump to hunk
@@ -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
Attachments
- signature.asc [application/pgp-signature] 189 bytes