[PATCH v7 17/16] arm64: hibernate: Refuse to hibernate if the boot cpu is offline

Mark Rutland mark.rutland at arm.com
Thu Apr 21 05:33:35 PDT 2016


On Thu, Apr 21, 2016 at 12:44:16PM +0100, Mark Rutland wrote:
> On Wed, Apr 13, 2016 at 05:31:50PM +0100, James Morse wrote:
> > It is important to hibernate/resume on the same CPU, otherwise we may
> > change the cpu order or restore a big cpu's register state on a little
> > cpu.
> > 
> > We know cpu 0 is the cpu the firmware booted us on last time, 
> 
> This assumes that we only kexec from CPU0 also, which we will have to
> enforce. For example, disable_nonboot_cpus() does not enforce this if
> CPU0 has been hotplugged out.
> 
> Otherwise, this kernel's CPU0 is not necessarily the CPU the FW booted
> a kernel on.

A better approach might be:

* When going down for hibernate, store the physical CPU ID (e.g.
  MPIDR_EL1.Aff*) in the header for the hibernate image.

* When restoring a hibernate image, first switch over to the CPU
  described in the header (rather than assuming CPU0). 

I think this is a matter of adding a new disable_non_hibernate_cpus()
function (defaulting to disable_nonboot_cpus()), and overriding that in
the arch code. Then that can be called in resume_target_kernel.

Though there are likely caveats I've missed.

Thanks,
Mark.



More information about the linux-arm-kernel mailing list