[PATCH] ckpt/powerpc: handle syscall restart

Oren Laadan orenl at cs.columbia.edu
Mon Mar 1 11:20:03 PST 2010


Applied, thanks.

Nathan Lynch wrote:
> If a task is checkpointed while servicing a restartable system call
> like nanosleep, we need to ensure that the syscall is restarted
> appropriately after a checkpoint/restart cycle.  This gets
> cr_tests/sleeptest passing on powerpc.
> 
> Signed-off-by: Nathan Lynch <ntl at pobox.com>
> ---
>  arch/powerpc/kernel/checkpoint.c |   25 +++++++++++++++++++++++++
>  1 files changed, 25 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/checkpoint.c b/arch/powerpc/kernel/checkpoint.c
> index 2634011..cd384df 100644
> --- a/arch/powerpc/kernel/checkpoint.c
> +++ b/arch/powerpc/kernel/checkpoint.c
> @@ -307,6 +307,31 @@ static int restore_gprs(const struct ckpt_hdr_cpu *cpu_hdr,
>  	regs->orig_gpr3 = cpu_hdr->orig_gpr3;
>  
>  	regs->msr = sanitize_msr(regs->msr);
> +
> +	/* The normal servicing of the freezer's fake signal is
> +	 * short-circuited by checkpoint/restart.  See
> +	 * arch/powerpc/kernel/signal.c::do_signal_pending().
> +	 */
> +	if (TRAP(regs) != 0x0C00)
> +		goto out;
> +	if (!(regs->ccr & 0x10000000))
> +		goto out;
> +
> +	switch (regs->gpr[3]) {
> +	case ERESTARTNOHAND:
> +	case ERESTARTSYS:
> +	case ERESTARTNOINTR:
> +		regs->gpr[3] = regs->orig_gpr3;
> +		break;
> +	case ERESTART_RESTARTBLOCK:
> +		regs->gpr[0] = __NR_restart_syscall;
> +		break;
> +	default:
> +		goto out;
> +	}
> +
> +	regs->nip -= 4;
> +	regs->result = 0;
>  out:
>  	return rc;
>  }


More information about the Containers mailing list