At Tue, 13 Apr 2004 17:22:52 +0100,
holborn wrote:
>
> On Martes 13 Abril 2004 16:27, Takashi Iwai wrote:
> > At Tue, 13 Apr 2004 12:37:10 +0100,
> >
>
> >
> > well, it means that your machine has really no RAM available for the
> > soundfont. on 2.4 kernel (or older ALSA version), the driver
> > allocated the pages in atomic, so it doesn't go to sleep.
> > on 2.6 and current ALSA, the page allocation is done with GFP_KERNEL,
> > so it may sleep until the page is available. it can take a long time
> > but must not be infinitely long.
> >
> > could you check whether the "page allocation failure" message already
> > appeared when sfxload hangs up?
> > does the message appears once or many times?
> >
> >
>
> Hi ... the message appears after reboot command ...
> I have load this soundfonts for years :-)
> No problems to load the soundfont in kernel 2.6.4 alsa 1.0.2c but still no
> load in 2.6.5, i checked in two machines gentoo and Debian ..
>
>
> I made the sfxload after booting ...
>
>
> free command after login is:
>
> Mem total 515728 used 37940 free 477788 ----> in kernel 2.6.5
> Mem total 515728 used 38916 free 476824 ----> in kernel 2.6.4
hmm, then it shouldn't fail.
i guess the attached patch fixes the problem. please give a try.
Takashi
Index: alsa-kernel/core/memalloc.c
===================================================================
RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/core/memalloc.c,v
retrieving revision 1.30
diff -u -r1.30 memalloc.c
--- alsa-kernel/core/memalloc.c 7 Apr 2004 17:49:39 -0000 1.30
+++ alsa-kernel/core/memalloc.c 13 Apr 2004 16:58:05 -0000
@@ -137,14 +137,17 @@
dma_addr_t *dma_handle, int flags)
{
void *ret;
- u64 dma_mask;
+ u64 dma_mask, coherent_dma_mask;
if (dev == NULL || !dev->dma_mask)
return dma_alloc_coherent(dev, size, dma_handle, flags);
dma_mask = *dev->dma_mask;
+ coherent_dma_mask = dev->coherent_dma_mask;
*dev->dma_mask = 0xffffffff; /* do without masking */
+ dev->coherent_dma_mask = 0xffffffff; /* do without masking */
ret = dma_alloc_coherent(dev, size, dma_handle, flags);
*dev->dma_mask = dma_mask; /* restore */
+ dev->coherent_dma_mask = coherent_dma_mask; /* restore */
if (ret) {
/* obtained address is out of range? */
if (((unsigned long)*dma_handle + size - 1) & ~dma_mask) {
@@ -154,8 +157,12 @@
}
} else {
/* wish to success now with the proper mask... */
- if (dma_mask != 0xffffffffUL)
+ if (dma_mask != 0xffffffffUL) {
+ /* allocation with GFP_ATOMIC to avoid the long stall */
+ flags &= ~GFP_KERNEL;
+ flags |= GFP_ATOMIC;
ret = dma_alloc_coherent(dev, size, dma_handle, flags);
+ }
}
return ret;
}