Source: MontaVista Software, Inc. MR: 11506 Type: Defect Fix Disposition: needs submitting to LKML Signed-off-by: Daniel Walker Description: Ok, so here is the run down.. Basically , there is a race condition in sys_timer_delete() and posix_timer_event() . >From sys_timer_delete() : timer->it_process = NULL; } unlock_timer(timer, flags); /* Preemption happens here. */ release_posix_timer(timer, IT_ID_SET); So when the timer is getting triggered , right before it takes the timer lock, preemption happens. You finish the code above. Then your preempted again right after unlock timer, shown above. At this point, your triggering a timer that is half deleted, in posix_timer_fn() . timer->it_process = NULL , so when you try to send the signal to the timer owner you crash with an OOPS , because the timer owner was just set to NULL. Index: linux-2.6.10/kernel/posix-timers.c =================================================================== --- linux-2.6.10.orig/kernel/posix-timers.c 2005-04-26 17:38:25.000000000 +0000 +++ linux-2.6.10/kernel/posix-timers.c 2005-04-26 17:53:54.000000000 +0000 @@ -433,6 +433,14 @@ exit: int posix_timer_event(struct k_itimer *timr,int si_private) { + /* + * If it_process is NULL then this timer is + * in the process of being deleted. At this + * point we can't do very much. So we + * try to return gracefuly. + */ + if (timr->it_process == NULL) return 1; + memset(&timr->sigq->info, 0, sizeof(siginfo_t)); timr->sigq->info.si_sys_private = si_private; /*