ALSA: compress: make use of runtime buffer for copy
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Thu, 15 Nov 2018 18:13:21 +0000 (18:13 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 14 Dec 2018 12:43:45 +0000 (12:43 +0000)
Default copy function uses kmalloc to allocate buffers, lets check
if the runtime buffers are setup before making this allocations.
This can be useful if the buffers are dma buffers.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Acked-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/core/compress_offload.c

index 26b5e245b0747dce67fb3c8aad3ca0d5f513a194..a5b09e75e7874bb6a1facc9a9fd70e6fdac10791 100644 (file)
@@ -171,7 +171,8 @@ static int snd_compr_free(struct inode *inode, struct file *f)
        }
 
        data->stream.ops->free(&data->stream);
-       kfree(data->stream.runtime->buffer);
+       if (!data->stream.runtime->dma_buffer_p)
+               kfree(data->stream.runtime->buffer);
        kfree(data->stream.runtime);
        kfree(data);
        return 0;
@@ -505,7 +506,7 @@ static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
                struct snd_compr_params *params)
 {
        unsigned int buffer_size;
-       void *buffer;
+       void *buffer = NULL;
 
        buffer_size = params->buffer.fragment_size * params->buffer.fragments;
        if (stream->ops->copy) {
@@ -514,7 +515,18 @@ static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
                 * the data from core
                 */
        } else {
-               buffer = kmalloc(buffer_size, GFP_KERNEL);
+               if (stream->runtime->dma_buffer_p) {
+
+                       if (buffer_size > stream->runtime->dma_buffer_p->bytes)
+                               dev_err(&stream->device->dev,
+                                               "Not enough DMA buffer");
+                       else
+                               buffer = stream->runtime->dma_buffer_p->area;
+
+               } else {
+                       buffer = kmalloc(buffer_size, GFP_KERNEL);
+               }
+
                if (!buffer)
                        return -ENOMEM;
        }