Messages in this thread Patch in this message | | | Date | Wed, 23 Feb 2005 13:48:20 -0800 | From | Roland McGrath <> | Subject | [PATCH] fix posix-timer initialization |
| |
> The problem arises from code touching the union in alloc_posix_timer() > which makes firing go non-zero. When firing is checked in > posix_cpu_timer_set() it will be positive causing an infinite loop. > > So either the below fix or preferably move the INIT_LIST_HEAD(x) from > alloc_posix_timer() to somewhere later where it doesn't disturb the other > union members.
Thanks for finding this problem. The latter is what I think is the right solution. This patch does that, and also removes some superfluous rezeroing.
Thanks, Roland
Signed-off-by: Roland McGrath <roland@redhat.com>
--- linux-2.6/kernel/posix-timers.c +++ linux-2.6/kernel/posix-timers.c @@ -221,9 +221,8 @@ static inline int common_clock_set(clock static inline int common_timer_create(struct k_itimer *new_timer) { - new_timer->it.real.incr = 0; + INIT_LIST_HEAD(&new_timer->it.real.abs_timer_entry); init_timer(&new_timer->it.real.timer); - new_timer->it.real.timer.expires = 0; new_timer->it.real.timer.data = (unsigned long) new_timer; new_timer->it.real.timer.function = posix_timer_fn; set_timer_inactive(new_timer); @@ -564,7 +563,6 @@ static struct k_itimer * alloc_posix_tim if (!tmr) return tmr; memset(tmr, 0, sizeof (struct k_itimer)); - INIT_LIST_HEAD(&tmr->it.real.abs_timer_entry); if (unlikely(!(tmr->sigq = sigqueue_alloc()))) { kmem_cache_free(posix_timers_cache, tmr); tmr = NULL; - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |