ia64/xen-unstable

view patches/linux-2.6.16.13/fix-hz-suspend.patch @ 11472:3e31c5e160cf

[HVM] Fix an error when read from APIC registers like IRR, ISR and TMR.
From SDM3 spec, for APIC registers, all 32-bit registers should
be accessed using 128-bit aligned 32bit loads or stores.
And wider registers (64-bit or 256-bit) must be accessed using
multiple 32-bit loads or stores.

In old APIC virtualization code, we use IRR, ISR and TMR which are
256-bit registers as contiguous bit maps other than multiple 32-bit.

So guest always fetch error values.

Original patch was:
* Signed-off-by: Xiaohui Xin <xiaohui.xin@intel.com>
* Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com>
* Signed-off-by: Eddie Dong <eddie.dong@intel.com>

Signed-off-by: Keir Fraser <keir@xensource.com>
author kaf24@firebug.cl.cam.ac.uk
date Wed Sep 13 15:59:14 2006 +0100 (2006-09-13)
parents 18f8dde91fbd
children
line source
1 diff -pruN ../pristine-linux-2.6.16.13/kernel/timer.c ./kernel/timer.c
2 --- ../pristine-linux-2.6.16.13/kernel/timer.c 2006-05-02 22:38:44.000000000 +0100
3 +++ ./kernel/timer.c 2006-06-29 14:34:12.788957720 +0100
4 @@ -555,6 +555,22 @@ found:
5 }
6 spin_unlock(&base->t_base.lock);
8 + /*
9 + * It can happen that other CPUs service timer IRQs and increment
10 + * jiffies, but we have not yet got a local timer tick to process
11 + * the timer wheels. In that case, the expiry time can be before
12 + * jiffies, but since the high-resolution timer here is relative to
13 + * jiffies, the default expression when high-resolution timers are
14 + * not active,
15 + *
16 + * time_before(MAX_JIFFY_OFFSET + jiffies, expires)
17 + *
18 + * would falsely evaluate to true. If that is the case, just
19 + * return jiffies so that we can immediately fire the local timer
20 + */
21 + if (time_before(expires, jiffies))
22 + return jiffies;
23 +
24 if (time_before(hr_expires, expires))
25 return hr_expires;