On Thu, 17 Dec 2020 16:38:22 +0100, Lars-Peter Clausen wrote:
Maybe what we need is a check that runtime->dma_area is page aligned and runtime->dma_bytes is a multiple of PAGE_SIZE. With a warning at first and then turn this into a error a year later or so.
OK, how about the following instead? Just check SNDRV_PCM_INFO_MMAP in runtime->info; if this is set, the buffer size must be aligned with the page size, and we are safe to extend the size to clear.
So the revised fix is much simpler, something like below.
I think this will work for the leaking data issue.
But it will not help with the original issue that gen_pool_dma_alloc_align() does not reserve the remainder of the page and could give it out to other allocations. We'd need a separate patch for that.
That can be fixed by the pcm_memory.c change in the previous patch. Recited below.
Of course it won't cover the non-standard allocation case, but then it's rather the responsibility of such driver.
Takashi
--- --- a/sound/core/pcm_memory.c +++ b/sound/core/pcm_memory.c @@ -36,6 +36,7 @@ static int do_alloc_pages(struct snd_card *card, int type, struct device *dev, { int err;
+ size = PAGE_ALIGN(size) if (max_alloc_per_card && card->total_pcm_alloc_bytes + size > max_alloc_per_card) return -ENOMEM; @@ -187,7 +188,7 @@ static void snd_pcm_lib_preallocate_proc_write(struct snd_info_entry *entry, buffer->error = -ENOMEM; return; } - substream->buffer_bytes_max = size; + substream->buffer_bytes_max = new_dmab.bytes; } else { substream->buffer_bytes_max = UINT_MAX; }