On Thu, 17 Dec 2020 10:55:42 +0100,
Takashi Iwai wrote:
On Thu, 17 Dec 2020 10:43:45 +0100,That said, something like below (totally untested).
Lars-Peter Clausen wrote:
On 12/17/20 5:15 PM, Robin Gong wrote:Hm, a good question. Basically the PCM buffer size itself shouldn't
Since mmap for userspace is based on page alignment, add page alignmentI wonder, do we also have to align size to be a multiple of PAGE_SIZE
for iram alloc from pool, otherwise, some good data located in the same
page of dmab->area maybe touched wrongly by userspace like pulseaudio.
to avoid leaking unrelated data?
be influenced by that (i.e. no hw-constraint or such is needed), but
the padding should be cleared indeed. I somehow left those to the
allocator side, but maybe it's safer to clear the whole buffer in
sound/core/memalloc.c commonly.
We might pass the pass-aligned size to dmab->bytes field instead of
keeping the original value, too.
Takashi
---
--- a/sound/core/memalloc.c
+++ b/sound/core/memalloc.c
@@ -126,6 +126,7 @@ static inline gfp_t snd_mem_get_gfp_flags(const struct device *dev,
int snd_dma_alloc_pages(int type, struct device *device, size_t size,
struct snd_dma_buffer *dmab)
{
+ size_t orig_size = size;
gfp_t gfp;
if (WARN_ON(!size))
@@ -133,6 +134,7 @@ int snd_dma_alloc_pages(int type, struct device *device, size_t size,
if (WARN_ON(!dmab))
return -ENXIO;
+ size = PAGE_ALIGN(size);
dmab->dev.type = type;
dmab->dev.dev = device;
dmab->bytes = 0;
@@ -177,7 +179,8 @@ int snd_dma_alloc_pages(int type, struct device *device, size_t size,
}
if (! dmab->area)
return -ENOMEM;
- dmab->bytes = size;
+ memset(dmab->area, 0, size);
+ dmab->bytes = orig_size;
return 0;
}
EXPORT_SYMBOL(snd_dma_alloc_pages);