Hi all, I am working with an ARM embedded system and I porting an alsa application to that system.
Cirrus (the manufacturer of the board) wrote a generic alsa driver for "their" kernel (a kernel based on the 2.6.8 with some patches) and I ported the module to the vanilla kernel 2.6.19.
The module works fine (play and capture both work), but the function that allocates the memory prints a strange message in the kernel log when the buffers are allocated (the module calls kmalloc, which prints "sleeping function called from invalid context" to the log).
The buffers are allocated when the streams are started, not when the module is loaded, I think this is standard...
The buffers are allocated with the following line:
s->buffers = (audio_buf_t *) kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);
When the line here above is executed, slab.c prints the error the kernel log. The error comes from the "might_sleep_if" line:
static inline void cache_alloc_debugcheck_before(struct kmem_cache *cachep, gfp_t flags) { might_sleep_if(flags & __GFP_WAIT); #if DEBUG kmem_flagcheck(cachep, flags); #endif }
Playing with the module, I discovered that if I enable the interrupts before calling kmalloc, the error disappears. I wonder if this is correct, or if something is wrong...
Could someone of you explain to me why I have to enable the interrupts before calling kmalloc? The strange thing is that the module never explicitly turns them off (I attached the file to the mail)
Any help is greatly appreciated ;-) Bye Andrea
____________________________________________________________________________________ Food fight? Enjoy some healthy debate in the Yahoo! Answers Food & Drink Q&A. http://answers.yahoo.com/dir/?link=list&sid=396545367