[PATCH 2/3] ARM: mcpm: Implement cpu_kill() to synchronise on powerdown
Nicolas Pitre
nicolas.pitre at linaro.org
Mon Sep 30 15:18:08 EDT 2013
On Mon, 30 Sep 2013, Dave Martin wrote:
> CPU hotplug and kexec rely on smp_ops.cpu_kill(), which is supposed
> to wait for the CPU to park or power down, and perform the last
> rites (such as disabling clocks etc., where the platform doesn't do
> this automatically).
>
> kexec in particular is unsafe without performing this
> synchronisation to park secondaries. Without it, the secondaries
> might not be parked when kexec trashes the kernel.
>
> There is no generic way to do this synchronisation, so a new mcpm
> platform_ops method power_down_finish() is added by this patch.
>
> The new method is mandatory. A platform which provides no way to
> detect when CPUs are parked is likely broken.
>
> Signed-off-by: Dave Martin <Dave.Martin at arm.com>
There is still a problem with this patch.
> +int mcpm_cpu_power_down_finish(unsigned int cpu, unsigned int cluster)
> +{
> + int ret;
> +
> + if (WARN_ON_ONCE(!platform_ops || !platform_ops->power_down_finish))
> + return 0;
> +
> + ret = platform_ops->power_down_finish(cpu, cluster);
> + if (!ret)
> + pr_warn("%s: cpu %u, cluster %u failed to power down\n",
> + __func__, cpu, cluster);
> +
> + return ret;
> +}
So 0 is the error case.
[...]
> + * mcpm_cpu_power_down_finish - wait for a specified CPU to halt, and
> + * make sure it is powered off
[...]
> + * @return:
> + * - zero if the CPU is in a safely parked state
> + * - nonzero otherwise (e.g., timeout)
But you document it as being the opposite.
I'd suggest that the return value is either an int where 0 means success
and negative error codes are returned otherwise, or it is a bool and
true/false means success/failure.
I see that platform_cpu_kill() is a bit inconsistent in that regard, but
we don't have to propagate this down.
Nicolas
More information about the linux-arm-kernel
mailing list