|
@@ -149,6 +149,29 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe);
|
|
|
|
|
|
+/*
|
|
|
+ * This uses new MONITOR/MWAIT instructions on P4 processors with PNI,
|
|
|
+ * which can obviate IPI to trigger checking of need_resched.
|
|
|
+ * We execute MONITOR against need_resched and enter optimized wait state
|
|
|
+ * through MWAIT. Whenever someone changes need_resched, we would be woken
|
|
|
+ * up from MWAIT (without an IPI).
|
|
|
+ *
|
|
|
+ * New with Core Duo processors, MWAIT can take some hints based on CPU
|
|
|
+ * capability.
|
|
|
+ */
|
|
|
+void mwait_idle_with_hints(unsigned long ax, unsigned long cx)
|
|
|
+{
|
|
|
+ if (!need_resched()) {
|
|
|
+ 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(ax, cx);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cx)
|
|
|
{
|
|
|
unsigned int cpu = smp_processor_id();
|