[PATCH v2] powerpc/pseries: Simplify check for suspendability during suspend/migration
Cyril Bur
cyrilbur at gmail.com
Tue Mar 24 11:52:33 AEDT 2015
On Wed, 2015-03-04 at 12:22 -0800, Tyrel Datwyler wrote:
> During suspend/migration operation we must wait for the VASI state reported
> by the hypervisor to become Suspending prior to making the ibm,suspend-me
> RTAS call. Calling routines to rtas_ibm_supend_me() pass a vasi_state variable
> that exposes the VASI state to the caller. This is unnecessary as the caller
> only really cares about the following three conditions; if there is an error
> we should bailout, success indicating we have suspended and woken back up so
> proceed to device tree updated, or we are not suspendable yet so try calling
> rtas_ibm_suspend_me again shortly.
>
> This patch removes the extraneous vasi_state variable and simply uses the
> return code to communicate how to proceed. We either succeed, fail, or get
> -EAGAIN in which case we sleep for a second before trying to call
> rtas_ibm_suspend_me again.
>
Hi Tyrel, sorry this fell off my radar. Thanks for addressing all those
issues.
> Signed-off-by: Tyrel Datwyler <tyreld at linux.vnet.ibm.com>
> Cc: Nathan Fontenot <nfont at linux.vnet.ibm.com>
> Cc: Cyril Bur <cyrilbur at gmail.com>
> ---
>
> Changes in v2:
> - Addressed Cyril's comments as follow:
> - Removed unused vasi_rc variable
> - Kept return behavior of ppc_rtas the same in the case of VASI error
Looks good for ppc_rtas(). Still changing a return value (pointed out
below) in migrate_store(), we might be ok with that since its the sysfs
file but mentioning it in the commit message would be a good idea.
> - Updated rtas_ibm_suspend_me function definition for !CONFIG_PPC_PSERIES
>
Apart from that potential non problem, looks good to me.
Reviewed-by: Cyril Bur <cyrilbur at gmail.com>
> arch/powerpc/include/asm/rtas.h | 2 +-
> arch/powerpc/kernel/rtas.c | 26 +++++++++++++-------------
> arch/powerpc/platforms/pseries/mobility.c | 9 +++------
> 3 files changed, 17 insertions(+), 20 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h
> index 2e23e92..fc85eb0 100644
> --- a/arch/powerpc/include/asm/rtas.h
> +++ b/arch/powerpc/include/asm/rtas.h
> @@ -327,7 +327,7 @@ extern int rtas_suspend_cpu(struct rtas_suspend_me_data *data);
> extern int rtas_suspend_last_cpu(struct rtas_suspend_me_data *data);
> extern int rtas_online_cpus_mask(cpumask_var_t cpus);
> extern int rtas_offline_cpus_mask(cpumask_var_t cpus);
> -extern int rtas_ibm_suspend_me(u64 handle, int *vasi_return);
> +extern int rtas_ibm_suspend_me(u64 handle);
>
> struct rtc_time;
> extern unsigned long rtas_get_boot_time(void);
> diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
> index 21c45a2..b9a7b89 100644
> --- a/arch/powerpc/kernel/rtas.c
> +++ b/arch/powerpc/kernel/rtas.c
> @@ -897,7 +897,7 @@ int rtas_offline_cpus_mask(cpumask_var_t cpus)
> }
> EXPORT_SYMBOL(rtas_offline_cpus_mask);
>
> -int rtas_ibm_suspend_me(u64 handle, int *vasi_return)
> +int rtas_ibm_suspend_me(u64 handle)
> {
> long state;
> long rc;
> @@ -919,13 +919,11 @@ int rtas_ibm_suspend_me(u64 handle, int *vasi_return)
> printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned %ld\n",rc);
> return rc;
> } else if (state == H_VASI_ENABLED) {
> - *vasi_return = RTAS_NOT_SUSPENDABLE;
> - return 0;
> + return -EAGAIN;
> } else if (state != H_VASI_SUSPENDING) {
> printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned state %ld\n",
> state);
> - *vasi_return = -1;
> - return 0;
> + return -EIO;
> }
>
> if (!alloc_cpumask_var(&offline_mask, GFP_TEMPORARY))
> @@ -972,7 +970,7 @@ out:
> return atomic_read(&data.error);
> }
> #else /* CONFIG_PPC_PSERIES */
> -int rtas_ibm_suspend_me(u64 handle, int *vasi_return)
> +int rtas_ibm_suspend_me(u64 handle)
> {
> return -ENOSYS;
> }
> @@ -1022,7 +1020,6 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
> unsigned long flags;
> char *buff_copy, *errbuf = NULL;
> int nargs, nret, token;
> - int rc;
>
> if (!capable(CAP_SYS_ADMIN))
> return -EPERM;
> @@ -1054,15 +1051,18 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
> if (token == ibm_suspend_me_token) {
>
> /*
> - * rtas_ibm_suspend_me assumes args are in cpu endian, or at least the
> - * hcall within it requires it.
> + * rtas_ibm_suspend_me assumes the streamid handle is in cpu
> + * endian, or at least the hcall within it requires it.
> */
> - int vasi_rc = 0;
> + int rc = 0;
> u64 handle = ((u64)be32_to_cpu(args.args[0]) << 32)
> | be32_to_cpu(args.args[1]);
> - rc = rtas_ibm_suspend_me(handle, &vasi_rc);
> - args.rets[0] = cpu_to_be32(vasi_rc);
> - if (rc)
> + rc = rtas_ibm_suspend_me(handle);
> + if (rc == -EAGAIN)
> + args.rets[0] = cpu_to_be32(RTAS_NOT_SUSPENDABLE);
> + else if (rc == -EIO)
> + args.rets[0] = cpu_to_be32(-1);
> + else if (rc)
> return rc;
> goto copy_return;
> }
> diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
> index 90cf3dc..c489701 100644
> --- a/arch/powerpc/platforms/pseries/mobility.c
> +++ b/arch/powerpc/platforms/pseries/mobility.c
> @@ -318,22 +318,19 @@ static ssize_t migrate_store(struct class *class, struct class_attribute *attr,
> {
> u64 streamid;
> int rc;
> - int vasi_rc = 0;
>
> rc = kstrtou64(buf, 0, &streamid);
> if (rc)
> return rc;
>
> do {
> - rc = rtas_ibm_suspend_me(streamid, &vasi_rc);
> - if (!rc && vasi_rc == RTAS_NOT_SUSPENDABLE)
> + rc = rtas_ibm_suspend_me(streamid);
> + if (rc == -EAGAIN)
> ssleep(1);
> - } while (!rc && vasi_rc == RTAS_NOT_SUSPENDABLE);
> + } while (rc == -EAGAIN);
>
> if (rc)
> return rc;
> - if (vasi_rc)
> - return vasi_rc;
>
When rtas_ibm_suspend me() now returns -EIO, migrate_store() will now
return -EIO. It used to return -1.
> post_mobility_fixup();
> return count;
More information about the Linuxppc-dev
mailing list