Re: [PATCH] dmaengine: dmatest: honor alignment restriction for buffers

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

 




On 11/24/2016 11:02 PM, Koul, Vinod wrote:
> On Mon, Nov 14, 2016 at 04:36:32PM -0700, Dave Jiang wrote:
>> Existing implementation does not honor the alignment restrictions imposed
>> by the DMA engines. Allocate buffers with built in slack for honoring
>> alignment restrictions. Creating new arrays to hold the aligned pointers
>> and use those pointers for operations.
>>
>> Signed-off-by: Dave Jiang <dave.jiang@xxxxxxxxx>
>> ---
>>  drivers/dma/dmatest.c |   57 ++++++++++++++++++++++++++++++++-----------------
>>  1 file changed, 37 insertions(+), 20 deletions(-)
>>
>> diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
>> index cf76fc6..65c2ee0 100644
>> --- a/drivers/dma/dmatest.c
>> +++ b/drivers/dma/dmatest.c
>> @@ -164,7 +164,9 @@ struct dmatest_thread {
>>  	struct task_struct	*task;
>>  	struct dma_chan		*chan;
>>  	u8			**srcs;
>> +	u8			**usrcs;
>>  	u8			**dsts;
>> +	u8			**udsts;
>>  	enum dma_transaction_type type;
>>  	bool			done;
>>  };
>> @@ -431,6 +433,7 @@ static int dmatest_func(void *data)
>>  	ktime_t			comparetime = ktime_set(0, 0);
>>  	s64			runtime = 0;
>>  	unsigned long long	total_len = 0;
>> +	u8			align = 0;
>>  
>>  	set_freezable();
>>  
>> @@ -441,18 +444,22 @@ static int dmatest_func(void *data)
>>  	params = &info->params;
>>  	chan = thread->chan;
>>  	dev = chan->device;
>> -	if (thread->type == DMA_MEMCPY)
>> +	if (thread->type == DMA_MEMCPY) {
>> +		align = dev->copy_align;
>>  		src_cnt = dst_cnt = 1;
>> -	else if (thread->type == DMA_SG)
>> +	} else if (thread->type == DMA_SG) {
>> +		align = dev->copy_align;
>>  		src_cnt = dst_cnt = sg_buffers;
>> -	else if (thread->type == DMA_XOR) {
>> +	} else if (thread->type == DMA_XOR) {
>>  		/* force odd to ensure dst = src */
>>  		src_cnt = min_odd(params->xor_sources | 1, dev->max_xor);
>>  		dst_cnt = 1;
>> +		align = dev->xor_align;
>>  	} else if (thread->type == DMA_PQ) {
>>  		/* force odd to ensure dst = src */
>>  		src_cnt = min_odd(params->pq_sources | 1, dma_maxpq(dev, 0));
>>  		dst_cnt = 2;
>> +		align = dev->pq_align;
>>  
>>  		pq_coefs = kmalloc(params->pq_sources+1, GFP_KERNEL);
>>  		if (!pq_coefs)
>> @@ -466,20 +473,35 @@ static int dmatest_func(void *data)
>>  	thread->srcs = kcalloc(src_cnt+1, sizeof(u8 *), GFP_KERNEL);
>>  	if (!thread->srcs)
>>  		goto err_srcs;
>> +
>> +	thread->usrcs = kcalloc(src_cnt+1, sizeof(u8 *), GFP_KERNEL);
> 
> spaces around + pls, here and other places

This would change how it looks compare to code around it that's already
there. Are you sure you want to do this?

> 
>> +	if (!thread->usrcs)
>> +		goto err_usrcs;
>> +
>>  	for (i = 0; i < src_cnt; i++) {
>> -		thread->srcs[i] = kmalloc(params->buf_size, GFP_KERNEL);
>> -		if (!thread->srcs[i])
>> +		thread->usrcs[i] = kmalloc(params->buf_size+align, GFP_KERNEL);
>> +		if (!thread->usrcs[i])
>>  			goto err_srcbuf;
>> +		/* align srcs to alignment restriction */
>> +		thread->srcs[i] = align ?
>> +			PTR_ALIGN(thread->usrcs[i], align) : thread->usrcs[i];
> 
> if-else would look more readable
> 
Will fix.
--
To unsubscribe from this list: send the line "unsubscribe dmaengine" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux PCI]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux