From: "Zhang, Yanmin" There is a minor problem in function start_kernel. start_kernel will enable interrupt after calling profile_init. However, before that, function time_init on IA64 platform could enable interrupt. See this call sequence: start_kernel ->time_init ->ia64_init_itm ->register_time_interpolator ->write_seqlock_irq. Signed-off-by: Zhang Yanmin Signed-off-by: Yao Jun Signed-off-by: Andrew Morton --- 25-akpm/kernel/timer.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff -puN kernel/timer.c~interrupt-is-enabled-before-it-should-be-when-kernel-is-booted kernel/timer.c --- 25/kernel/timer.c~interrupt-is-enabled-before-it-should-be-when-kernel-is-booted 2004-08-24 21:09:05.422748872 -0700 +++ 25-akpm/kernel/timer.c 2004-08-24 21:10:06.396479456 -0700 @@ -1450,15 +1450,16 @@ is_better_time_interpolator(struct time_ void register_time_interpolator(struct time_interpolator *ti) { + unsigned long flags; + ti->nsec_per_cyc = (NSEC_PER_SEC << ti->shift) / ti->frequency; spin_lock(&time_interpolator_lock); - write_seqlock_irq(&xtime_lock); - if (is_better_time_interpolator(ti)) - { + write_seqlock_irqsave(&xtime_lock, flags); + if (is_better_time_interpolator(ti)) { time_interpolator = ti; time_interpolator_reset(); } - write_sequnlock_irq(&xtime_lock); + write_sequnlock_irqrestore(&xtime_lock, flags); ti->next = time_interpolator_list; time_interpolator_list = ti; @@ -1469,6 +1470,7 @@ void unregister_time_interpolator(struct time_interpolator *ti) { struct time_interpolator *curr, **prev; + unsigned long flags; spin_lock(&time_interpolator_lock); prev = &time_interpolator_list; @@ -1480,7 +1482,7 @@ unregister_time_interpolator(struct time prev = &curr->next; } - write_seqlock_irq(&xtime_lock); + write_seqlock_irqsave(&xtime_lock, flags); if (ti == time_interpolator) { /* we lost the best time-interpolator: */ time_interpolator = NULL; @@ -1490,7 +1492,7 @@ unregister_time_interpolator(struct time time_interpolator = curr; time_interpolator_reset(); } - write_sequnlock_irq(&xtime_lock); + write_sequnlock_irqrestore(&xtime_lock, flags); spin_unlock(&time_interpolator_lock); } #endif /* CONFIG_TIME_INTERPOLATION */ _