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: v2.6.28-rc1~720^2~167 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=4e184f8fc06411f35fdcf4b9bc6187c857bf7214;p=linux-2.6-omap-h63xx.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 f0c3b1d6da8..a7b46ec72f3 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;