diff mbox

dmaengine: dmatest: Remove use of VLAs

Message ID 20180409210603.3575-1-labbott@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Laura Abbott April 9, 2018, 9:06 p.m. UTC
There's an ongoing effort to remove VLAs from the kernel
(https://lkml.org/lkml/2018/3/7/621) to eventually turn on -Wvla.
The uses in dmatest are bounded by a check to make sure they fit
in a u8 so use that as an upper bound.

Signed-off-by: Laura Abbott <labbott@redhat.com>
---
 drivers/dma/dmatest.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Sinan Kaya April 9, 2018, 10:48 p.m. UTC | #1
On 4/9/2018 5:06 PM, Laura Abbott wrote:
> +			/* dst_cnt can't be more than u8 */
> +			dma_addr_t dma_pq[255];

This is 2k stack space on 64 bit architectures. Isn't that a lot?
Laura Abbott April 9, 2018, 11:14 p.m. UTC | #2
On 04/09/2018 03:48 PM, Sinan Kaya wrote:
> On 4/9/2018 5:06 PM, Laura Abbott wrote:
>> +			/* dst_cnt can't be more than u8 */
>> +			dma_addr_t dma_pq[255];
> 
> This is 2k stack space on 64 bit architectures. Isn't that a lot?
> 

Depends on your definition of 'a lot'. My assumption was that
since this was a test module there would be some willingness
to be a bit more generous. The problem is the array size is
based off of the parameters passed in, although oddly enough
it's based off of the minimum of two variables. If you have
a suggestion for a tighter bound we can use that. Another
option is to just switch to allocating the array with kmalloc.
That might be reasonable here since there's other setup
that happens before the test starts.

Thanks,
Laura
Sinan Kaya April 9, 2018, 11:19 p.m. UTC | #3
On 2018-04-09 19:14, Laura Abbott wrote:
> On 04/09/2018 03:48 PM, Sinan Kaya wrote:
>> On 4/9/2018 5:06 PM, Laura Abbott wrote:
>>> +			/* dst_cnt can't be more than u8 */
>>> +			dma_addr_t dma_pq[255];
>> 
>> This is 2k stack space on 64 bit architectures. Isn't that a lot?
>> 
> 
> Depends on your definition of 'a lot'. My assumption was that
> since this was a test module there would be some willingness
> to be a bit more generous. The problem is the array size is
> based off of the parameters passed in, although oddly enough
> it's based off of the minimum of two variables. If you have
> a suggestion for a tighter bound we can use that. Another
> option is to just switch to allocating the array with kmalloc.
> That might be reasonable here since there's other setup
> that happens before the test starts.

I think allocation is a better choice.

> 
> Thanks,
> Laura
> 
> --
> To unsubscribe from this list: send the line "unsubscribe dmaengine" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
kernel test robot April 10, 2018, 4 a.m. UTC | #4
Hi Laura,

I love your patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v4.16 next-20180409]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Laura-Abbott/dmaengine-dmatest-Remove-use-of-VLAs/20180410-094633
config: i386-randconfig-x076-201814 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All warnings (new ones prefixed by >>):

   Cyclomatic Complexity 1 include/linux/kasan-checks.h:kasan_check_write
   Cyclomatic Complexity 2 arch/x86/include/asm/bitops.h:set_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls
   Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u32
   Cyclomatic Complexity 3 include/linux/log2.h:is_power_of_2
   Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
   Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
   Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
   Cyclomatic Complexity 2 include/linux/list.h:__list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_add_tail
   Cyclomatic Complexity 1 include/linux/list.h:__list_del
   Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
   Cyclomatic Complexity 1 include/linux/list.h:list_del
   Cyclomatic Complexity 1 include/linux/err.h:IS_ERR
   Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_read
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_inc
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_dec_and_test
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_read
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_inc
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_dec_and_test
   Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
   Cyclomatic Complexity 3 include/linux/bitmap.h:bitmap_zero
   Cyclomatic Complexity 1 include/linux/jiffies.h:_msecs_to_jiffies
   Cyclomatic Complexity 3 include/linux/jiffies.h:msecs_to_jiffies
   Cyclomatic Complexity 70 include/linux/ktime.h:ktime_divns
   Cyclomatic Complexity 1 include/linux/ktime.h:ktime_to_us
   Cyclomatic Complexity 1 include/linux/mmzone.h:pfn_to_section_nr
   Cyclomatic Complexity 2 include/linux/mmzone.h:__nr_to_section
   Cyclomatic Complexity 1 include/linux/mmzone.h:__section_mem_map_addr
   Cyclomatic Complexity 1 include/linux/mmzone.h:__pfn_to_section
   Cyclomatic Complexity 1 include/linux/kobject.h:kobject_name
   Cyclomatic Complexity 2 include/linux/device.h:dev_name
   Cyclomatic Complexity 1 include/linux/dma-debug.h:debug_dma_map_page
   Cyclomatic Complexity 1 include/linux/dma-debug.h:debug_dma_mapping_error
   Cyclomatic Complexity 1 include/linux/dma-mapping.h:valid_dma_direction
   Cyclomatic Complexity 1 arch/x86/include/asm/dma-mapping.h:get_arch_dma_ops
   Cyclomatic Complexity 4 include/linux/dma-mapping.h:get_dma_ops
   Cyclomatic Complexity 1 include/linux/dma-mapping.h:dma_map_page_attrs
   Cyclomatic Complexity 2 include/linux/dma-mapping.h:dma_mapping_error
   Cyclomatic Complexity 1 include/linux/dmaengine.h:dma_submit_error
   Cyclomatic Complexity 1 include/linux/dmaengine.h:dma_chan_name
   Cyclomatic Complexity 2 include/linux/dmaengine.h:dmaengine_terminate_all
   Cyclomatic Complexity 1 include/linux/dmaengine.h:dmaf_continue
   Cyclomatic Complexity 1 include/linux/dmaengine.h:dmaf_p_disabled_continue
   Cyclomatic Complexity 1 include/linux/dmaengine.h:dma_dev_has_pq_continue
   Cyclomatic Complexity 1 include/linux/dmaengine.h:dma_dev_to_maxpq
   Cyclomatic Complexity 4 include/linux/dmaengine.h:dma_maxpq
   Cyclomatic Complexity 1 include/linux/dmaengine.h:__dma_cap_set
   Cyclomatic Complexity 1 include/linux/dmaengine.h:__dma_cap_zero
   Cyclomatic Complexity 2 include/linux/dmaengine.h:__dma_has_cap
   Cyclomatic Complexity 1 include/linux/dmaengine.h:dma_async_issue_pending
   Cyclomatic Complexity 3 include/linux/dmaengine.h:dma_async_is_tx_complete
   Cyclomatic Complexity 2 include/linux/freezer.h:freezing
   Cyclomatic Complexity 2 include/linux/freezer.h:try_to_freeze_unsafe
   Cyclomatic Complexity 2 include/linux/freezer.h:try_to_freeze
   Cyclomatic Complexity 1 include/linux/kasan.h:kasan_kmalloc
   Cyclomatic Complexity 28 include/linux/slab.h:kmalloc_index
   Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_trace
   Cyclomatic Complexity 1 include/linux/slab.h:kmalloc_order_trace
   Cyclomatic Complexity 67 include/linux/slab.h:kmalloc_large
   Cyclomatic Complexity 5 include/linux/slab.h:kmalloc
   Cyclomatic Complexity 5 include/linux/slab.h:kmalloc_array
   Cyclomatic Complexity 1 include/linux/slab.h:kcalloc
   Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
   Cyclomatic Complexity 2 include/linux/sched/task.h:put_task_struct
   Cyclomatic Complexity 2 drivers/dma/dmatest.c:gen_inv_idx
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:gen_src_value
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:gen_dst_value
   Cyclomatic Complexity 5 drivers/dma/dmatest.c:dmatest_init_srcs
   Cyclomatic Complexity 5 drivers/dma/dmatest.c:dmatest_init_dsts
   Cyclomatic Complexity 2 drivers/dma/dmatest.c:min_odd
   Cyclomatic Complexity 8 drivers/dma/dmatest.c:is_threaded_test_run
   Cyclomatic Complexity 5 drivers/dma/dmatest.c:dmatest_mismatch
   Cyclomatic Complexity 6 drivers/dma/dmatest.c:dmatest_verify
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:result
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:dbg_result
   Cyclomatic Complexity 5 drivers/dma/dmatest.c:dmatest_cleanup_channel
   Cyclomatic Complexity 5 drivers/dma/dmatest.c:stop_threaded_test
   Cyclomatic Complexity 2 drivers/dma/dmatest.c:dmatest_run_get
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:dmatest_exit
   Cyclomatic Complexity 2 drivers/dma/dmatest.c:dmatest_match_channel
   Cyclomatic Complexity 2 drivers/dma/dmatest.c:dmatest_match_device
   Cyclomatic Complexity 3 drivers/dma/dmatest.c:filter
   Cyclomatic Complexity 69 drivers/dma/dmatest.c:dmatest_persec
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:dmatest_KBs
   Cyclomatic Complexity 8 drivers/dma/dmatest.c:dmatest_add_threads
   Cyclomatic Complexity 8 drivers/dma/dmatest.c:dmatest_add_channel
   Cyclomatic Complexity 5 drivers/dma/dmatest.c:request_channels
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:run_threaded_test
   Cyclomatic Complexity 2 drivers/dma/dmatest.c:restart_threaded_test
   Cyclomatic Complexity 4 drivers/dma/dmatest.c:dmatest_run_set
   Cyclomatic Complexity 4 drivers/dma/dmatest.c:dmatest_callback
   Cyclomatic Complexity 1 drivers/dma/dmatest.c:dmatest_random
   Cyclomatic Complexity 52 drivers/dma/dmatest.c:dmatest_func
   Cyclomatic Complexity 4 drivers/dma/dmatest.c:dmatest_wait_get
   Cyclomatic Complexity 6 drivers/dma/dmatest.c:dmatest_init
   drivers/dma/dmatest.c: In function 'dmatest_func':
