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@xxxxxxxxx> > --- > 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; > } _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers