svn commit: r332830 - in stable/11/sys: dev/acpica x86/x86

Jonathan T. Looney jtl at FreeBSD.org
Fri Apr 20 15:48:51 UTC 2018


Author: jtl
Date: Fri Apr 20 15:48:50 2018
New Revision: 332830
URL: https://svnweb.freebsd.org/changeset/base/332830

Log:
  MFC r313447:
    Ensure the idle thread's loop services interrupts in a timely way when
    using the ACPI C1/mwait sleep method.
  
    Previously, the mwait instruction would return when an interrupt was
    pending; however, the idle loop did not actually enable interrupts when
    this occurred. This led to a situation where the idle loop could quickly
    spin through the C1/mwait sleep method a number of times when an interrupt
    was pending. (Eventually, the situation corrected itself when something
    other than an interrupt triggered the idle loop to either enable
    interrupts or schedule another thread.)
  
  Sponsored by:	Netflix, Inc.

Modified:
  stable/11/sys/dev/acpica/acpi_cpu.c
  stable/11/sys/x86/x86/cpu_machdep.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/acpica/acpi_cpu.c
==============================================================================
--- stable/11/sys/dev/acpica/acpi_cpu.c	Fri Apr 20 15:44:29 2018	(r332829)
+++ stable/11/sys/dev/acpica/acpi_cpu.c	Fri Apr 20 15:48:50 2018	(r332830)
@@ -1151,6 +1151,9 @@ acpi_cpu_idle(sbintime_t sbt)
 	end_time = ((cpu_ticks() - cputicks) << 20) / cpu_tickrate();
 	if (curthread->td_critnest == 0)
 		end_time = min(end_time, 500000 / hz);
+	/* acpi_cpu_c1() returns with interrupts enabled. */
+	if (cx_next->do_mwait)
+	    ACPI_ENABLE_IRQS();
 	sc->cpu_prev_sleep = (sc->cpu_prev_sleep * 3 + end_time) / 4;
 	return;
     }

Modified: stable/11/sys/x86/x86/cpu_machdep.c
==============================================================================
--- stable/11/sys/x86/x86/cpu_machdep.c	Fri Apr 20 15:44:29 2018	(r332829)
+++ stable/11/sys/x86/x86/cpu_machdep.c	Fri Apr 20 15:48:50 2018	(r332830)
@@ -146,6 +146,14 @@ acpi_cpu_c1(void)
 	__asm __volatile("sti; hlt");
 }
 
+/*
+ * Use mwait to pause execution while waiting for an interrupt or
+ * another thread to signal that there is more work.
+ *
+ * NOTE: Interrupts will cause a wakeup; however, this function does
+ * not enable interrupt handling. The caller is responsible to enable
+ * interrupts.
+ */
 void
 acpi_cpu_idle_mwait(uint32_t mwait_hint)
 {


More information about the svn-src-all mailing list