[alsa-devel] [PATCH 5/7] ALSA: core: Implement compress page allocation and free routines
Takashi Iwai
tiwai at suse.de
Tue Dec 17 11:24:01 CET 2019
On Tue, 17 Dec 2019 10:58:49 +0100,
Cezary Rojewski wrote:
>
> Add simple malloc and free methods for memory management for compress
> streams. Based on snd_pcm_lib_malloc_pages and snd_pcm_lib_free_pages
> implementation.
I see no user of these functions in the series. How these are
supposed to be used?
Takashi
>
> Signed-off-by: Cezary Rojewski <cezary.rojewski at intel.com>
> Signed-off-by: Divya Prakash <divya1.prakash at intel.com>
> ---
> include/sound/compress_driver.h | 5 ++++
> sound/core/compress_offload.c | 42 +++++++++++++++++++++++++++++++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
> index 00f633c0c3ba..6ce8effa0b12 100644
> --- a/include/sound/compress_driver.h
> +++ b/include/sound/compress_driver.h
> @@ -67,6 +67,7 @@ struct snd_compr_runtime {
> * @metadata_set: metadata set flag, true when set
> * @next_track: has userspace signal next track transition, true when set
> * @private_data: pointer to DSP private data
> + * @dma_buffer: allocated buffer if any
> */
> struct snd_compr_stream {
> const char *name;
> @@ -78,6 +79,7 @@ struct snd_compr_stream {
> bool metadata_set;
> bool next_track;
> void *private_data;
> + struct snd_dma_buffer dma_buffer;
> };
>
> /**
> @@ -212,6 +214,9 @@ snd_compr_set_runtime_buffer(struct snd_compr_stream *stream,
> }
> }
>
> +int snd_compr_malloc_pages(struct snd_compr_stream *stream, size_t size);
> +int snd_compr_free_pages(struct snd_compr_stream *stream);
> +
> int snd_compr_stop_error(struct snd_compr_stream *stream,
> snd_pcm_state_t state);
>
> diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
> index f34ce564d92c..dfb20ceb2d30 100644
> --- a/sound/core/compress_offload.c
> +++ b/sound/core/compress_offload.c
> @@ -488,6 +488,48 @@ snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
> }
> #endif /* !COMPR_CODEC_CAPS_OVERFLOW */
>
> +int snd_compr_malloc_pages(struct snd_compr_stream *stream, size_t size)
> +{
> + struct snd_dma_buffer *dmab;
> + int ret;
> +
> + if (snd_BUG_ON(!(stream) || !(stream)->runtime))
> + return -EINVAL;
> + dmab = kzalloc(sizeof(*dmab), GFP_KERNEL);
> + if (!dmab)
> + return -ENOMEM;
> + dmab->dev = stream->dma_buffer.dev;
> + ret = snd_dma_alloc_pages(dmab->dev.type, dmab->dev.dev, size, dmab);
> + if (ret < 0) {
> + kfree(dmab);
> + return ret;
> + }
> +
> + snd_compr_set_runtime_buffer(stream, dmab);
> + stream->runtime->dma_bytes = size;
> + return 1;
> +}
> +EXPORT_SYMBOL(snd_compr_malloc_pages);
> +
> +int snd_compr_free_pages(struct snd_compr_stream *stream)
> +{
> + struct snd_compr_runtime *runtime = stream->runtime;
> +
> + if (snd_BUG_ON(!(stream) || !(stream)->runtime))
> + return -EINVAL;
> + if (!runtime->dma_area)
> + return 0;
> + if (runtime->dma_buffer_p != &stream->dma_buffer) {
> + /* It's a newly allocated buffer. Release it now. */
> + snd_dma_free_pages(runtime->dma_buffer_p);
> + kfree(runtime->dma_buffer_p);
> + }
> +
> + snd_compr_set_runtime_buffer(stream, NULL);
> + return 0;
> +}
> +EXPORT_SYMBOL(snd_compr_free_pages);
> +
> /* revisit this with snd_pcm_preallocate_xxx */
> static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
> struct snd_compr_params *params)
> --
> 2.17.1
>
More information about the Alsa-devel
mailing list