Hi Stefano,

Thanks for review.

On Tue, Dec 12, 2017 at 12:10 AM, Stefano Stabellini <sstabell...@kernel.org
> wrote:

> On Wed, 9 Aug 2017, Mirela Simonovic wrote:
> > This document contains our draft proposal for implementing "suspend to
> RAM"
> > support for ARM in Xen, as discussed during the last Xen ARM community
> call.
> > It covers the basic suspend to RAM mechanism based on ARM PSCI standard,
> > that would allow individual guests and Xen itself to suspend.
> >
> > We would appreciate your feedback.
> >
> > Signed-off-by: Mirela Simonovic <mirela.simono...@aggios.com>
>
> I am really sorry, for the very late reply. This email fell through the
> cracks. In general, if I forget about an email, please send a follow up
> to help me remember :-) Do you have an more up-to-date proposal or is
> this still the latest?
>

I've just sent new version, you're cc-ed.


>
> From an high level, it looks good, only one minor comment: don't call it
> "hotplug" because usually in the Xen community hotplug means adding more
> vcpus or removing vcpus at runtime (removing entirely, not suspending).
>
>
PSCI-based suspend relies on hotplug mechanism for suspending/resuming
non-boot CPUs. I believe we are aligned with the terminology, but if I
missed something please let me know.
I have updated the design spec, hope it's better now.

Thanks,
Mirela


