diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-28 19:14:17 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-28 19:14:17 -0400 |
| commit | e4f2e5eaac8f5f903ca4a8cc944d26e68745d6bb (patch) | |
| tree | 1a8d89561fa5b231202d5287acc2683eccadee7f | |
| parent | 9a90e09854a3c7cc603ab8fc9163f77bb1f66cfa (diff) | |
| parent | 2671717265ae6e720a9ba5f13fbec3a718983b65 (diff) | |
Merge branch 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6
* 'idle-release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6:
intel_idle: native hardware cpuidle driver for latest Intel processors
ACPI: acpi_idle: touch TS_POLLING only in the non-MWAIT case
acpi_pad: uses MONITOR/MWAIT, so it doesn't need to clear TS_POLLING
sched: clarify commment for TS_POLLING
ACPI: allow a native cpuidle driver to displace ACPI
cpuidle: make cpuidle_curr_driver static
cpuidle: add cpuidle_unregister_driver() error check
cpuidle: fail to register if !CONFIG_CPU_IDLE
| -rw-r--r-- | MAINTAINERS | 7 | ||||
| -rw-r--r-- | arch/x86/include/asm/thread_info.h | 4 | ||||
| -rw-r--r-- | drivers/Makefile | 2 | ||||
| -rw-r--r-- | drivers/acpi/acpi_pad.c | 9 | ||||
| -rw-r--r-- | drivers/acpi/processor_driver.c | 15 | ||||
| -rw-r--r-- | drivers/acpi/processor_idle.c | 28 | ||||
| -rw-r--r-- | drivers/cpuidle/cpuidle.c | 12 | ||||
| -rw-r--r-- | drivers/cpuidle/cpuidle.h | 1 | ||||
| -rw-r--r-- | drivers/cpuidle/driver.c | 16 | ||||
| -rw-r--r-- | drivers/cpuidle/sysfs.c | 5 | ||||
| -rw-r--r-- | drivers/idle/Kconfig | 11 | ||||
| -rw-r--r-- | drivers/idle/Makefile | 1 | ||||
| -rwxr-xr-x | drivers/idle/intel_idle.c | 461 | ||||
| -rw-r--r-- | include/linux/cpuidle.h | 8 |
14 files changed, 538 insertions, 42 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 33047a605438..13608bd2e791 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2887,6 +2887,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git | |||
| 2887 | S: Maintained | 2887 | S: Maintained |
| 2888 | F: drivers/input/ | 2888 | F: drivers/input/ |
| 2889 | 2889 | ||
| 2890 | INTEL IDLE DRIVER | ||
| 2891 | M: Len Brown <lenb@kernel.org> | ||
| 2892 | L: linux-pm@lists.linux-foundation.org | ||
| 2893 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6.git | ||
| 2894 | S: Supported | ||
| 2895 | F: drivers/idle/intel_idle.c | ||
| 2896 | |||
| 2890 | INTEL FRAMEBUFFER DRIVER (excluding 810 and 815) | 2897 | INTEL FRAMEBUFFER DRIVER (excluding 810 and 815) |
| 2891 | M: Maik Broemme <mbroemme@plusserver.de> | 2898 | M: Maik Broemme <mbroemme@plusserver.de> |
| 2892 | L: linux-fbdev@vger.kernel.org | 2899 | L: linux-fbdev@vger.kernel.org |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index 62ba9400cc43..f0b6e5dbc5a0 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
| @@ -239,8 +239,8 @@ static inline struct thread_info *current_thread_info(void) | |||
| 239 | #define TS_USEDFPU 0x0001 /* FPU was used by this task | 239 | #define TS_USEDFPU 0x0001 /* FPU was used by this task |
| 240 | this quantum (SMP) */ | 240 | this quantum (SMP) */ |
| 241 | #define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/ | 241 | #define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/ |
| 242 | #define TS_POLLING 0x0004 /* true if in idle loop | 242 | #define TS_POLLING 0x0004 /* idle task polling need_resched, |
| 243 | and not sleeping */ | 243 | skip sending interrupt */ |
| 244 | #define TS_RESTORE_SIGMASK 0x0008 /* restore signal mask in do_signal() */ | 244 | #define TS_RESTORE_SIGMASK 0x0008 /* restore signal mask in do_signal() */ |
| 245 | 245 | ||
| 246 | #define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING) | 246 | #define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING) |
diff --git a/drivers/Makefile b/drivers/Makefile index f42a03029b7c..91874e048552 100644 --- a/drivers/Makefile +++ b/drivers/Makefile | |||
| @@ -10,6 +10,7 @@ obj-$(CONFIG_PCI) += pci/ | |||
| 10 | obj-$(CONFIG_PARISC) += parisc/ | 10 | obj-$(CONFIG_PARISC) += parisc/ |
| 11 | obj-$(CONFIG_RAPIDIO) += rapidio/ | 11 | obj-$(CONFIG_RAPIDIO) += rapidio/ |
| 12 | obj-y += video/ | 12 | obj-y += video/ |
| 13 | obj-y += idle/ | ||
| 13 | obj-$(CONFIG_ACPI) += acpi/ | 14 | obj-$(CONFIG_ACPI) += acpi/ |
| 14 | obj-$(CONFIG_SFI) += sfi/ | 15 | obj-$(CONFIG_SFI) += sfi/ |
| 15 | # PnP must come after ACPI since it will eventually need to check if acpi | 16 | # PnP must come after ACPI since it will eventually need to check if acpi |
| @@ -91,7 +92,6 @@ obj-$(CONFIG_EISA) += eisa/ | |||
| 91 | obj-y += lguest/ | 92 | obj-y += lguest/ |
| 92 | obj-$(CONFIG_CPU_FREQ) += cpufreq/ | 93 | obj-$(CONFIG_CPU_FREQ) += cpufreq/ |
| 93 | obj-$(CONFIG_CPU_IDLE) += cpuidle/ | 94 | obj-$(CONFIG_CPU_IDLE) += cpuidle/ |
| 94 | obj-y += idle/ | ||
| 95 | obj-$(CONFIG_MMC) += mmc/ | 95 | obj-$(CONFIG_MMC) += mmc/ |
| 96 | obj-$(CONFIG_MEMSTICK) += memstick/ | 96 | obj-$(CONFIG_MEMSTICK) += memstick/ |
| 97 | obj-$(CONFIG_NEW_LEDS) += leds/ | 97 | obj-$(CONFIG_NEW_LEDS) += leds/ |
diff --git a/drivers/acpi/acpi_pad.c b/drivers/acpi/acpi_pad.c index f169e516a1af..d269a8f3329c 100644 --- a/drivers/acpi/acpi_pad.c +++ b/drivers/acpi/acpi_pad.c | |||
| @@ -172,13 +172,6 @@ static int power_saving_thread(void *data) | |||
| 172 | 172 | ||
| 173 | do_sleep = 0; | 173 | do_sleep = 0; |
| 174 | 174 | ||
| 175 | current_thread_info()->status &= ~TS_POLLING; | ||
| 176 | /* | ||
| 177 | * TS_POLLING-cleared state must be visible before we test | ||
| 178 | * NEED_RESCHED: | ||
| 179 | */ | ||
| 180 | smp_mb(); | ||
| 181 | |||
| 182 | expire_time = jiffies + HZ * (100 - idle_pct) / 100; | 175 | expire_time = jiffies + HZ * (100 - idle_pct) / 100; |
| 183 | 176 | ||
| 184 | while (!need_resched()) { | 177 | while (!need_resched()) { |
| @@ -209,8 +202,6 @@ static int power_saving_thread(void *data) | |||
| 209 | } | 202 | } |
| 210 | } | 203 | } |
| 211 | 204 | ||
| 212 | current_thread_info()->status |= TS_POLLING; | ||
| 213 | |||
| 214 | /* | 205 | /* |
| 215 | * current sched_rt has threshold for rt task running time. | 206 | * current sched_rt has threshold for rt task running time. |
| 216 | * When a rt task uses 95% CPU time, the rt thread will be | 207 | * When a rt task uses 95% CPU time, the rt thread will be |
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 5675d9747e87..b1034a9ada4e 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c | |||
| @@ -616,7 +616,8 @@ static int __cpuinit acpi_processor_add(struct acpi_device *device) | |||
| 616 | acpi_processor_get_limit_info(pr); | 616 | acpi_processor_get_limit_info(pr); |
| 617 | 617 | ||
| 618 | 618 | ||
| 619 | acpi_processor_power_init(pr, device); | 619 | if (cpuidle_get_driver() == &acpi_idle_driver) |
| 620 | acpi_processor_power_init(pr, device); | ||
| 620 | 621 | ||
| 621 | pr->cdev = thermal_cooling_device_register("Processor", device, | 622 | pr->cdev = thermal_cooling_device_register("Processor", device, |
| 622 | &processor_cooling_ops); | 623 | &processor_cooling_ops); |
| @@ -920,9 +921,14 @@ static int __init acpi_processor_init(void) | |||
| 920 | if (!acpi_processor_dir) | 921 | if (!acpi_processor_dir) |
| 921 | return -ENOMEM; | 922 | return -ENOMEM; |
| 922 | #endif | 923 | #endif |
| 923 | result = cpuidle_register_driver(&acpi_idle_driver); | 924 | |
| 924 | if (result < 0) | 925 | if (!cpuidle_register_driver(&acpi_idle_driver)) { |
| 925 | goto out_proc; | 926 | printk(KERN_DEBUG "ACPI: %s registered with cpuidle\n", |
| 927 | acpi_idle_driver.name); | ||
| 928 | } else { | ||
| 929 | printk(KERN_DEBUG "ACPI: acpi_idle yielding to %s", | ||
| 930 | cpuidle_get_driver()->name); | ||
| 931 | } | ||
| 926 | 932 | ||
| 927 | result = acpi_bus_register_driver(&acpi_processor_driver); | 933 | result = acpi_bus_register_driver(&acpi_processor_driver); |
| 928 | if (result < 0) | 934 | if (result < 0) |
| @@ -941,7 +947,6 @@ static int __init acpi_processor_init(void) | |||
| 941 | out_cpuidle: | 947 | out_cpuidle: |
| 942 | cpuidle_unregister_driver(&acpi_idle_driver); | 948 | cpuidle_unregister_driver(&acpi_idle_driver); |
| 943 | 949 | ||
| 944 | out_proc: | ||
| 945 | #ifdef CONFIG_ACPI_PROCFS | 950 | #ifdef CONFIG_ACPI_PROCFS |
| 946 | remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); | 951 | remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); |
| 947 | #endif | 952 | #endif |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 13c6cb703f1d..2e8c27d48f2b 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -872,6 +872,7 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
| 872 | return(acpi_idle_enter_c1(dev, state)); | 872 | return(acpi_idle_enter_c1(dev, state)); |
| 873 | 873 | ||
| 874 | local_irq_disable(); | 874 | local_irq_disable(); |
| 875 | |||
| 875 | if (cx->entry_method != ACPI_CSTATE_FFH) { | 876 | if (cx->entry_method != ACPI_CSTATE_FFH) { |
| 876 | current_thread_info()->status &= ~TS_POLLING; | 877 | current_thread_info()->status &= ~TS_POLLING; |
| 877 | /* | 878 | /* |
| @@ -879,12 +880,12 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
| 879 | * NEED_RESCHED: | 880 | * NEED_RESCHED: |
| 880 | */ | 881 | */ |
| 881 | smp_mb(); | 882 | smp_mb(); |
| 882 | } | ||
| 883 | 883 | ||
| 884 | if (unlikely(need_resched())) { | 884 | if (unlikely(need_resched())) { |
| 885 | current_thread_info()->status |= TS_POLLING; | 885 | current_thread_info()->status |= TS_POLLING; |
| 886 | local_irq_enable(); | 886 | local_irq_enable(); |
| 887 | return 0; | 887 | return 0; |
| 888 | } | ||
| 888 | } | 889 | } |
| 889 | 890 | ||
| 890 | /* | 891 | /* |
| @@ -911,7 +912,8 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
| 911 | sched_clock_idle_wakeup_event(idle_time_ns); | 912 | sched_clock_idle_wakeup_event(idle_time_ns); |
| 912 | 913< | ||
