Skip to content

Commit 42efa5e

Browse files
committed
Merge tag 'x86_cpu_for_v6.0_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 cpu updates from Borislav Petkov: - Remove the vendor check when selecting MWAIT as the default idle state - Respect idle=nomwait when supplied on the kernel cmdline - Two small cleanups * tag 'x86_cpu_for_v6.0_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/cpu: Use MSR_IA32_MISC_ENABLE constants x86: Fix comment for X86_FEATURE_ZEN x86: Remove vendor checks from prefer_mwait_c1_over_halt x86: Handle idle=nomwait cmdline properly for x86_idle
2 parents 650ea1f + 3f2adf0 commit 42efa5e

5 files changed

Lines changed: 44 additions & 22 deletions

File tree

Documentation/admin-guide/pm/cpuidle.rst

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,8 @@ the ``menu`` governor to be used on the systems that use the ``ladder`` governor
612612
by default this way, for example.
613613

614614
The other kernel command line parameters controlling CPU idle time management
615-
described below are only relevant for the *x86* architecture and some of
616-
them affect Intel processors only.
615+
described below are only relevant for the *x86* architecture and references
616+
to ``intel_idle`` affect Intel processors only.
617617

618618
The *x86* architecture support code recognizes three kernel command line
619619
options related to CPU idle time management: ``idle=poll``, ``idle=halt``,
@@ -635,10 +635,13 @@ idle, so it very well may hurt single-thread computations performance as well as
635635
energy-efficiency. Thus using it for performance reasons may not be a good idea
636636
at all.]
637637

638-
The ``idle=nomwait`` option disables the ``intel_idle`` driver and causes
639-
``acpi_idle`` to be used (as long as all of the information needed by it is
640-
there in the system's ACPI tables), but it is not allowed to use the
641-
``MWAIT`` instruction of the CPUs to ask the hardware to enter idle states.
638+
The ``idle=nomwait`` option prevents the use of ``MWAIT`` instruction of
639+
the CPU to enter idle states. When this option is used, the ``acpi_idle``
640+
driver will use the ``HLT`` instruction instead of ``MWAIT``. On systems
641+
running Intel processors, this option disables the ``intel_idle`` driver
642+
and forces the use of the ``acpi_idle`` driver instead. Note that in either
643+
case, ``acpi_idle`` driver will function only if all the information needed
644+
by it is in the system's ACPI tables.
642645

643646
In addition to the architecture-level kernel command line options affecting CPU
644647
idle time management, there are parameters affecting individual ``CPUIdle``

arch/x86/include/asm/cpufeatures.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@
219219
#define X86_FEATURE_IBRS ( 7*32+25) /* Indirect Branch Restricted Speculation */
220220
#define X86_FEATURE_IBPB ( 7*32+26) /* Indirect Branch Prediction Barrier */
221221
#define X86_FEATURE_STIBP ( 7*32+27) /* Single Thread Indirect Branch Predictors */
222-
#define X86_FEATURE_ZEN ( 7*32+28) /* "" CPU is AMD family 0x17 or above (Zen) */
222+
#define X86_FEATURE_ZEN (7*32+28) /* "" CPU based on Zen microarchitecture */
223223
#define X86_FEATURE_L1TF_PTEINV ( 7*32+29) /* "" L1TF workaround PTE inversion */
224224
#define X86_FEATURE_IBRS_ENHANCED ( 7*32+30) /* Enhanced IBRS */
225225
#define X86_FEATURE_MSR_IA32_FEAT_CTL ( 7*32+31) /* "" MSR IA32_FEAT_CTL configured */

arch/x86/include/asm/mwait.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#define MWAIT_SUBSTATE_SIZE 4
1414
#define MWAIT_HINT2CSTATE(hint) (((hint) >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK)
1515
#define MWAIT_HINT2SUBSTATE(hint) ((hint) & MWAIT_CSTATE_MASK)
16+
#define MWAIT_C1_SUBSTATE_MASK 0xf0
1617

1718
#define CPUID_MWAIT_LEAF 5
1819
#define CPUID5_ECX_EXTENSIONS_SUPPORTED 0x1

arch/x86/kernel/cpu/intel.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -682,9 +682,9 @@ static void init_intel(struct cpuinfo_x86 *c)
682682
unsigned int l1, l2;
683683

684684
rdmsr(MSR_IA32_MISC_ENABLE, l1, l2);
685-
if (!(l1 & (1<<11)))
685+
if (!(l1 & MSR_IA32_MISC_ENABLE_BTS_UNAVAIL))
686686
set_cpu_cap(c, X86_FEATURE_BTS);
687-
if (!(l1 & (1<<12)))
687+
if (!(l1 & MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL))
688688
set_cpu_cap(c, X86_FEATURE_PEBS);
689689
}
690690