>> drivers/dma/dmatest.c:806:1: warning: the frame size of 4264 bytes is larger than 2048 bytes [-Wframe-larger-than=]
    }
    ^

vim +806 drivers/dma/dmatest.c

95019c8c5 Andy Shevchenko           2013-03-04  425  
4a776f0aa Haavard Skinnemoen        2008-07-08  426  /*
4a776f0aa Haavard Skinnemoen        2008-07-08  427   * This function repeatedly tests DMA transfers of various lengths and
b54d5cb91 Dan Williams              2009-03-25  428   * offsets for a given operation type until it is told to exit by
b54d5cb91 Dan Williams              2009-03-25  429   * kthread_stop(). There may be multiple threads running this function
b54d5cb91 Dan Williams              2009-03-25  430   * in parallel for a single channel, and there may be multiple channels
b54d5cb91 Dan Williams              2009-03-25  431   * being tested in parallel.
4a776f0aa Haavard Skinnemoen        2008-07-08  432   *
4a776f0aa Haavard Skinnemoen        2008-07-08  433   * Before each test, the source and destination buffer is initialized
4a776f0aa Haavard Skinnemoen        2008-07-08  434   * with a known pattern. This pattern is different depending on
4a776f0aa Haavard Skinnemoen        2008-07-08  435   * whether it's in an area which is supposed to be copied or
4a776f0aa Haavard Skinnemoen        2008-07-08  436   * overwritten, and different in the source and destination buffers.
4a776f0aa Haavard Skinnemoen        2008-07-08  437   * So if the DMA engine doesn't copy exactly what we tell it to copy,
4a776f0aa Haavard Skinnemoen        2008-07-08  438   * we'll notice.
4a776f0aa Haavard Skinnemoen        2008-07-08  439   */
4a776f0aa Haavard Skinnemoen        2008-07-08  440  static int dmatest_func(void *data)
4a776f0aa Haavard Skinnemoen        2008-07-08  441  {
4a776f0aa Haavard Skinnemoen        2008-07-08  442  	struct dmatest_thread	*thread = data;
6f6a23a21 Adam Wallis               2017-11-27  443  	struct dmatest_done	*done = &thread->test_done;
e03e93a97 Andy Shevchenko           2013-03-04  444  	struct dmatest_info	*info;
15b8a8ea1 Andy Shevchenko           2013-03-04  445  	struct dmatest_params	*params;
4a776f0aa Haavard Skinnemoen        2008-07-08  446  	struct dma_chan		*chan;
8be9e32b3 Akinobu Mita              2012-10-28  447  	struct dma_device	*dev;
4a776f0aa Haavard Skinnemoen        2008-07-08  448  	unsigned int		error_count;
4a776f0aa Haavard Skinnemoen        2008-07-08  449  	unsigned int		failed_tests = 0;
4a776f0aa Haavard Skinnemoen        2008-07-08  450  	unsigned int		total_tests = 0;
4a776f0aa Haavard Skinnemoen        2008-07-08  451  	dma_cookie_t		cookie;
4a776f0aa Haavard Skinnemoen        2008-07-08  452  	enum dma_status		status;
b54d5cb91 Dan Williams              2009-03-25  453  	enum dma_ctrl_flags 	flags;
945b5af3c Andy Shevchenko           2013-03-04  454  	u8			*pq_coefs = NULL;
4a776f0aa Haavard Skinnemoen        2008-07-08  455  	int			ret;
b54d5cb91 Dan Williams              2009-03-25  456  	int			src_cnt;
b54d5cb91 Dan Williams              2009-03-25  457  	int			dst_cnt;
b54d5cb91 Dan Williams              2009-03-25  458  	int			i;
e9405ef08 Sinan Kaya                2016-09-01  459  	ktime_t			ktime, start, diff;
8b0e19531 Thomas Gleixner           2016-12-25  460  	ktime_t			filltime = 0;
8b0e19531 Thomas Gleixner           2016-12-25  461  	ktime_t			comparetime = 0;
86727443a Dan Williams              2013-11-06  462  	s64			runtime = 0;
86727443a Dan Williams              2013-11-06  463  	unsigned long long	total_len = 0;
d64816086 Dave Jiang                2016-11-29  464  	u8			align = 0;
61b5f54d8 Sinan Kaya                2017-06-29  465  	bool			is_memset = false;
4a776f0aa Haavard Skinnemoen        2008-07-08  466  
adfa543e7 Tejun Heo                 2011-11-23  467  	set_freezable();
4a776f0aa Haavard Skinnemoen        2008-07-08  468  
4a776f0aa Haavard Skinnemoen        2008-07-08  469  	ret = -ENOMEM;
4a776f0aa Haavard Skinnemoen        2008-07-08  470  
4a776f0aa Haavard Skinnemoen        2008-07-08  471  	smp_rmb();
e03e93a97 Andy Shevchenko           2013-03-04  472  	info = thread->info;
15b8a8ea1 Andy Shevchenko           2013-03-04  473  	params = &info->params;
4a776f0aa Haavard Skinnemoen        2008-07-08  474  	chan = thread->chan;
8be9e32b3 Akinobu Mita              2012-10-28  475  	dev = chan->device;
d64816086 Dave Jiang                2016-11-29  476  	if (thread->type == DMA_MEMCPY) {
d64816086 Dave Jiang                2016-11-29  477  		align = dev->copy_align;
b54d5cb91 Dan Williams              2009-03-25  478  		src_cnt = dst_cnt = 1;
61b5f54d8 Sinan Kaya                2017-06-29  479  	} else if (thread->type == DMA_MEMSET) {
61b5f54d8 Sinan Kaya                2017-06-29  480  		align = dev->fill_align;
61b5f54d8 Sinan Kaya                2017-06-29  481  		src_cnt = dst_cnt = 1;
61b5f54d8 Sinan Kaya                2017-06-29  482  		is_memset = true;
d64816086 Dave Jiang                2016-11-29  483  	} else if (thread->type == DMA_XOR) {
8be9e32b3 Akinobu Mita              2012-10-28  484  		/* force odd to ensure dst = src */
15b8a8ea1 Andy Shevchenko           2013-03-04  485  		src_cnt = min_odd(params->xor_sources | 1, dev->max_xor);
b54d5cb91 Dan Williams              2009-03-25  486  		dst_cnt = 1;
d64816086 Dave Jiang                2016-11-29  487  		align = dev->xor_align;
58691d64c Dan Williams              2009-08-29  488  	} else if (thread->type == DMA_PQ) {
8be9e32b3 Akinobu Mita              2012-10-28  489  		/* force odd to ensure dst = src */
15b8a8ea1 Andy Shevchenko           2013-03-04  490  		src_cnt = min_odd(params->pq_sources | 1, dma_maxpq(dev, 0));
58691d64c Dan Williams              2009-08-29  491  		dst_cnt = 2;
d64816086 Dave Jiang                2016-11-29  492  		align = dev->pq_align;
945b5af3c Andy Shevchenko           2013-03-04  493  
15b8a8ea1 Andy Shevchenko           2013-03-04  494  		pq_coefs = kmalloc(params->pq_sources + 1, GFP_KERNEL);
945b5af3c Andy Shevchenko           2013-03-04  495  		if (!pq_coefs)
945b5af3c Andy Shevchenko           2013-03-04  496  			goto err_thread_type;
945b5af3c Andy Shevchenko           2013-03-04  497  
94de648d7 Anatolij Gustschin        2010-02-15  498  		for (i = 0; i < src_cnt; i++)
58691d64c Dan Williams              2009-08-29  499  			pq_coefs[i] = 1;
b54d5cb91 Dan Williams              2009-03-25  500  	} else
945b5af3c Andy Shevchenko           2013-03-04  501  		goto err_thread_type;
b54d5cb91 Dan Williams              2009-03-25  502  
b54d5cb91 Dan Williams              2009-03-25  503  	thread->srcs = kcalloc(src_cnt + 1, sizeof(u8 *), GFP_KERNEL);
b54d5cb91 Dan Williams              2009-03-25  504  	if (!thread->srcs)
b54d5cb91 Dan Williams              2009-03-25  505  		goto err_srcs;
d64816086 Dave Jiang                2016-11-29  506  
d64816086 Dave Jiang                2016-11-29  507  	thread->usrcs = kcalloc(src_cnt + 1, sizeof(u8 *), GFP_KERNEL);
d64816086 Dave Jiang                2016-11-29  508  	if (!thread->usrcs)
d64816086 Dave Jiang                2016-11-29  509  		goto err_usrcs;
d64816086 Dave Jiang                2016-11-29  510  
b54d5cb91 Dan Williams              2009-03-25  511  	for (i = 0; i < src_cnt; i++) {
d64816086 Dave Jiang                2016-11-29  512  		thread->usrcs[i] = kmalloc(params->buf_size + align,
d64816086 Dave Jiang                2016-11-29  513  					   GFP_KERNEL);
d64816086 Dave Jiang                2016-11-29  514  		if (!thread->usrcs[i])
b54d5cb91 Dan Williams              2009-03-25  515  			goto err_srcbuf;
d64816086 Dave Jiang                2016-11-29  516  
d64816086 Dave Jiang                2016-11-29  517  		/* align srcs to alignment restriction */
d64816086 Dave Jiang                2016-11-29  518  		if (align)
d64816086 Dave Jiang                2016-11-29  519  			thread->srcs[i] = PTR_ALIGN(thread->usrcs[i], align);
d64816086 Dave Jiang                2016-11-29  520  		else
d64816086 Dave Jiang                2016-11-29  521  			thread->srcs[i] = thread->usrcs[i];
b54d5cb91 Dan Williams              2009-03-25  522  	}
b54d5cb91 Dan Williams              2009-03-25  523  	thread->srcs[i] = NULL;
b54d5cb91 Dan Williams              2009-03-25  524  
b54d5cb91 Dan Williams              2009-03-25  525  	thread->dsts = kcalloc(dst_cnt + 1, sizeof(u8 *), GFP_KERNEL);
b54d5cb91 Dan Williams              2009-03-25  526  	if (!thread->dsts)
b54d5cb91 Dan Williams              2009-03-25  527  		goto err_dsts;
d64816086 Dave Jiang                2016-11-29  528  
d64816086 Dave Jiang                2016-11-29  529  	thread->udsts = kcalloc(dst_cnt + 1, sizeof(u8 *), GFP_KERNEL);
d64816086 Dave Jiang                2016-11-29  530  	if (!thread->udsts)
d64816086 Dave Jiang                2016-11-29  531  		goto err_udsts;
d64816086 Dave Jiang                2016-11-29  532  
b54d5cb91 Dan Williams              2009-03-25  533  	for (i = 0; i < dst_cnt; i++) {
d64816086 Dave Jiang                2016-11-29  534  		thread->udsts[i] = kmalloc(params->buf_size + align,
d64816086 Dave Jiang                2016-11-29  535  					   GFP_KERNEL);
d64816086 Dave Jiang                2016-11-29  536  		if (!thread->udsts[i])
b54d5cb91 Dan Williams              2009-03-25  537  			goto err_dstbuf;
d64816086 Dave Jiang                2016-11-29  538  
d64816086 Dave Jiang                2016-11-29  539  		/* align dsts to alignment restriction */
d64816086 Dave Jiang                2016-11-29  540  		if (align)
d64816086 Dave Jiang                2016-11-29  541  			thread->dsts[i] = PTR_ALIGN(thread->udsts[i], align);
d64816086 Dave Jiang                2016-11-29  542  		else
d64816086 Dave Jiang                2016-11-29  543  			thread->dsts[i] = thread->udsts[i];
b54d5cb91 Dan Williams              2009-03-25  544  	}
b54d5cb91 Dan Williams              2009-03-25  545  	thread->dsts[i] = NULL;
b54d5cb91 Dan Williams              2009-03-25  546  
e44e0aa3c Dan Williams              2009-03-25  547  	set_user_nice(current, 10);
e44e0aa3c Dan Williams              2009-03-25  548  
b203bd3f6 Ira Snyder                2011-03-03  549  	/*
d1cab34c0 Bartlomiej Zolnierkiewicz 2013-10-18  550  	 * src and dst buffers are freed by ourselves below
b203bd3f6 Ira Snyder                2011-03-03  551  	 */
0776ae7b8 Bartlomiej Zolnierkiewicz 2013-10-18  552  	flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
4a776f0aa Haavard Skinnemoen        2008-07-08  553  
86727443a Dan Williams              2013-11-06  554  	ktime = ktime_get();
0a2ff57d6 Nicolas Ferre             2009-07-03  555  	while (!kthread_should_stop()
15b8a8ea1 Andy Shevchenko           2013-03-04  556  	       && !(params->iterations && total_tests >= params->iterations)) {
b54d5cb91 Dan Williams              2009-03-25  557  		struct dma_async_tx_descriptor *tx = NULL;
4076e755d Dan Williams              2013-11-06  558  		struct dmaengine_unmap_data *um;
e9fe1e34b Laura Abbott              2018-04-09  559  		/* total buffer count must fit into u8 */
e9fe1e34b Laura Abbott              2018-04-09  560  		dma_addr_t srcs[255];
4076e755d Dan Williams              2013-11-06  561  		dma_addr_t *dsts;
ede23a586 Andy Shevchenko           2014-10-22  562  		unsigned int src_off, dst_off, len;
d86be86e9 Atsushi Nemoto            2009-01-13  563  
4a776f0aa Haavard Skinnemoen        2008-07-08  564  		total_tests++;
4a776f0aa Haavard Skinnemoen        2008-07-08  565  
fbfb8e1dc Stefan Roese              2017-04-27  566  		/* Check if buffer count fits into map count variable (u8) */
fbfb8e1dc Stefan Roese              2017-04-27  567  		if ((src_cnt + dst_cnt) >= 255) {
fbfb8e1dc Stefan Roese              2017-04-27  568  			pr_err("too many buffers (%d of 255 supported)\n",
fbfb8e1dc Stefan Roese              2017-04-27  569  			       src_cnt + dst_cnt);
fbfb8e1dc Stefan Roese              2017-04-27  570  			break;
fbfb8e1dc Stefan Roese              2017-04-27  571  		}
fbfb8e1dc Stefan Roese              2017-04-27  572  
15b8a8ea1 Andy Shevchenko           2013-03-04  573  		if (1 << align > params->buf_size) {
cfe4f2751 Guennadi Liakhovetski     2009-12-04  574  			pr_err("%u-byte buffer too small for %d-byte alignment\n",
15b8a8ea1 Andy Shevchenko           2013-03-04  575  			       params->buf_size, 1 << align);
cfe4f2751 Guennadi Liakhovetski     2009-12-04  576  			break;
cfe4f2751 Guennadi Liakhovetski     2009-12-04  577  		}
cfe4f2751 Guennadi Liakhovetski     2009-12-04  578  
ede23a586 Andy Shevchenko           2014-10-22  579  		if (params->noverify)
e3b9c3473 Dan Williams              2013-11-06  580  			len = params->buf_size;
ede23a586 Andy Shevchenko           2014-10-22  581  		else
15b8a8ea1 Andy Shevchenko           2013-03-04  582  			len = dmatest_random() % params->buf_size + 1;
ede23a586 Andy Shevchenko           2014-10-22  583  
83544ae9f Dan Williams              2009-09-08  584  		len = (len >> align) << align;
cfe4f2751 Guennadi Liakhovetski     2009-12-04  585  		if (!len)
cfe4f2751 Guennadi Liakhovetski     2009-12-04  586  			len = 1 << align;
ede23a586 Andy Shevchenko           2014-10-22  587  
ede23a586 Andy Shevchenko           2014-10-22  588  		total_len += len;
ede23a586 Andy Shevchenko           2014-10-22  589  
ede23a586 Andy Shevchenko           2014-10-22  590  		if (params->noverify) {
ede23a586 Andy Shevchenko           2014-10-22  591  			src_off = 0;
ede23a586 Andy Shevchenko           2014-10-22  592  			dst_off = 0;
ede23a586 Andy Shevchenko           2014-10-22  593  		} else {
e9405ef08 Sinan Kaya                2016-09-01  594  			start = ktime_get();
15b8a8ea1 Andy Shevchenko           2013-03-04  595  			src_off = dmatest_random() % (params->buf_size - len + 1);
15b8a8ea1 Andy Shevchenko           2013-03-04  596  			dst_off = dmatest_random() % (params->buf_size - len + 1);
cfe4f2751 Guennadi Liakhovetski     2009-12-04  597  
83544ae9f Dan Williams              2009-09-08  598  			src_off = (src_off >> align) << align;
83544ae9f Dan Williams              2009-09-08  599  			dst_off = (dst_off >> align) << align;
83544ae9f Dan Williams              2009-09-08  600  
e3b9c3473 Dan Williams              2013-11-06  601  			dmatest_init_srcs(thread->srcs, src_off, len,
61b5f54d8 Sinan Kaya                2017-06-29  602  					  params->buf_size, is_memset);
e3b9c3473 Dan Williams              2013-11-06  603  			dmatest_init_dsts(thread->dsts, dst_off, len,
61b5f54d8 Sinan Kaya                2017-06-29  604  					  params->buf_size, is_memset);
e9405ef08 Sinan Kaya                2016-09-01  605  
e9405ef08 Sinan Kaya                2016-09-01  606  			diff = ktime_sub(ktime_get(), start);
e9405ef08 Sinan Kaya                2016-09-01  607  			filltime = ktime_add(filltime, diff);
e3b9c3473 Dan Williams              2013-11-06  608  		}
b54d5cb91 Dan Williams              2009-03-25  609  
4076e755d Dan Williams              2013-11-06  610  		um = dmaengine_get_unmap_data(dev->dev, src_cnt + dst_cnt,
4076e755d Dan Williams              2013-11-06  611  					      GFP_KERNEL);
4076e755d Dan Williams              2013-11-06  612  		if (!um) {
4076e755d Dan Williams              2013-11-06  613  			failed_tests++;
4076e755d Dan Williams              2013-11-06  614  			result("unmap data NULL", total_tests,
4076e755d Dan Williams              2013-11-06  615  			       src_off, dst_off, len, ret);
4076e755d Dan Williams              2013-11-06  616  			continue;
4076e755d Dan Williams              2013-11-06  617  		}
4a776f0aa Haavard Skinnemoen        2008-07-08  618  
4076e755d Dan Williams              2013-11-06  619  		um->len = params->buf_size;
4076e755d Dan Williams              2013-11-06  620  		for (i = 0; i < src_cnt; i++) {
745c00daf Dan Williams              2013-12-09  621  			void *buf = thread->srcs[i];
4076e755d Dan Williams              2013-11-06  622  			struct page *pg = virt_to_page(buf);
f62e5f613 Geliang Tang              2017-04-22  623  			unsigned long pg_off = offset_in_page(buf);
4076e755d Dan Williams              2013-11-06  624  
4076e755d Dan Williams              2013-11-06  625  			um->addr[i] = dma_map_page(dev->dev, pg, pg_off,
4076e755d Dan Williams              2013-11-06  626  						   um->len, DMA_TO_DEVICE);
4076e755d Dan Williams              2013-11-06  627  			srcs[i] = um->addr[i] + src_off;
4076e755d Dan Williams              2013-11-06  628  			ret = dma_mapping_error(dev->dev, um->addr[i]);
afde3be12 Andy Shevchenko           2012-12-17  629  			if (ret) {
4076e755d Dan Williams              2013-11-06  630  				dmaengine_unmap_put(um);
872f05c6e Dan Williams              2013-11-06  631  				result("src mapping error", total_tests,
872f05c6e Dan Williams              2013-11-06  632  				       src_off, dst_off, len, ret);
afde3be12 Andy Shevchenko           2012-12-17  633  				failed_tests++;
afde3be12 Andy Shevchenko           2012-12-17  634  				continue;
afde3be12 Andy Shevchenko           2012-12-17  635  			}
4076e755d Dan Williams              2013-11-06  636  			um->to_cnt++;
b54d5cb91 Dan Williams              2009-03-25  637  		}
d86be86e9 Atsushi Nemoto            2009-01-13  638  		/* map with DMA_BIDIRECTIONAL to force writeback/invalidate */
4076e755d Dan Williams              2013-11-06  639  		dsts = &um->addr[src_cnt];
b54d5cb91 Dan Williams              2009-03-25  640  		for (i = 0; i < dst_cnt; i++) {
745c00daf Dan Williams              2013-12-09  641  			void *buf = thread->dsts[i];
4076e755d Dan Williams              2013-11-06  642  			struct page *pg = virt_to_page(buf);
f62e5f613 Geliang Tang              2017-04-22  643  			unsigned long pg_off = offset_in_page(buf);
4076e755d Dan Williams              2013-11-06  644  
4076e755d Dan Williams              2013-11-06  645  			dsts[i] = dma_map_page(dev->dev, pg, pg_off, um->len,
b54d5cb91 Dan Williams              2009-03-25  646  					       DMA_BIDIRECTIONAL);
4076e755d Dan Williams              2013-11-06  647  			ret = dma_mapping_error(dev->dev, dsts[i]);
afde3be12 Andy Shevchenko           2012-12-17  648  			if (ret) {
4076e755d Dan Williams              2013-11-06  649  				dmaengine_unmap_put(um);
872f05c6e Dan Williams              2013-11-06  650  				result("dst mapping error", total_tests,
872f05c6e Dan Williams              2013-11-06  651  				       src_off, dst_off, len, ret);
afde3be12 Andy Shevchenko           2012-12-17  652  				failed_tests++;
afde3be12 Andy Shevchenko           2012-12-17  653  				continue;
afde3be12 Andy Shevchenko           2012-12-17  654  			}
4076e755d Dan Williams              2013-11-06  655  			um->bidi_cnt++;
b54d5cb91 Dan Williams              2009-03-25  656  		}
83544ae9f Dan Williams              2009-09-08  657  
b54d5cb91 Dan Williams              2009-03-25  658  		if (thread->type == DMA_MEMCPY)
b54d5cb91 Dan Williams              2009-03-25  659  			tx = dev->device_prep_dma_memcpy(chan,
4076e755d Dan Williams              2013-11-06  660  							 dsts[0] + dst_off,
4076e755d Dan Williams              2013-11-06  661  							 srcs[0], len, flags);
61b5f54d8 Sinan Kaya                2017-06-29  662  		else if (thread->type == DMA_MEMSET)
61b5f54d8 Sinan Kaya                2017-06-29  663  			tx = dev->device_prep_dma_memset(chan,
61b5f54d8 Sinan Kaya                2017-06-29  664  						dsts[0] + dst_off,
61b5f54d8 Sinan Kaya                2017-06-29  665  						*(thread->srcs[0] + src_off),
61b5f54d8 Sinan Kaya                2017-06-29  666  						len, flags);
b54d5cb91 Dan Williams              2009-03-25  667  		else if (thread->type == DMA_XOR)
b54d5cb91 Dan Williams              2009-03-25  668  			tx = dev->device_prep_dma_xor(chan,
4076e755d Dan Williams              2013-11-06  669  						      dsts[0] + dst_off,
4076e755d Dan Williams              2013-11-06  670  						      srcs, src_cnt,
b54d5cb91 Dan Williams              2009-03-25  671  						      len, flags);
58691d64c Dan Williams              2009-08-29  672  		else if (thread->type == DMA_PQ) {
e9fe1e34b Laura Abbott              2018-04-09  673  			/* dst_cnt can't be more than u8 */
e9fe1e34b Laura Abbott              2018-04-09  674  			dma_addr_t dma_pq[255];
58691d64c Dan Williams              2009-08-29  675  
58691d64c Dan Williams              2009-08-29  676  			for (i = 0; i < dst_cnt; i++)
4076e755d Dan Williams              2013-11-06  677  				dma_pq[i] = dsts[i] + dst_off;
4076e755d Dan Williams              2013-11-06  678  			tx = dev->device_prep_dma_pq(chan, dma_pq, srcs,
94de648d7 Anatolij Gustschin        2010-02-15  679  						     src_cnt, pq_coefs,
58691d64c Dan Williams              2009-08-29  680  						     len, flags);
58691d64c Dan Williams              2009-08-29  681  		}
d86be86e9 Atsushi Nemoto            2009-01-13  682  
d86be86e9 Atsushi Nemoto            2009-01-13  683  		if (!tx) {
4076e755d Dan Williams              2013-11-06  684  			dmaengine_unmap_put(um);
872f05c6e Dan Williams              2013-11-06  685  			result("prep error", total_tests, src_off,
872f05c6e Dan Williams              2013-11-06  686  			       dst_off, len, ret);
d86be86e9 Atsushi Nemoto            2009-01-13  687  			msleep(100);
d86be86e9 Atsushi Nemoto            2009-01-13  688  			failed_tests++;
d86be86e9 Atsushi Nemoto            2009-01-13  689  			continue;
d86be86e9 Atsushi Nemoto            2009-01-13  690  		}
e44e0aa3c Dan Williams              2009-03-25  691  
6f6a23a21 Adam Wallis               2017-11-27  692  		done->done = false;
e44e0aa3c Dan Williams              2009-03-25  693  		tx->callback = dmatest_callback;
6f6a23a21 Adam Wallis               2017-11-27  694  		tx->callback_param = done;
d86be86e9 Atsushi Nemoto            2009-01-13  695  		cookie = tx->tx_submit(tx);
d86be86e9 Atsushi Nemoto            2009-01-13  696  
4a776f0aa Haavard Skinnemoen        2008-07-08  697  		if (dma_submit_error(cookie)) {
4076e755d Dan Williams              2013-11-06  698  			dmaengine_unmap_put(um);
872f05c6e Dan Williams              2013-11-06  699  			result("submit error", total_tests, src_off,
872f05c6e Dan Williams              2013-11-06  700  			       dst_off, len, ret);
4a776f0aa Haavard Skinnemoen        2008-07-08  701  			msleep(100);
4a776f0aa Haavard Skinnemoen        2008-07-08  702  			failed_tests++;
4a776f0aa Haavard Skinnemoen        2008-07-08  703  			continue;
4a776f0aa Haavard Skinnemoen        2008-07-08  704  		}
b54d5cb91 Dan Williams              2009-03-25  705  		dma_async_issue_pending(chan);
4a776f0aa Haavard Skinnemoen        2008-07-08  706  
6f6a23a21 Adam Wallis               2017-11-27  707  		wait_event_freezable_timeout(thread->done_wait, done->done,
15b8a8ea1 Andy Shevchenko           2013-03-04  708  					     msecs_to_jiffies(params->timeout));
981ed70d8 Guennadi Liakhovetski     2011-08-18  709  
e44e0aa3c Dan Williams              2009-03-25  710  		status = dma_async_is_tx_complete(chan, cookie, NULL, NULL);
4a776f0aa Haavard Skinnemoen        2008-07-08  711  
6f6a23a21 Adam Wallis               2017-11-27  712  		if (!done->done) {
4076e755d Dan Williams              2013-11-06  713  			dmaengine_unmap_put(um);
872f05c6e Dan Williams              2013-11-06  714  			result("test timed out", total_tests, src_off, dst_off,
95019c8c5 Andy Shevchenko           2013-03-04  715  			       len, 0);
4a776f0aa Haavard Skinnemoen        2008-07-08  716  			failed_tests++;
4a776f0aa Haavard Skinnemoen        2008-07-08  717  			continue;
19e9f99f2 Vinod Koul                2013-10-16  718  		} else if (status != DMA_COMPLETE) {
4076e755d Dan Williams              2013-11-06  719  			dmaengine_unmap_put(um);
872f05c6e Dan Williams              2013-11-06  720  			result(status == DMA_ERROR ?
872f05c6e Dan Williams              2013-11-06  721  			       "completion error status" :
872f05c6e Dan Williams              2013-11-06  722  			       "completion busy status", total_tests, src_off,
872f05c6e Dan Williams              2013-11-06  723  			       dst_off, len, ret);
e44e0aa3c Dan Williams              2009-03-25  724  			failed_tests++;
e44e0aa3c Dan Williams              2009-03-25  725  			continue;
4a776f0aa Haavard Skinnemoen        2008-07-08  726  		}
e44e0aa3c Dan Williams              2009-03-25  727  
4076e755d Dan Williams              2013-11-06  728  		dmaengine_unmap_put(um);
4a776f0aa Haavard Skinnemoen        2008-07-08  729  
e3b9c3473 Dan Williams              2013-11-06  730  		if (params->noverify) {
50137a7df Dan Williams              2013-11-08  731  			verbose_result("test passed", total_tests, src_off,
50137a7df Dan Williams              2013-11-08  732  				       dst_off, len, 0);
e3b9c3473 Dan Williams              2013-11-06  733  			continue;
e3b9c3473 Dan Williams              2013-11-06  734  		}
4a776f0aa Haavard Skinnemoen        2008-07-08  735  
e9405ef08 Sinan Kaya                2016-09-01  736  		start = ktime_get();
872f05c6e Dan Williams              2013-11-06  737  		pr_debug("%s: verifying source buffer...\n", current->comm);
e3b9c3473 Dan Williams              2013-11-06  738  		error_count = dmatest_verify(thread->srcs, 0, src_off,
61b5f54d8 Sinan Kaya                2017-06-29  739  				0, PATTERN_SRC, true, is_memset);
7b6101782 Dan Williams              2013-11-06  740  		error_count += dmatest_verify(thread->srcs, src_off,
7b6101782 Dan Williams              2013-11-06  741  				src_off + len, src_off,
61b5f54d8 Sinan Kaya                2017-06-29  742  				PATTERN_SRC | PATTERN_COPY, true, is_memset);
7b6101782 Dan Williams              2013-11-06  743  		error_count += dmatest_verify(thread->srcs, src_off + len,
7b6101782 Dan Williams              2013-11-06  744  				params->buf_size, src_off + len,
61b5f54d8 Sinan Kaya                2017-06-29  745  				PATTERN_SRC, true, is_memset);
7b6101782 Dan Williams              2013-11-06  746  
872f05c6e Dan Williams              2013-11-06  747  		pr_debug("%s: verifying dest buffer...\n", current->comm);
7b6101782 Dan Williams              2013-11-06  748  		error_count += dmatest_verify(thread->dsts, 0, dst_off,
61b5f54d8 Sinan Kaya                2017-06-29  749  				0, PATTERN_DST, false, is_memset);
61b5f54d8 Sinan Kaya                2017-06-29  750  
7b6101782 Dan Williams              2013-11-06  751  		error_count += dmatest_verify(thread->dsts, dst_off,
7b6101782 Dan Williams              2013-11-06  752  				dst_off + len, src_off,
61b5f54d8 Sinan Kaya                2017-06-29  753  				PATTERN_SRC | PATTERN_COPY, false, is_memset);
61b5f54d8 Sinan Kaya                2017-06-29  754  
7b6101782 Dan Williams              2013-11-06  755  		error_count += dmatest_verify(thread->dsts, dst_off + len,
7b6101782 Dan Williams              2013-11-06  756  				params->buf_size, dst_off + len,
61b5f54d8 Sinan Kaya                2017-06-29  757  				PATTERN_DST, false, is_memset);
4a776f0aa Haavard Skinnemoen        2008-07-08  758  
e9405ef08 Sinan Kaya                2016-09-01  759  		diff = ktime_sub(ktime_get(), start);
e9405ef08 Sinan Kaya                2016-09-01  760  		comparetime = ktime_add(comparetime, diff);
e9405ef08 Sinan Kaya                2016-09-01  761  
4a776f0aa Haavard Skinnemoen        2008-07-08  762  		if (error_count) {
872f05c6e Dan Williams              2013-11-06  763  			result("data error", total_tests, src_off, dst_off,
95019c8c5 Andy Shevchenko           2013-03-04  764  			       len, error_count);
4a776f0aa Haavard Skinnemoen        2008-07-08  765  			failed_tests++;
4a776f0aa Haavard Skinnemoen        2008-07-08  766  		} else {
50137a7df Dan Williams              2013-11-08  767  			verbose_result("test passed", total_tests, src_off,
50137a7df Dan Williams              2013-11-08  768  				       dst_off, len, 0);
4a776f0aa Haavard Skinnemoen        2008-07-08  769  		}
4a776f0aa Haavard Skinnemoen        2008-07-08  770  	}
e9405ef08 Sinan Kaya                2016-09-01  771  	ktime = ktime_sub(ktime_get(), ktime);
e9405ef08 Sinan Kaya                2016-09-01  772  	ktime = ktime_sub(ktime, comparetime);
e9405ef08 Sinan Kaya                2016-09-01  773  	ktime = ktime_sub(ktime, filltime);
e9405ef08 Sinan Kaya                2016-09-01  774  	runtime = ktime_to_us(ktime);
4a776f0aa Haavard Skinnemoen        2008-07-08  775  
4a776f0aa Haavard Skinnemoen        2008-07-08  776  	ret = 0;
8e1f50d74 Andy Shevchenko           2014-08-22  777  err_dstbuf:
d64816086 Dave Jiang                2016-11-29  778  	for (i = 0; thread->udsts[i]; i++)
d64816086 Dave Jiang                2016-11-29  779  		kfree(thread->udsts[i]);
d64816086 Dave Jiang                2016-11-29  780  	kfree(thread->udsts);
d64816086 Dave Jiang                2016-11-29  781  err_udsts:
b54d5cb91 Dan Williams              2009-03-25  782  	kfree(thread->dsts);
b54d5cb91 Dan Williams              2009-03-25  783  err_dsts:
8e1f50d74 Andy Shevchenko           2014-08-22  784  err_srcbuf:
d64816086 Dave Jiang                2016-11-29  785  	for (i = 0; thread->usrcs[i]; i++)
d64816086 Dave Jiang                2016-11-29  786  		kfree(thread->usrcs[i]);
d64816086 Dave Jiang                2016-11-29  787  	kfree(thread->usrcs);
d64816086 Dave Jiang                2016-11-29  788  err_usrcs:
b54d5cb91 Dan Williams              2009-03-25  789  	kfree(thread->srcs);
b54d5cb91 Dan Williams              2009-03-25  790  err_srcs:
945b5af3c Andy Shevchenko           2013-03-04  791  	kfree(pq_coefs);
945b5af3c Andy Shevchenko           2013-03-04  792  err_thread_type:
86727443a Dan Williams              2013-11-06  793  	pr_info("%s: summary %u tests, %u failures %llu iops %llu KB/s (%d)\n",
86727443a Dan Williams              2013-11-06  794  		current->comm, total_tests, failed_tests,
86727443a Dan Williams              2013-11-06  795  		dmatest_persec(runtime, total_tests),
86727443a Dan Williams              2013-11-06  796  		dmatest_KBs(runtime, total_len), ret);
0a2ff57d6 Nicolas Ferre             2009-07-03  797  
9704efaa5 Viresh Kumar              2011-07-29  798  	/* terminate all transfers on specified channels */
6f6a23a21 Adam Wallis               2017-11-27  799  	if (ret || failed_tests)
944ea4dd3 Jon Mason                 2012-11-11  800  		dmaengine_terminate_all(chan);
5e034f7b6 Shiraz Hashim             2012-11-09  801  
3e5ccd866 Andy Shevchenko           2013-03-04  802  	thread->done = true;
2d88ce76e Dan Williams              2013-11-06  803  	wake_up(&thread_wait);
0a2ff57d6 Nicolas Ferre             2009-07-03  804  
4a776f0aa Haavard Skinnemoen        2008-07-08  805  	return ret;
4a776f0aa Haavard Skinnemoen        2008-07-08 @806  }
4a776f0aa Haavard Skinnemoen        2008-07-08  807  

