Messages in this thread Patch in this message | | | Subject | interrupt is enabled before it should be when kernel is booted | Date | Tue, 24 Aug 2004 14:36:19 +0800 | 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->writ e_seqlock_irq. The attachment is a patch to fix it in generic source codes against 2.6.8.
Signed-off-by: Zhang Yanmin <yanmin.zhang@intel.com> Signed-off-by: Yao Jun <junx.yao@intel.com>
diff -Nraup linux-2.6.8/kernel/timer.c linux-2.6.8_fix/kernel/timer.c --- linux-2.6.8/kernel/timer.c 2004-08-16 07:58:21.000000000 +0800 +++ linux-2.6.8_fix/kernel/timer.c 2004-08-17 17:03:38.364035163 +0800 @@ -1447,11 +1447,13 @@ is_better_time_interpolator(struct time_ void register_time_interpolator(struct time_interpolator *ti) { + unsigned long flags; + spin_lock(&time_interpolator_lock); - write_seqlock_irq(&xtime_lock); + write_seqlock_irqsave(&xtime_lock, flags); if (is_better_time_interpolator(ti)) time_interpolator = ti; - write_sequnlock_irq(&xtime_lock); + write_sequnlock_irqrestore(&xtime_lock, flags); ti->next = time_interpolator_list; time_interpolator_list = ti; @@ -1462,6 +1464,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; @@ -1473,7 +1476,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; @@ -1482,7 +1485,7 @@ unregister_time_interpolator(struct time if (is_better_time_interpolator(curr)) time_interpolator = curr; } - write_sequnlock_irq(&xtime_lock); + write_sequnlock_irqrestore(&xtime_lock, flags); spin_unlock(&time_interpolator_lock); } #endif /* CONFIG_TIME_INTERPOLATION */
<<time_init_enable_interrupt.patch.diff>> [unhandled content-type:application/octet-stream] | |