linux/drivers/acpi
alex.shi ff69f2bba6 acpi: fix of pmtimer overflow that make Cx states time incorrect
We found Cx states time abnormal in our some of machines which have 16
LCPUs, the C0 take too many time while system is really idle when kernel
enabled tickless and highres.  powertop output is below:

     PowerTOP version 1.9       (C) 2007 Intel Corporation

Cn                Avg residency       P-states (frequencies)
C0 (cpu running)        (40.5%)         2.53 Ghz     0.0%
C1                0.0ms ( 0.0%)         2.53 Ghz     0.0%
C2              128.8ms (59.5%)         2.40 Ghz     0.0%
                                        1.60 Ghz   100.0%

Wakeups-from-idle per second :  4.7     interval: 20.0s
no ACPI power usage estimate available

Top causes for wakeups:
  41.4% ( 24.9)       <interrupt> : extra timer interrupt
  20.2% ( 12.2)     <kernel core> : usb_hcd_poll_rh_status
(rh_timer_func)

After tacking detailed for this issue, Yakui and I find it is due to 24
bit PM timer overflows when some of cpu sleep more than 4 seconds.  With
tickless kernel, the CPU want to sleep as much as possible when system
idle.  But the Cx sleep time are recorded by pmtimer which length is
determined by BIOS.  The current Cx time was gotten in the following
function from driver/acpi/processor_idle.c:

static inline u32 ticks_elapsed(u32 t1, u32 t2)
{
       if (t2 >= t1)
               return (t2 - t1);
       else if (!(acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER))
               return (((0x00FFFFFF - t1) + t2) & 0x00FFFFFF);
       else
               return ((0xFFFFFFFF - t1) + t2);
}

If pmtimer is 24 bits and it take 5 seconds from t1 to t2, in above
function, just about 1 seconds ticks was recorded.  So the Cx time will be
reduced about 4 seconds.  and this is why we see above powertop output.

To resolve this problem, Yakui and I use ktime_get() to record the Cx
states time instead of PM timer as the following patch.  the patch was
tested with i386/x86_64 modes on several platforms.