> But the approach looks good to me.
>
>
> > ---
> >  docs/misc/arm/suspend-to-ram.txt | 210 ++++++++++++++++++++++++++++++
> +++++++++
> >  1 file changed, 210 insertions(+)
> >  create mode 100644 docs/misc/arm/suspend-to-ram.txt
> >
> > diff --git a/docs/misc/arm/suspend-to-ram.txt
> b/docs/misc/arm/suspend-to-ram.txt
> > new file mode 100644
> > index 0000000000..ec8080fc64
> > --- /dev/null
> > +++ b/docs/misc/arm/suspend-to-ram.txt
> > @@ -0,0 +1,210 @@
> > +% Suspend to RAM Support in Xen for ARM
> > +% Revision 1.0
> > +
> > +========
> > +Overview
> > +========
> > +
> > +Suspend to RAM (in the following text 'suspend') for ARM in Xen should
> be
> > +coordinated using ARM PSCI standard [1].
> > +
> > +EL1/2 should suspend in the following order:
> > +1) Unprivileged guests (DomUs) suspend
> > +2) Privileged guest (Dom0) suspends
> > +3) Xen suspends
> > +
> > +Since this proposal is focused on implementing PSCI-based suspend
> mechanisms in
> > +Xen, communication with or among the guests is not covered by this
> document.
> > +The order of suspending the guests is assumed to be guaranteed by the
> software
> > +running in EL1.
> > +
> > +-----------------
> > +Suspending Guests
> > +-----------------
> > +
> > +Suspend procedure for a guest consists of the following:
> > +1) Suspending devices
> > +2) Suspending non-boot CPUs
> > +3) System suspend, performed by the boot CPU
> > +
> > +Each guest should suspend the devices it owns. Suspending of devices is
> not
> > +covered by this document. The document covers only mechanisms for
> suspending
> > +non-boot CPUs, as well as the system suspend.
> > +
> > +Guests should suspend their non-boot vCPUs using the hotplug mechanism.
> > +Virtual CPUs should be put offline using the already implemented PSCI
> vCPU_OFF
> > +call (prefix 'v' is added to distinguish PSCI calls made by guests to
> Xen, which
> > +affect virtual machines; as opposed to PSCI calls made by Xen to the
> EL3, which
> > +can affect power state of the physical machine).
> > +
> > +After suspending its non-boot vCPUs a guest should finalize the suspend
> by
> > +making the vSYSTEM_SUSPEND PSCI call. The resume address is specified
> by the
> > +guest via the vSYSTEM_SUSPEND entry_point_address argument. The
> vSYSTEM_SUSPEND
> > +call is currently not implemented in Xen.
> > +
> > +It is expected that a guest leaves enabled all interrupts that should
> wake it
> > +up. Other interrupts should be disabled by the guest prior to calling
> > +vSYSTEM_SUSPEND.
> > +
> > +After an unprivileged guest suspends, Xen will not suspend. Xen would
> suspend
> > +only after the Dom0 completes the system suspend.
> > +
> > +--------------
> > +Suspending Xen
> > +--------------
> > +
> > +Xen should start suspending itself upon receiving the vSYSTEM_SUSPEND
> call
> > +from the last running guest (Dom0). At that moment all physical CPUs
> are still
> > +online (taking offline a vCPU or suspending a VM does not affect
> physical CPUs).
> > +Xen shall now put offline the non-boot pCPUs by making the CPU_OFF PSCI
> call
> > +to EL3. The CPU_OFF PSCI function is currently not implemented in Xen.
> > +
> > +After putting offline the non-boot cores Xen must save the context and
> finalize
> > +suspend by invoking SYSTEM_SUSPEND PSCI call, which is passed to EL3.
> > +The resume point of Xen is specified by the entry_point_address
> argument of the
> > +SYSTEM_SUSPEND call. The SYSTEM_SUSPEND function and context saving is
> not
> > +implemented in Xen for ARM today.
> > +
> > +------------
> > +Resuming Xen
> > +------------
> > +
> > +Xen must be resumed prior to any software running in EL1. Starting from
> the
> > +resume point, Xen should restore the context and resume Dom0. Dom0
> shall always
> > +be resumed whenever Xen resumes.
> > +The whole Xen resume flow for the ARM architecture has to be
> implemented.
> > +
> > +---------------
> > +Resuming Guests
> > +---------------
> > +
> > +Resume of the privileged guest (Dom0) is always following the Xen
> resume.
> > +
> > +An unprivileged guest shall resume once a device it owns triggers a
> wake-up
> > +interrupt, regardless of whether Xen was suspended when the wake-up
> interrupt
> > +was triggered. If Xen was suspended, it is assumed that Dom0 will be
> running
> > +before the DomU guest starts to resume. The synchronization mechanism to
> > +enforce the assumed condition is TBD.
> > +
> > +If the ARM's GIC was powered down after the ARM subsystem suspended, it
> is
> > +assumed that Xen needs to restore the GIC interface for a VM prior to
> handing
> > +over control to the guest. However, the guest should restore its own
> context
> > +upon entering the resume point (out of scope of this document).
> > +
> > +=======================
> > +Implementation Proposal
> > +=======================
> > +
> > +--------
> > +Overview
> > +--------
> > +
> > +In order to enable the suspend/resume of VMs and Xen itself, the
> following PSCI
> > +calls have to be implemented and integrated in Xen:
> > +1) vSYSTEM_SUSPEND
> > +2) CPU_OFF
> > +3) SYSTEM_SUSPEND
> > +
> > +In addition, the following have to be implemented:
> > +* Save/restore of EL2 context
> > +* Save/restore of GIC configuration for each VM
> > +
> > +Implementation details are provided in the sections below. Function
> names and
> > +paths used below are consistent within the document but may not always
> match the
> > +names used in future implementation. Existing functions and paths are
> named as
> > +in Xen source tree.
> > +
> > +Note: The proposal is still incomplete and shall be refined in future
> revisions.
> > +Specific issues that are not addressed are marked as "TBD".
> > +
> > +-------------------------------------
> > +Suspend/Resume Implementation Details
> > +-------------------------------------
> > +
> > +PSCI Implementation and Integration
> > +-----------------------------------
> > +vSYSTEM_SUSPEND
> > +---------------
> > +vSYSTEM_SUSPEND shall be implemented in
> > +* do_psci_system_suspend() in arch/arm/vpsci.c
> > +
> > +The implementation shall include the following steps:
> > +* Block the current vCPU
> > +* If the hardware domain made the call trigger Xen suspend, i.e.
> > +  call machine_suspend() which will be implemented in arch/arm/suspend.c
> > + (similar as the machine_restart() is implemented in
> arch/arm/shutdown.c)
> > +
> > +The function do_psci_system_suspend() shall be called from
> > +* do_trap_psci() in arch/arm/traps.c
> > +
> > +CPU_OFF (physical CPUs)
> > +-----------------------
> > +The CPU_OFF function shall be implemented in
> > +* call_psci_cpu_off() in arch/arm/psci.c
> > +
> > +The implementation shall consist just of making the SMC call to EL3.
> > +
> > +This function needs to be called when Xen generic code disables
> non-boot CPUs,
> > +which is done by
> > +* disable_nonboot_cpus() in common/cpu.c
> > +This function calls architecture specific
> > +* __cpu_die() implemented in arch/arm/smpboot.c
> > +The call_psci_cpu_off() shall be invoked when the respective CPU dies.
> To make
> > +that happen, the
> > +* arch_cpu_die() would be implemented in arch/arm/arm64/smpboot.c
> > +and called from __cpu_die().
> > +Finally the call_psci_cpu_off() shall be invoked from arch_cpu_die().
> > +
> > +Such a control flow would be similar to the already existing flow for
> enabling
> > +non-boot CPUs, which looks like this:
> > +enable_nonboot_cpus() -> cpu_up() -> __cpu_up() -> arch_cpu_up() ->
> > +call_psci_cpu_on()
> > +
> > +SYSTEM_SUSPEND (physical)
> > +-------------------------
> > +The SYSTEM_SUSPEND function shall be implemented in
> > +* call_psci_system_suspend() in arch/arm/psci.c
> > +
> > +The implementation shall consist just of making the SMC call to EL3. The
> > +entry_point_address argument of the SMC call needs to be an ARM
> architecture
> > +resume address. The call_psci_system_suspend() function does not return.
> > +
> > +The function needs to be called from machine_suspend() to finalize the
> suspend
> > +procedure.
> > +
> > +------------------
> > +Additional Changes
> > +------------------
> > +
> > +Suspend Flow
> > +------------
> > +The suspend procedure shall be implemented in
> > +* machine_suspend() in arch/arm/suspend.c
> > +
> > +The implementation shall include the following steps:
> > +* Set the system_state variable to SYS_STATE_suspend
> > +* Freeze domains by calling domain_pause() for each domain (we assume
> this needs
> > +  to be done)
> > +* Disable non-boot CPUs by calling disable_nonboot_cpus()
> > +* Save ARM specific context
> > +
> > +Resume Flow
> > +------------
> > +The resume procedure shall be implemented in
> > +* machine_resume() in arch/arm/suspend.c
> > +
> > +The machine_resume() implementation shall include the following steps:
> > +* Restore ARM specific context
> > +* Enable non-boot CPUs by calling enable_nonboot_cpus()
> > +* Thaw domains by calling domain_unpause() for each domain (we assume
> this needs
> > +  to be done)
> > +* Set the system_state variable to SYS_STATE_resume
> > +* TBD: how to resume Dom0, i.e. how to hand over control to Dom0?
> > +
> > +==========
> > +References
> > +==========
> > +
> > +[1] Power State Coordination Interface (ARM):
> > +http://infocenter.arm.com/help/topic/com.arm.doc.den0022d/Power_State_
> Coordination_Interface_PDD_v1_1_DEN0022D.pdf
> > +
> > --
> > 2.13.0
> >
> >
> > _______________________________________________
> > Xen-devel mailing list
> > xen-de...@lists.xen.org
> > https://lists.xen.org/xen-devel
> >
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to