dmaengine: fix dmatest to verify minimum transfer length and test buffer size
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Fri, 4 Dec 2009 18:44:48 +0000 (19:44 +0100)
committerDan Williams <dan.j.williams@intel.com>
Fri, 11 Dec 2009 06:27:51 +0000 (23:27 -0700)
Transfers and the test buffer have to be at least align bytes long.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/dma/dmatest.c

index a32a4cf7b1e049ab537db5c065f4f6a474dca2d2..8b905161fbf443b4d14036e7a425755a76b4ab3e 100644 (file)
@@ -298,10 +298,6 @@ static int dmatest_func(void *data)
 
                total_tests++;
 
-               len = dmatest_random() % test_buf_size + 1;
-               src_off = dmatest_random() % (test_buf_size - len + 1);
-               dst_off = dmatest_random() % (test_buf_size - len + 1);
-
                /* honor alignment restrictions */
                if (thread->type == DMA_MEMCPY)
                        align = dev->copy_align;
@@ -310,7 +306,19 @@ static int dmatest_func(void *data)
                else if (thread->type == DMA_PQ)
                        align = dev->pq_align;
 
+               if (1 << align > test_buf_size) {
+                       pr_err("%u-byte buffer too small for %d-byte alignment\n",
+                              test_buf_size, 1 << align);
+                       break;
+               }
+
+               len = dmatest_random() % test_buf_size + 1;
                len = (len >> align) << align;
+               if (!len)
+                       len = 1 << align;
+               src_off = dmatest_random() % (test_buf_size - len + 1);
+               dst_off = dmatest_random() % (test_buf_size - len + 1);
+
                src_off = (src_off >> align) << align;
                dst_off = (dst_off >> align) << align;