OSDN Git Service

dmaengine: dmatest: move test data alloc & free into functions
authorAlexandru Ardelean <alexandru.ardelean@analog.com>
Tue, 12 Feb 2019 15:11:39 +0000 (17:11 +0200)
committerVinod Koul <vkoul@kernel.org>
Mon, 25 Feb 2019 17:43:50 +0000 (23:13 +0530)
This patch starts to take advantage of the `dmatest_data` struct by moving
the common allocation & free-ing bits into functions.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/dmatest.c

index 3b148c2..50221d4 100644 (file)
@@ -486,6 +486,53 @@ static unsigned long long dmatest_KBs(s64 runtime, unsigned long long len)
        return FIXPT_TO_INT(dmatest_persec(runtime, len >> 10));
 }
 
+static void __dmatest_free_test_data(struct dmatest_data *d, unsigned int cnt)
+{
+       unsigned int i;
+
+       for (i = 0; i < cnt; i++)
+               kfree(d->raw[i]);
+
+       kfree(d->aligned);
+       kfree(d->raw);
+}
+
+static void dmatest_free_test_data(struct dmatest_data *d)
+{
+       __dmatest_free_test_data(d, d->cnt);
+}
+
+static int dmatest_alloc_test_data(struct dmatest_data *d,
+               unsigned int buf_size, u8 align)
+{
+       unsigned int i = 0;
+
+       d->raw = kcalloc(d->cnt + 1, sizeof(u8 *), GFP_KERNEL);
+       if (!d->raw)
+               return -ENOMEM;
+
+       d->aligned = kcalloc(d->cnt + 1, sizeof(u8 *), GFP_KERNEL);
+       if (!d->aligned)
+               goto err;
+
+       for (i = 0; i < d->cnt; i++) {
+               d->raw[i] = kmalloc(buf_size + align, GFP_KERNEL);
+               if (!d->raw[i])
+                       goto err;
+
+               /* align to alignment restriction */
+               if (align)
+                       d->aligned[i] = PTR_ALIGN(d->raw[i], align);
+               else
+                       d->aligned[i] = d->raw[i];
+       }
+
+       return 0;
+err:
+       __dmatest_free_test_data(d, i);
+       return -ENOMEM;
+}
+
 /*
  * This function repeatedly tests DMA transfers of various lengths and
  * offsets for a given operation type until it is told to exit by
@@ -588,55 +635,17 @@ static int dmatest_func(void *data)
                goto err_free_coefs;
        }
 
-       src->aligned = kcalloc(src->cnt + 1, sizeof(u8 *), GFP_KERNEL);
-       if (!src->aligned)
+       if (dmatest_alloc_test_data(src, buf_size, align) < 0)
                goto err_free_coefs;
 
-       src->raw = kcalloc(src->cnt + 1, sizeof(u8 *), GFP_KERNEL);
-       if (!src->raw)
-               goto err_usrcs;
-
-       for (i = 0; i < src->cnt; i++) {
-               src->raw[i] = kmalloc(buf_size + align,
-                                          GFP_KERNEL);
-               if (!src->raw[i])
-                       goto err_srcbuf;
-
-               /* align srcs to alignment restriction */
-               if (align)
-                       src->aligned[i] = PTR_ALIGN(src->raw[i], align);
-               else
-                       src->aligned[i] = src->raw[i];
-       }
-       src->aligned[i] = NULL;
-
-       dst->aligned = kcalloc(dst->cnt + 1, sizeof(u8 *), GFP_KERNEL);
-       if (!dst->aligned)
-               goto err_dsts;
-
-       dst->raw = kcalloc(dst->cnt + 1, sizeof(u8 *), GFP_KERNEL);
-       if (!dst->raw)
-               goto err_udsts;
-
-       for (i = 0; i < dst->cnt; i++) {
-               dst->raw[i] = kmalloc(buf_size + align,
-                                          GFP_KERNEL);
-               if (!dst->raw[i])
-                       goto err_dstbuf;
-
-               /* align dsts to alignment restriction */
-               if (align)
-                       dst->aligned[i] = PTR_ALIGN(dst->raw[i], align);
-               else
-                       dst->aligned[i] = dst->raw[i];
-       }
-       dst->aligned[i] = NULL;
+       if (dmatest_alloc_test_data(dst, buf_size, align) < 0)
+               goto err_src;
 
        set_user_nice(current, 10);
 
        srcs = kcalloc(src->cnt, sizeof(dma_addr_t), GFP_KERNEL);
        if (!srcs)
-               goto err_dstbuf;
+               goto err_dst;
 
        dma_pq = kcalloc(dst->cnt, sizeof(dma_addr_t), GFP_KERNEL);
        if (!dma_pq)
@@ -865,19 +874,10 @@ static int dmatest_func(void *data)
        kfree(dma_pq);
 err_srcs_array:
        kfree(srcs);
-err_dstbuf:
-       for (i = 0; dst->raw[i]; i++)
-               kfree(dst->raw[i]);
-       kfree(dst->raw);
-err_udsts:
-       kfree(dst->aligned);
-err_dsts:
-err_srcbuf:
-       for (i = 0; src->raw[i]; i++)
-               kfree(src->raw[i]);
-       kfree(src->raw);
-err_usrcs:
-       kfree(src->aligned);
+err_dst:
+       dmatest_free_test_data(dst);
+err_src:
+       dmatest_free_test_data(src);
 err_free_coefs:
        kfree(pq_coefs);
 err_thread_type: