To limit a CPU to a certain C-state, you can pass the
processor.max_cstate=X option in the
kernel line of
Here we limit the system to only C-State 1:
kernel /vmlinuz-2.6.18-371.1.2.el5 ... processor.max_cstate=1
On some systems, the kernel can override the BIOS setting, and the parameter
intel_idle.max_cstate=0 may be required to ensure sleep states are not entered:
kernel /vmlinuz-2.6.32-431.el6.x86_64 ... processor.max_cstate=1 intel_idle.max_cstate=0
You can confirm the maximum allowed CPU C-State with:
# cat /sys/module/intel_idle/parameters/max_cstate 0
In order to save energy when the CPU is idle, the CPU can be commanded to enter a low-power mode. Each CPU has several power modes and they are collectively called “C-states” or “C-modes.”.
The lower-power mode was first introduced with the 486DX4 processor. To the present, more power modes has been introduced and enhancements has been made to each mode for the CPU to consume less power in these low-power modes. The idea of these modes is to cut the clock signal and power from idle units inside the CPU. As many units you stop (by cutting the clock) as you reduce the voltage or even completely shut down to save energy. On the other hand, you have to take into account that more time is required for the CPU to “wake up” and be again 100% operational. These modes are known as C-states. They are usually starting in C0, which is the normal CPU operating mode, i.e., the CPU is 100% turned on. With increasing C number, the CPU sleep mode is deeper, i.e., more circuits and signals are turned off and more time the CPU will require to return to C0 mode, i.e., to wake-up. Each mode is also known by a name and several of them have sub-modes with different power saving – and thus wake-up time – levels.
|mode||Name||What id does||CPUs|
|C0||Operating State||CPU fully turned on, currently executing instructions.||All CPUs|
|C1||Operating State||CPU fully turned on, awaiting instructions||All CPUs|
|C1E||Halt||Stops CPU main internal clocks via software; bus interface unit and APIC are kept running at full speed||486DX4 and above|
|C1E||Enhanced Halt||Stops CPU main internal clocks via software and reduces CPU voltage; bus interface unit and APIC are kept running at full speed||All socket 775 CPUs|
|C1E||--||Stops all CPU internal clocks||Turion 64, 65-nm Athlon X2 and Phenom CPUs|
|C2||Stop Grant||Stops CPU main internal clocks via hardware; bus interface unit and APIC are kept running at full speed||486DX4 and above|
|C2||Stop Clock||Stops CPU internal and external clocks via hardware||Only 486DX4, Pentium, Pentium MMX, K5, K6, K6-2, K6-III|
|C2E||Extended Stop Grant||Stops CPU main internal clocks via hardware and reduces CPU voltage; bus interface unit and APIC are kept running at full speed||Core 2 Duo and above (Intel only)|
|C3||Sleep||Stops all CPU internal clocks||Pentium II, Athlon and above, but not on Core 2 Duo E4000 and E6000|
|C3||Deep Sleep||Stops all CPU internal and external clocks||Pentium II and above, but not on Core 2 Duo E4000 and E6000; Turion 64|
|C3||AltVID||Stops all CPU internal clocks and reduces CPU voltage||AMD Turion 64|
|C4||Deeper Sleep||Reduces CPU voltage||Pentium M and above, but not on Core 2 Duo E4000 and E6000 series; AMD Turion 64|
|C4E/C5||Enhanced Deeper Sleep||Reduces CPU voltage even more and turns off the memory cache||Core Solo, Core Duo and 45-nm mobile Core 2 Duo only|
|C6||Deep Power Down||Reduces the CPU internal voltage to any value, including 0 V||45-nm mobile Core 2 Duo only|
There are two CPU idle drivers:
intel_idle(the default one for nowadays) and
acpi_idle(the old school).
intel_idledriver C-state numbers are processor-specific (see my comment above), and the driver ignores BIOS C-states settings.
acpi_idledriver C-states are defined by ACPI standard and exported by BIOS, and the driver follows BIOS settings.
intel_idledriver and use
processor.max_cstate=1is a command to
acpi_idledriver, but I'm not sure about its very meaning. I've read that
processor.max_cstate=0are equal, and both disable C-states completely when using
idle=pollis usually added to kernel parameters when