Acked-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Tested-by: Alex Shi <alex.shi@intel.com>
Signed-off-by: Alex Shi <alex.shi@intel.com>
Signed-off-by: Yakui.zhao <yakui.zhao@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Len Brown <len.brown@intel.com>
2009-03-17 01:13:46 -04:00
..
acpica Merge branches 'release', 'asus', 'bugzilla-12450', 'cpuidle', 'debug', 'ec', 'misc', 'printk' and 'processor' into release 2009-02-07 01:34:56 -05:00
ac.c Merge branch 'sysfs' into release 2008-11-11 21:14:49 -05:00
acpi_memhotplug.c trivial: Fix misspelling of "firmware" in acpi_memhotplug.c 2009-01-06 11:28:08 +01:00
battery.c battery: don't assume we are fully charged when not charging or discharging 2009-02-21 12:36:19 -05:00
blacklist.c ACPI: delete OSI(Linux) DMI dmesg spam 2008-11-27 01:55:21 -05:00
bus.c ACPI: fix 2.6.28 acpi.debug_level regression 2008-12-19 04:38:32 -05:00
button.c Merge branch 'ec' into release 2008-11-11 21:17:26 -05:00
cm_sbs.c ACPI: remove private acpica headers from driver files 2008-12-31 01:15:22 -05:00
container.c ACPI: add missing KERN_* constants to printks 2009-02-07 00:29:32 -05:00
debug.c ACPI: remove private acpica headers from driver files 2008-12-31 01:15:22 -05:00
dock.c Merge branches 'release', 'asus', 'bugzilla-12450', 'cpuidle', 'debug', 'ec', 'misc', 'printk' and 'processor' into release 2009-02-07 01:34:56 -05:00
ec.c ACPI: EC: Add delay for slow MSI controller 2009-02-21 12:18:13 -05:00
event.c acpi: use non-racy method for proc entries creation 2008-04-29 08:06:22 -07:00
fan.c ACPI: consolidate ACPI_*_COMPONENT definitions in acpi_drivers.h 2008-11-07 21:44:37 -05:00
glue.c ACPI: struct device - replace bus_id with dev_name(), dev_set_name() 2009-02-07 00:41:13 -05:00
Kconfig ACPI: remove CONFIG_ACPI_SYSTEM 2009-02-21 21:59:56 -05:00
Makefile ACPI: remove CONFIG_ACPI_SYSTEM 2009-02-21 21:59:56 -05:00
numa.c ACPI: remove private acpica headers from driver files 2008-12-31 01:15:22 -05:00
osl.c Merge branches 'release', 'asus', 'bugzilla-12450', 'cpuidle', 'debug', 'ec', 'misc', 'printk' and 'processor' into release 2009-02-07 01:34:56 -05:00
pci_bind.c ACPI: simplify buffer management for acpi_pci_bind() etc. 2008-12-30 22:52:26 -05:00
pci_irq.c ACPI: PCI: add HP copyright 2008-12-30 21:50:01 -05:00
pci_link.c ACPI: add missing KERN_* constants to printks 2009-02-07 00:29:32 -05:00
pci_root.c ACPI/PCI: PCI MSI _OSC support capabilities called when root bridge added 2009-01-07 11:12:31 -08:00
pci_slot.c Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6 2008-10-23 10:20:36 -07:00
power.c ACPI: power.c: call acpi_get_name to get node name 2008-12-31 01:11:51 -05:00
proc.c Merge branch 'alarm' into release 2009-01-09 03:36:32 -05:00
processor_core.c cpumask: convert shared_cpu_map in acpi_processor* structs to cpumask_var_t 2009-01-03 19:15:40 +01:00
processor_idle.c acpi: fix of pmtimer overflow that make Cx states time incorrect 2009-03-17 01:13:46 -04:00
processor_perflib.c ACPI: cpufreq: Remove deprecated /proc/acpi/processor/../performance proc entries 2009-02-04 00:12:24 -05:00
processor_thermal.c ACPI: consolidate ACPI_*_COMPONENT definitions in acpi_drivers.h 2008-11-07 21:44:37 -05:00
processor_throttling.c cpumask: convert shared_cpu_map in acpi_processor* structs to cpumask_var_t 2009-01-03 19:15:40 +01:00
reboot.c ACPI: reboot.c: use new acpi_reset interface 2008-12-31 01:15:00 -05:00
sbs.c Merge branch 'linus' into test 2008-10-23 00:11:07 -04:00
sbshc.c ACPI: remove private acpica headers from driver files 2008-12-31 01:15:22 -05:00
sbshc.h ACPI: SBS: Ignore alarms coming from unknown devices 2007-12-14 15:14:06 -05:00
scan.c ACPI: remove private acpica headers from driver files 2008-12-31 01:15:22 -05:00
sleep.c Merge branches 'release', 'asus', 'bugzilla-12450', 'cpuidle', 'debug', 'ec', 'misc', 'printk' and 'processor' into release 2009-02-07 01:34:56 -05:00
sleep.h ACPICA: create acpica/ directory 2009-01-09 03:30:47 -05:00
system.c ACPICA: New: acpi_get_gpe_device interface 2008-12-31 01:10:24 -05:00
tables.c ACPI: disable ACPI cleanly when bad RSDP found 2009-02-06 14:00:56 -05:00
thermal.c thermal fixup for broken BIOS which has invalid trip points. 2009-01-16 14:13:12 -05:00
utils.c ACPI: scheduling in atomic via acpi_evaluate_integer () 2008-11-26 17:39:06 -05:00
video.c Merge branches 'release', 'asus', 'bugzilla-12450', 'cpuidle', 'debug', 'ec', 'misc', 'printk' and 'processor' into release 2009-02-07 01:34:56 -05:00
video_detect.c ACPI: ec.c, pci_link.c, video_detec.c: static 2008-12-30 23:27:04 -05:00
wakeup.c ACPICA: create acpica/ directory 2009-01-09 03:30:47 -05:00