
From: "Zhang, Yanmin" <yanmin.zhang@intel.com>

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 <yanmin.zhang@intel.com>
Signed-off-by:	Yao Jun	<junx.yao@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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 */
_