arch/x86/kernel/process.c

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -810,24 +810,43 @@ static void amd_e400_idle(void)
810810
}
811811

812812
/*
813-
* Intel Core2 and older machines prefer MWAIT over HALT for C1.
814-
* We can't rely on cpuidle installing MWAIT, because it will not load
815-
* on systems that support only C1 -- so the boot default must be MWAIT.
813+
* Prefer MWAIT over HALT if MWAIT is supported, MWAIT_CPUID leaf
814+
* exists and whenever MONITOR/MWAIT extensions are present there is at
815+
* least one C1 substate.
816816
*
817-
* Some AMD machines are the opposite, they depend on using HALT.
818-
*
819-
* So for default C1, which is used during boot until cpuidle loads,
820-
* use MWAIT-C1 on Intel HW that has it, else use HALT.
817+
* Do not prefer MWAIT if MONITOR instruction has a bug or idle=nomwait
818+
* is passed to kernel commandline parameter.
821819
*/
822820
static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c)
823821
{
824-
if (c->x86_vendor != X86_VENDOR_INTEL)
822+
u32 eax, ebx, ecx, edx;
823+
824+
/* User has disallowed the use of MWAIT. Fallback to HALT */
825+
if (boot_option_idle_override == IDLE_NOMWAIT)
825826
return 0;
826827

827-
if (!cpu_has(c, X86_FEATURE_MWAIT) || boot_cpu_has_bug(X86_BUG_MONITOR))
828+
/* MWAIT is not supported on this platform. Fallback to HALT */
829+
if (!cpu_has(c, X86_FEATURE_MWAIT))
828830
return 0;
829831

830-
return 1;
832+
/* Monitor has a bug. Fallback to HALT */
833+
if (boot_cpu_has_bug(X86_BUG_MONITOR))
834+
return 0;
835+
836+
cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx);
837+
838+
/*
839+
* If MWAIT extensions are not available, it is safe to use MWAIT
840+
* with EAX=0, ECX=0.
841+
*/
842+
if (!(ecx & CPUID5_ECX_EXTENSIONS_SUPPORTED))
843+
return 1;
844+
845+
/*
846+
* If MWAIT extensions are available, there should be at least one
847+
* MWAIT C1 substate present.
848+
*/
849+
return (edx & MWAIT_C1_SUBSTATE_MASK);
831850
}
832851

833852
/*
@@ -932,9 +951,8 @@ static int __init idle_setup(char *str)
932951
} else if (!strcmp(str, "nomwait")) {
933952
/*
934953
* If the boot option of "idle=nomwait" is added,
935-
* it means that mwait will be disabled for CPU C2/C3
936-
* states. In such case it won't touch the variable
937-
* of boot_option_idle_override.
954+
* it means that mwait will be disabled for CPU C1/C2/C3
955+
* states.
938956
*/
939957
boot_option_idle_override = IDLE_NOMWAIT;
940958
} else

0 commit comments

Comments
 (0)