# HG changeset patch # User cl349@firebug.cl.cam.ac.uk # Date 1116679210 0 # Node ID 543ffea3fc12a8e7dce6e7e4ece21eee8e7ac4c6 # Parent c4353a81ae5b5cb61b9dd6c056611a737874ecb6 bitkeeper revision 1.1159.258.151 (428f2c2a_3sOeZVGhQutbJc15aCU9g) Fix e1000 hang during reboot bug. Kudos to Steven Hand for analyzing. time.c: Fix bug in code which sets our one-shot timer when we decide to block during the idle loop. Signed-off-by: Christian Limpach diff -r c4353a81ae5b -r 543ffea3fc12 linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c --- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c Fri May 20 23:16:46 2005 +0000 +++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/time.c Sat May 21 12:40:10 2005 +0000 @@ -656,7 +656,12 @@ void __init time_init(void) /* Convert jiffies to system time. Call with xtime_lock held for reading. */ static inline u64 __jiffies_to_st(unsigned long j) { - return processed_system_time + ((j - jiffies) * NS_PER_TICK); + long delta = j - jiffies; + /* NB. The next check can trigger in some wrap-around cases, but + * that's ok -- we'll just end up with a shorter timeout. */ + if (delta < 1) + delta = 1; + return processed_system_time + (delta * NS_PER_TICK); } /* @@ -683,8 +688,6 @@ int set_timeout_timer(void) * updates of jiffies since interrupts are off. */ j = next_timer_interrupt(); - if (j < (jiffies + 1)) - j = jiffies + 1; alarm = __jiffies_to_st(j); /* Failure is pretty bad, but we'd best soldier on. */