Re: [PATCH v2 04/11] async_xor: permit callers to pass in a 'dma/page scribble' region

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux