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: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
77a23f2695
commit
4e184f8fc0
|
@ -277,11 +277,16 @@ int snd_dma_alloc_pages_fallback(int type, struct device *device, size_t size,
|
|||
int err;
|
||||
|
||||
while ((err = snd_dma_alloc_pages(type, device, size, dmab)) < 0) {
|
||||
size_t aligned_size;
|
||||
if (err != -ENOMEM)
|
||||
return err;
|
||||
size >>= 1;
|
||||
if (size <= PAGE_SIZE)
|
||||
return -ENOMEM;
|
||||
aligned_size = PAGE_SIZE << get_order(size);
|
||||
if (size != aligned_size)
|
||||
size = aligned_size;
|
||||
else
|
||||
size >>= 1;
|
||||
}
|
||||
if (! dmab->area)
|
||||
return -ENOMEM;
|
||||
|
|
Loading…
Reference in New Issue