From: Takashi Iwai Date: Wed, 30 Jul 2008 13:13:33 +0000 (+0200) Subject: ALSA: Fix allocation size calculation in snd_dma_alloc_pages_fallback() X-Git-Tag: firefly_0821_release~16888^2~210 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4e184f8fc06411f35fdcf4b9bc6187c857bf7214;p=firefly-linux-kernel-4.4.55.git 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 Signed-off-by: Jaroslav Kysela --- diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c index f0c3b1d6da81..a7b46ec72f32 100644 --- a/sound/core/memalloc.c +++ b/sound/core/memalloc.c @@ -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;