On Wed, 2013-12-11 at 12:52 +0100, Peter Zijlstra wrote: > On Wed, Dec 11, 2013 at 12:38:39PM +0100, Borislav Petkov wrote: > > Right, if it turns out that this is really the case and that this > > erratum hasn't been fixed for models later than 29 - we'd need the > > additional model numbers to set X86_FEATURE_CLFLUSH_MONITOR correctly. > > You also need: https://lkml.org/lkml/2013/11/19/143 > > Because obviously not all mwait idle loops check that cpu bit.
I had tried that patch, to see if it would magically make the thing start working, nope. I had also tried... --- drivers/idle/intel_idle.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) Index: linux-2.6/drivers/idle/intel_idle.c =================================================================== --- linux-2.6.orig/drivers/idle/intel_idle.c +++ linux-2.6/drivers/idle/intel_idle.c @@ -376,11 +376,14 @@ static int intel_idle(struct cpuidle_dev clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); if (!current_set_polling_and_test()) { - + if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) + clflush((void *)¤t_thread_info()->flags); __monitor((void *)¤t_thread_info()->flags, 0, 0); smp_mb(); if (!need_resched()) __mwait(eax, ecx); + if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) + clflush((void *)¤t_thread_info()->flags); } if (!(lapic_timer_reliable_states & (1 << (cstate)))) ..a cflush before _and_ after, among other (shazam!.. darn) guesses, but nogo. Turning that into the tglx one liner indeed did fix the thing, as did adding this to your patch. --- arch/x86/include/asm/mwait.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: linux-2.6/arch/x86/include/asm/mwait.h =================================================================== --- linux-2.6.orig/arch/x86/include/asm/mwait.h +++ linux-2.6/arch/x86/include/asm/mwait.h @@ -43,7 +43,7 @@ static inline void __mwait(unsigned long static inline void mwait_idle_with_hints(unsigned long eax, unsigned long ecx) { if (!current_set_polling_and_test()) { - if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) +// if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) clflush((void *)¤t_thread_info()->flags); __monitor((void *)¤t_thread_info()->flags, 0, 0); Grrr. flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 x2apic popcnt lahf_lm dtherm tpr_shadow vnmi flexpriority ept vpid -Mike -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/