interrupt is enabled before it should be when kernel is booted

From: Zhang, Yanmin
Date: Tue Aug 24 2004 - 01:37:38 EST


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@xxxxxxxxx>
Signed-off-by: Yao Jun <junx.yao@xxxxxxxxx>


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>>

Attachment: time_init_enable_interrupt.patch.diff
Description: time_init_enable_interrupt.patch.diff