From: David Woodhouse In the error case, add_msg() gets called from timer functions, so should be using GFP_ATOMIC instead of GFP_KERNEL. Ref: http://bugzilla.kernel.org/show_bug.cgi?id=6659. Thanks to Christian Werner for reporting, and for the initial fix. Signed-off-by: David Woodhouse Signed-off-by: Andrew Morton --- drivers/char/n_r3964.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) diff -puN drivers/char/n_r3964.c~r3964-fix-gfp_kernel-allocations-in-timer-function drivers/char/n_r3964.c --- 25/drivers/char/n_r3964.c~r3964-fix-gfp_kernel-allocations-in-timer-function Fri Jun 9 15:30:49 2006 +++ 25-akpm/drivers/char/n_r3964.c Fri Jun 9 15:30:49 2006 @@ -951,7 +951,8 @@ static void add_msg(struct r3964_client_ { queue_the_message: - pMsg = kmalloc(sizeof(struct r3964_message), GFP_KERNEL); + pMsg = kmalloc(sizeof(struct r3964_message), + error_code?GFP_ATOMIC:GFP_KERNEL); TRACE_M("add_msg - kmalloc %p",pMsg); if(pMsg==NULL) { return; _