:::::: The code at line 806 was first introduced by commit
:::::: 4a776f0aa922a552460192c07b56f4fe9cd82632 dmatest: Simple DMA memcpy test client

:::::: TO: Haavard Skinnemoen <hskinnemoen@atmel.com>
:::::: CC: Dan Williams <dan.j.williams@intel.com>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Vinod Koul April 10, 2018, 3:38 p.m. UTC | #5
On Mon, Apr 09, 2018 at 04:14:20PM -0700, Laura Abbott wrote:
> On 04/09/2018 03:48 PM, Sinan Kaya wrote:
> >On 4/9/2018 5:06 PM, Laura Abbott wrote:
> >>+			/* dst_cnt can't be more than u8 */
> >>+			dma_addr_t dma_pq[255];
> >
> >This is 2k stack space on 64 bit architectures. Isn't that a lot?
> >
> 
> Depends on your definition of 'a lot'. My assumption was that
> since this was a test module there would be some willingness
> to be a bit more generous. The problem is the array size is
> based off of the parameters passed in, although oddly enough
> it's based off of the minimum of two variables. If you have
> a suggestion for a tighter bound we can use that. Another
> option is to just switch to allocating the array with kmalloc.
> That might be reasonable here since there's other setup
> that happens before the test starts.

Being a test module I don't think I would have too many qualms with current
approach :) said that kmalloc approach seems reasonable too..

Thanks
diff mbox

Patch

diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
index 80cc2be6483c..dcf787b173e4 100644
--- a/drivers/dma/dmatest.c
+++ b/drivers/dma/dmatest.c
@@ -556,7 +556,8 @@  static int dmatest_func(void *data)
 	       && !(params->iterations && total_tests >= params->iterations)) {
 		struct dma_async_tx_descriptor *tx = NULL;
 		struct dmaengine_unmap_data *um;
-		dma_addr_t srcs[src_cnt];
+		/* total buffer count must fit into u8 */
+		dma_addr_t srcs[255];
 		dma_addr_t *dsts;
 		unsigned int src_off, dst_off, len;
 
@@ -669,7 +670,8 @@  static int dmatest_func(void *data)
 						      srcs, src_cnt,
 						      len, flags);
 		else if (thread->type == DMA_PQ) {
-			dma_addr_t dma_pq[dst_cnt];
+			/* dst_cnt can't be more than u8 */
+			dma_addr_t dma_pq[255];
 
 			for (i = 0; i < dst_cnt; i++)
 				dma_pq[i] = dsts[i] + dst_off;