Commit 4e184f8f authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

ALSA: Fix allocation size calculation in snd_dma_alloc_pages_fallback()

snd_dma_alloc_pages_fallback() always tries to reduce the size in a half,
but it's not good when the given size isn't a power-of-two.
Check it first then try to align.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
parent 77a23f26
...@@ -277,11 +277,16 @@ int snd_dma_alloc_pages_fallback(int type, struct device *device, size_t size, ...@@ -277,11 +277,16 @@ int snd_dma_alloc_pages_fallback(int type, struct device *device, size_t size,
int err; int err;
while ((err = snd_dma_alloc_pages(type, device, size, dmab)) < 0) { while ((err = snd_dma_alloc_pages(type, device, size, dmab)) < 0) {
size_t aligned_size;
if (err != -ENOMEM) if (err != -ENOMEM)
return err; return err;
size >>= 1;
if (size <= PAGE_SIZE) if (size <= PAGE_SIZE)
return -ENOMEM; return -ENOMEM;
aligned_size = PAGE_SIZE << get_order(size);
if (size != aligned_size)
size = aligned_size;
else
size >>= 1;
} }
if (! dmab->area) if (! dmab->area)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment