svn commit: r283109 - head/sys/x86/x86

Andriy Gapon avg at FreeBSD.org
Fri May 22 10:44:32 UTC 2015


On 19/05/2015 17:21, Konstantin Belousov wrote:
> Author: kib
> Date: Tue May 19 14:21:00 2015
> New Revision: 283109
> URL: https://svnweb.freebsd.org/changeset/base/283109
> 
> Log:
>   When sleeping in Sx state using MWAIT instruction, accept fast wakeup
>   requests from writes to the monitored line.
>   
>   Submitted by:	avg

Thanks!

> Modified:
>   head/sys/x86/x86/cpu_machdep.c
> 
> Modified: head/sys/x86/x86/cpu_machdep.c
> ==============================================================================
> --- head/sys/x86/x86/cpu_machdep.c	Tue May 19 14:05:15 2015	(r283108)
> +++ head/sys/x86/x86/cpu_machdep.c	Tue May 19 14:21:00 2015	(r283109)
> @@ -101,6 +101,10 @@ __FBSDID("$FreeBSD$");
>  #include <vm/vm_pager.h>
>  #include <vm/vm_param.h>
>  
> +#define	STATE_RUNNING	0x0
> +#define	STATE_MWAIT	0x1
> +#define	STATE_SLEEPING	0x2
> +
>  /*
>   * Machine dependent boot() routine
>   *
> @@ -134,13 +138,24 @@ acpi_cpu_idle_mwait(uint32_t mwait_hint)
>  {
>  	int *state;
>  
> -	state = (int *)PCPU_PTR(monitorbuf);
>  	/*
>  	 * XXXKIB.  Software coordination mode should be supported,
>  	 * but all Intel CPUs provide hardware coordination.
>  	 */
> +
> +	state = (int *)PCPU_PTR(monitorbuf);
> +	KASSERT(*state == STATE_SLEEPING,
> +		("cpu_mwait_cx: wrong monitorbuf state"));
> +	*state = STATE_MWAIT;
>  	cpu_monitor(state, 0, 0);
> -	cpu_mwait(MWAIT_INTRBREAK, mwait_hint);
> +	if (*state == STATE_MWAIT)
> +		cpu_mwait(MWAIT_INTRBREAK, mwait_hint);
> +
> +	/*
> +	 * We should exit on any event that interrupts mwait, because
> +	 * that event might be a wanted interrupt.
> +	 */
> +	*state = STATE_RUNNING;
>  }
>  
>  /* Get current clock frequency for the given cpu id. */
> @@ -231,10 +246,6 @@ static int	idle_mwait = 1;		/* Use MONIT
>  SYSCTL_INT(_machdep, OID_AUTO, idle_mwait, CTLFLAG_RWTUN, &idle_mwait,
>      0, "Use MONITOR/MWAIT for short idle");
>  
> -#define	STATE_RUNNING	0x0
> -#define	STATE_MWAIT	0x1
> -#define	STATE_SLEEPING	0x2
> -
>  #ifndef PC98
>  static void
>  cpu_idle_acpi(sbintime_t sbt)
> 


-- 
Andriy Gapon


More information about the svn-src-head mailing list