svn commit: r327056 - in head/sys: kern sys x86/acpica x86/x86

Andriy Gapon avg at FreeBSD.org
Mon Apr 2 13:27:18 UTC 2018


On 21/12/2017 11:17, Bruce Evans wrote:
> Author: bde
> Date: Thu Dec 21 09:17:48 2017
> New Revision: 327056
> URL: https://svnweb.freebsd.org/changeset/base/327056
> 
> Log:
>   Use resume_cpus() instead of restart_cpus() to resume from ACPI suspension.

Bruce,

do you plan to merge this to stable/11 and maybe stable/10?
If you'd like, I can do it.  Unless you see any reason not to.

>   restart_cpus() worked well enough by accident.  Before this set of fixes,
>   resume_cpus() used the same cpuset (started_cpus, meaning CPUs directed to
>   restart) as restart_cpus().  resume_cpus() waited for the wrong cpuset
>   (stopped_cpus) to become empty, but since mixtures of stopped and suspended
>   CPUs are not close to working, stopped_cpus must be empty when resuming so
>   the wait is null -- restart_cpus just allows the other CPUs to restart and
>   returns without waiting.
>   
>   Fix resume_cpus() to wait on a non-wrong cpuset for the ACPI case, and
>   add further kludges to try to keep it working for the XEN case.  It
>   was only used for XEN.  It waited on suspended_cpus.  This works for
>   XEN.  However, for ACPI, resuming is a 2-step process.  ACPI has already
>   woken up the other CPUs and removed them from suspended_cpus.  This
>   fix records the move by putting them in a new cpuset resuming_cpus.
>   Waiting on suspended_cpus would give the same null wait as waiting on
>   stopped_cpus.  Wait on resuming_cpus instead.
>   
>   Add a cpuset toresume_cpus to map the CPUs being told to resume to keep
>   this separate from the cpuset started_cpus for mapping the CPUs being told
>   to restart.  Mixtures of stopped and suspended/resuming CPUs are still far
>   from working.  Describe new and some old cpusets in comments.
>   
>   Add further kludges to cpususpend_handler() to try to avoid breaking it
>   for XEN.  XEN doesn't use resumectx(), so it doesn't use the second
>   return path for savectx(), and it goes from the suspended state directly
>   to the restarted state, while ACPI resume goes through the resuming state.
>   Enter the resuming state early for all cases so that resume_cpus can test
>   for being in this state and not have to worry about the intermediate
>   !suspended state for ACPI only.


-- 
Andriy Gapon


More information about the svn-src-all mailing list