* [PATCH 0/2] c/r: Add s390 support
@ 2009-02-24 18:37 Dan Smith
[not found] ` <1235500639-9597-1-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 13+ messages in thread
From: Dan Smith @ 2009-02-24 18:37 UTC (permalink / raw)
To: containers-qjLDD68F18O7TbgM5vRIOg
This set includes an updated version of the s390 patch as well as a new
one that adds the common CR_COPY() macros suggested by Dave.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] c/r: Add CR_COPY() macro
[not found] ` <1235500639-9597-1-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-02-24 18:37 ` Dan Smith
[not found] ` <1235500639-9597-2-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 18:37 ` [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5) Dan Smith
2009-02-24 19:31 ` [PATCH 0/2] c/r: Add s390 support Dan Smith
2 siblings, 1 reply; 13+ messages in thread
From: Dan Smith @ 2009-02-24 18:37 UTC (permalink / raw)
To: containers-qjLDD68F18O7TbgM5vRIOg
As suggested by Dave, this provides us a way to make the copy-in and
copy-out processes symmetric. I also added CR_COPY_BIT() to use with
the s390 bitfields, since we can't memcpy() those.
Signed-off-by: Dan Smith <danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
---
include/linux/checkpoint.h | 20 ++++++++++++++++++++
1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
index 217cf6e..b94422a 100644
--- a/include/linux/checkpoint.h
+++ b/include/linux/checkpoint.h
@@ -149,4 +149,24 @@ static inline void process_deny_checkpointing(struct task_struct *task) {}
#endif
+#define CR_CPT 1
+#define CR_RST 2
+
+#define CR_COPY(op, a, b) \
+ do { \
+ WARN_ON(sizeof(a) != sizeof(b)); \
+ if (op == CR_CPT) \
+ memcpy(&a, &b, sizeof(a)); \
+ else \
+ memcpy(&b, &a, sizeof(a)); \
+ } while (0);
+
+#define CR_COPY_BIT(op, a, b) \
+ do { \
+ if (op == CR_CPT) \
+ a = b; \
+ else \
+ b = a; \
+ } while (0);
+
#endif /* _CHECKPOINT_CKPT_H_ */
--
1.6.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
[not found] ` <1235500639-9597-1-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 18:37 ` [PATCH 1/2] c/r: Add CR_COPY() macro Dan Smith
@ 2009-02-24 18:37 ` Dan Smith
[not found] ` <1235500639-9597-3-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 19:31 ` [PATCH 0/2] c/r: Add s390 support Dan Smith
2 siblings, 1 reply; 13+ messages in thread
From: Dan Smith @ 2009-02-24 18:37 UTC (permalink / raw)
To: containers-qjLDD68F18O7TbgM5vRIOg
Implement the s390 arch-specific checkpoint/restart helpers. This
is on top of Oren Laadan's c/r code.
With these, I am able to checkpoint and restart simple programs as per
Oren's patch intro. While on x86 I never had to freeze a single task
to checkpoint it, on s390 I do need to. That is a prereq for consistent
snapshots (esp with multiple processes) anyway so I don't see that as
a problem.
Changelog:
Feb 24:
. Use CR_COPY() to unify the un/loading of cpu and mm state
. Fix fprs definition in cr_hdr_cpu
. Remove debug WARN_ON() from checkpoint.c
Feb 23:
. Macro-ize the un/packing of trace flags
. Fix the crash when externally-linked
. Break out the restart functions into restart.c
. Remove unneeded s390_enable_sie() call
Jan 30:
. Switched types in cr_hdr_cpu to __u64 etc.
(Per Oren suggestion)
. Replaced direct inclusion of structs in
cr_hdr_cpu with the struct members.
(Per Oren suggestion)
. Also ended up adding a bunch of new things
into restart (mm_segment, ksp, etc) in vain
attempt to get code using fpu to not segfault
after restart.
Signed-off-by: Serge E. Hallyn <serue-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Signed-off-by: Dan Smith <danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
---
arch/s390/include/asm/checkpoint_hdr.h | 84 +++++++++++++++++++++++++
arch/s390/include/asm/unistd.h | 4 +-
arch/s390/kernel/compat_wrapper.S | 12 ++++
arch/s390/kernel/syscalls.S | 2 +
arch/s390/mm/Makefile | 1 +
arch/s390/mm/checkpoint.c | 104 ++++++++++++++++++++++++++++++++
arch/s390/mm/restart.c | 71 ++++++++++++++++++++++
checkpoint/Kconfig | 2 +-
8 files changed, 278 insertions(+), 2 deletions(-)
create mode 100644 arch/s390/include/asm/checkpoint_hdr.h
create mode 100644 arch/s390/mm/checkpoint.c
create mode 100644 arch/s390/mm/restart.c
diff --git a/arch/s390/include/asm/checkpoint_hdr.h b/arch/s390/include/asm/checkpoint_hdr.h
new file mode 100644
index 0000000..cf84e9c
--- /dev/null
+++ b/arch/s390/include/asm/checkpoint_hdr.h
@@ -0,0 +1,84 @@
+#ifndef __ASM_S390_CKPT_HDR_H
+#define __ASM_S390_CKPT_HDR_H
+/*
+ * Checkpoint/restart - architecture specific headers s/390
+ *
+ * Copyright IBM Corp. 2009
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details.
+ */
+
+#include <linux/types.h>
+
+#ifdef __KERNEL__
+#include <asm/processor.h>
+#else
+#include <sys/user.h>
+#endif
+
+#ifdef __s390x__
+
+/*
+ * Notes
+ * NUM_GPRS defined in <asm/ptrace.h> to be 16
+ * NUM_FPRS defined in <asm/ptrace.h> to be 16
+ * NUM_APRS defined in <asm/ptrace.h> to be 16
+ */
+struct cr_hdr_cpu {
+ __u64 args[1];
+ __u64 gprs[NUM_GPRS];
+ __u64 orig_gpr2;
+ __u16 svcnr;
+ __u16 ilc;
+ __u32 acrs[NUM_ACRS];
+ __u64 ieee_instruction_pointer;
+
+ /* psw_t */
+ __u64 psw_t_mask;
+ __u64 psw_t_addr;
+
+ /* s390_fp_regs_t */
+ __u32 fpc;
+ union {
+ float f;
+ double d;
+ __u64 ui;
+ struct {
+ __u32 fp_hi;
+ __u32 fp_lo;
+ } fp;
+ } fprs[NUM_FPRS];
+
+ /* per_struct */
+ __u64 per_control_regs[3];
+ __u64 starting_addr;
+ __u64 ending_addr;
+ __u64 address;
+ __u16 perc_atmid;
+ __u8 access_id;
+ __u8 single_step;
+ __u8 instruction_fetch;
+};
+
+struct cr_hdr_mm_context {
+ unsigned long vdso_base;
+ int noexec;
+ int has_pgste;
+ int alloc_pgste;
+ unsigned long asce_bits;
+ unsigned long asce_limit;
+};
+
+struct cr_hdr_head_arch {
+};
+
+/* Functions for copying to/from the header structs */
+extern void cr_s390_regs(int op, struct cr_hdr_cpu *hh, struct task_struct *t);
+extern void cr_s390_mm(int op, struct cr_hdr_mm_context *hh,
+ struct mm_struct *mm);
+
+#endif /* __s390x__ */
+
+#endif /* __ASM_S390_CKPT_HDR__H */
diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h
index c8ad350..ffe64a0 100644
--- a/arch/s390/include/asm/unistd.h
+++ b/arch/s390/include/asm/unistd.h
@@ -265,7 +265,9 @@
#define __NR_pipe2 325
#define __NR_dup3 326
#define __NR_epoll_create1 327
-#define NR_syscalls 328
+#define __NR_checkpoint 328
+#define __NR_restart 329
+#define NR_syscalls 330
/*
* There are some system calls that are not present on 64 bit, some
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
index fc2c971..9546a81 100644
--- a/arch/s390/kernel/compat_wrapper.S
+++ b/arch/s390/kernel/compat_wrapper.S
@@ -1767,3 +1767,15 @@ sys_dup3_wrapper:
sys_epoll_create1_wrapper:
lgfr %r2,%r2 # int
jg sys_epoll_create1 # branch to system call
+
+ .globl sys_checkpoint_wrapper
+sys_checkpoint_wrapper:
+ lgfr %r2,%r2 # pid_t
+ lgfr %r3,%r3 # int
+ llgfr %r4,%r4 # unsigned long
+
+ .globl sys_restart_wrapper
+sys_restart_wrapper:
+ lgfr %r2,%r2 # int
+ lgfr %r3,%r3 # int
+ llgfr %r4,%r4 # unsigned long
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
index 2d61787..54316c8 100644
--- a/arch/s390/kernel/syscalls.S
+++ b/arch/s390/kernel/syscalls.S
@@ -336,3 +336,5 @@ SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)
SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */
SYSCALL(sys_dup3,sys_dup3,sys_dup3_wrapper)
SYSCALL(sys_epoll_create1,sys_epoll_create1,sys_epoll_create1_wrapper)
+SYSCALL(sys_checkpoint,sys_checkpoint,sys_checkpoint_wrapper)
+SYSCALL(sys_restart,sys_restart,sys_restart_wrapper)
diff --git a/arch/s390/mm/Makefile b/arch/s390/mm/Makefile
index 2a74581..040fbb7 100644
--- a/arch/s390/mm/Makefile
+++ b/arch/s390/mm/Makefile
@@ -6,3 +6,4 @@ obj-y := init.o fault.o extmem.o mmap.o vmem.o pgtable.o
obj-$(CONFIG_CMM) += cmm.o
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
obj-$(CONFIG_PAGE_STATES) += page-states.o
+obj-$(CONFIG_CHECKPOINT_RESTART) += checkpoint.o restart.o
diff --git a/arch/s390/mm/checkpoint.c b/arch/s390/mm/checkpoint.c
new file mode 100644
index 0000000..19c6ae7
--- /dev/null
+++ b/arch/s390/mm/checkpoint.c
@@ -0,0 +1,104 @@
+/*
+ * Checkpoint/restart - architecture specific support for s390
+ *
+ * Copyright IBM Corp. 2009
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details.
+ */
+
+#include <linux/checkpoint.h>
+#include <linux/checkpoint_hdr.h>
+#include <linux/kernel.h>
+#include <asm/system.h>
+#include <asm/pgtable.h>
+
+void cr_s390_regs(int op, struct cr_hdr_cpu *hh, struct task_struct *t)
+{
+ struct pt_regs *regs = task_pt_regs(t);
+ struct thread_struct *thr = &t->thread;
+
+ CR_COPY(op, hh->fpc, thr->fp_regs.fpc);
+ CR_COPY(op, hh->fprs, thr->fp_regs.fprs);
+ CR_COPY(op, hh->acrs, thr->acrs);
+ CR_COPY(op, hh->psw_t_mask, regs->psw.mask);
+ CR_COPY(op, hh->psw_t_addr, regs->psw.addr);
+ CR_COPY(op, hh->args, regs->args);
+ CR_COPY(op, hh->svcnr, regs->svcnr);
+ CR_COPY(op, hh->ilc, regs->ilc);
+ CR_COPY(op, hh->gprs, regs->gprs);
+ CR_COPY(op, hh->orig_gpr2, regs->orig_gpr2);
+ CR_COPY(op, hh->per_control_regs, thr->per_info.control_regs.words);
+ CR_COPY(op, hh->starting_addr, thr->per_info.starting_addr);
+ CR_COPY(op, hh->ending_addr, thr->per_info.ending_addr);
+ CR_COPY(op, hh->perc_atmid, thr->per_info.lowcore.words.perc_atmid);
+ CR_COPY(op, hh->address, thr->per_info.lowcore.words.address);
+ CR_COPY(op, hh->access_id, thr->per_info.lowcore.words.access_id);
+ CR_COPY(op, hh->ieee_instruction_pointer,
+ thr->ieee_instruction_pointer);
+
+ CR_COPY_BIT(op, hh->single_step, thr->per_info.single_step);
+ CR_COPY_BIT(op, hh->instruction_fetch,
+ thr->per_info.instruction_fetch);
+}
+
+void cr_s390_mm(int op, struct cr_hdr_mm_context *hh, struct mm_struct *mm)
+{
+#if 0
+ CR_COPY(op, hh->vdso_base, mm->context.vdso_base);
+#endif
+ CR_COPY(op, hh->noexec, mm->context.noexec);
+ CR_COPY(op, hh->has_pgste, mm->context.has_pgste);
+ CR_COPY(op, hh->alloc_pgste, mm->context.alloc_pgste);
+ CR_COPY(op, hh->asce_bits, mm->context.asce_bits);
+ CR_COPY(op, hh->asce_limit, mm->context.asce_limit);
+}
+
+int cr_write_thread(struct cr_ctx *ctx, struct task_struct *t)
+{
+ return 0;
+}
+
+/* dump the cpu state and registers of a given task */
+int cr_write_cpu(struct cr_ctx *ctx, struct task_struct *t)
+{
+ struct cr_hdr h;
+ struct cr_hdr_cpu *hh = cr_hbuf_get(ctx, sizeof(*hh));
+ int ret;
+
+ h.type = CR_HDR_CPU;
+ h.len = sizeof(*hh);
+ h.parent = task_pid_vnr(t);
+
+ cr_s390_regs(CR_CPT, hh, t);
+
+ ret = cr_write_obj(ctx, &h, hh);
+ cr_hbuf_put(ctx, sizeof(*hh));
+
+ return ret;
+}
+
+int cr_write_head_arch(struct cr_ctx *ctx)
+{
+ return 0;
+}
+
+/* Nothing to do for mm context state */
+int cr_write_mm_context(struct cr_ctx *ctx, struct mm_struct *mm, int parent)
+{
+ struct cr_hdr h;
+ struct cr_hdr_mm_context *hh = cr_hbuf_get(ctx, sizeof(*hh));
+ int ret;
+
+ h.type = CR_HDR_MM_CONTEXT;
+ h.len = sizeof(*hh);
+ h.parent = parent;
+
+ cr_s390_mm(CR_CPT, hh, mm);
+
+ ret = cr_write_obj(ctx, &h, hh);
+ cr_hbuf_put(ctx, sizeof(*hh));
+
+ return ret;
+}
diff --git a/arch/s390/mm/restart.c b/arch/s390/mm/restart.c
new file mode 100644
index 0000000..d400a72
--- /dev/null
+++ b/arch/s390/mm/restart.c
@@ -0,0 +1,71 @@
+/*
+ * Checkpoint/restart - architecture specific support for s390
+ *
+ * Copyright IBM Corp. 2009
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details.
+ */
+
+#include <linux/checkpoint.h>
+#include <linux/checkpoint_hdr.h>
+#include <linux/kernel.h>
+#include <asm/system.h>
+#include <asm/pgtable.h>
+
+extern void cr_s390_regs(int op, struct cr_hdr_cpu *hh, struct task_struct *t);
+extern void cr_s390_mm(int op, struct cr_hdr_mm_context *hh,
+ struct mm_struct *mm);
+
+int cr_read_thread(struct cr_ctx *ctx)
+{
+ return 0;
+}
+
+int cr_read_cpu(struct cr_ctx *ctx)
+{
+ struct cr_hdr_cpu *hh = cr_hbuf_get(ctx, sizeof(*hh));
+ struct pt_regs *regs = task_pt_regs(current);
+ int parent, ret;
+
+ parent = cr_read_obj_type(ctx, hh, sizeof(*hh), CR_HDR_CPU);
+ if (parent < 0) {
+ ret = parent;
+ goto out;
+ }
+ ret = 0;
+
+ regs->psw.addr &= ~PSW_ADDR_INSN;
+ cr_s390_regs(CR_RST, hh, current);
+ restore_access_regs(hh->acrs);
+out:
+ cr_hbuf_put(ctx, sizeof(*hh));
+ return ret;
+}
+
+int cr_read_head_arch(struct cr_ctx *ctx)
+{
+ return 0;
+}
+
+
+int cr_read_mm_context(struct cr_ctx *ctx, struct mm_struct *mm, int rparent)
+{
+ struct cr_hdr_mm_context *hh = cr_hbuf_get(ctx, sizeof(*hh));
+ int parent, ret = -EINVAL;
+
+ parent = cr_read_obj_type(ctx, hh, sizeof(*hh), CR_HDR_MM_CONTEXT);
+ if (parent < 0) {
+ ret = parent;
+ goto out;
+ }
+ if (parent != rparent)
+ goto out;
+
+ cr_s390_mm(CR_RST, hh, mm);
+ ret = 0;
+ out:
+ cr_hbuf_put(ctx, sizeof(*hh));
+ return ret;
+}
diff --git a/checkpoint/Kconfig b/checkpoint/Kconfig
index ffaa635..cb1d29d 100644
--- a/checkpoint/Kconfig
+++ b/checkpoint/Kconfig
@@ -1,7 +1,7 @@
config CHECKPOINT_RESTART
prompt "Enable checkpoint/restart (EXPERIMENTAL)"
def_bool n
- depends on X86_32 && EXPERIMENTAL
+ depends on (X86_32 || (S390 && 64BIT)) && EXPERIMENTAL
help
Application checkpoint/restart is the ability to save the
state of a running application so that it can later resume
--
1.6.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] c/r: Add CR_COPY() macro
[not found] ` <1235500639-9597-2-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-02-24 19:20 ` Serge E. Hallyn
0 siblings, 0 replies; 13+ messages in thread
From: Serge E. Hallyn @ 2009-02-24 19:20 UTC (permalink / raw)
To: Dan Smith; +Cc: containers-qjLDD68F18O7TbgM5vRIOg
Quoting Dan Smith (danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org):
> As suggested by Dave, this provides us a way to make the copy-in and
> copy-out processes symmetric. I also added CR_COPY_BIT() to use with
> the s390 bitfields, since we can't memcpy() those.
>
> Signed-off-by: Dan Smith <danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> ---
> include/linux/checkpoint.h | 20 ++++++++++++++++++++
> 1 files changed, 20 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/checkpoint.h b/include/linux/checkpoint.h
> index 217cf6e..b94422a 100644
> --- a/include/linux/checkpoint.h
> +++ b/include/linux/checkpoint.h
> @@ -149,4 +149,24 @@ static inline void process_deny_checkpointing(struct task_struct *task) {}
>
> #endif
>
> +#define CR_CPT 1
> +#define CR_RST 2
> +
> +#define CR_COPY(op, a, b) \
> + do { \
> + WARN_ON(sizeof(a) != sizeof(b)); \
Can this be a BUILD_BUG_ON()?
> + if (op == CR_CPT) \
> + memcpy(&a, &b, sizeof(a)); \
> + else \
> + memcpy(&b, &a, sizeof(a)); \
> + } while (0);
> +
> +#define CR_COPY_BIT(op, a, b) \
> + do { \
maybe add a
BUILD_BUG_ON(typeof(a)!=typeof(b));
?
> + if (op == CR_CPT) \
> + a = b; \
> + else \
> + b = a; \
> + } while (0);
> +
> #endif /* _CHECKPOINT_CKPT_H_ */
> --
> 1.6.1
>
> _______________________________________________
> Containers mailing list
> Containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
> https://lists.linux-foundation.org/mailman/listinfo/containers
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 0/2] c/r: Add s390 support
[not found] ` <1235500639-9597-1-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 18:37 ` [PATCH 1/2] c/r: Add CR_COPY() macro Dan Smith
2009-02-24 18:37 ` [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5) Dan Smith
@ 2009-02-24 19:31 ` Dan Smith
2 siblings, 0 replies; 13+ messages in thread
From: Dan Smith @ 2009-02-24 19:31 UTC (permalink / raw)
To: containers-qjLDD68F18O7TbgM5vRIOg
DS> This set includes an updated version of the s390 patch as well as
DS> a new one that adds the common CR_COPY() macros suggested by Dave.
For the sake of comparison, the (trimmed) diffstat of the original
patch was:
arch/s390/include/asm/checkpoint_hdr.h | 99 +++++++++++++++++++++++++++
arch/s390/mm/checkpoint.c | 106 +++++++++++++++++++++++++++++
arch/s390/mm/restart.c | 117 ++++++++++++++++++++++++++++++++
8 files changed, 341 insertions(+), 2 deletions(-)
and after the macros it was
arch/s390/include/asm/checkpoint_hdr.h | 84 +++++++++++++++++++++++++
arch/s390/mm/checkpoint.c | 104 ++++++++++++++++++++++++++++++++
arch/s390/mm/restart.c | 71 ++++++++++++++++++++++
8 files changed, 278 insertions(+), 2 deletions(-)
That's a savings of ~60 lines in the affected bits. Personally, I
think that it makes the save/load bits significantly easier to read as
well.
--
Dan Smith
IBM Linux Technology Center
email: danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
[not found] ` <1235500639-9597-3-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-02-24 19:37 ` Serge E. Hallyn
[not found] ` <20090224193737.GB24007-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 13+ messages in thread
From: Serge E. Hallyn @ 2009-02-24 19:37 UTC (permalink / raw)
To: Dan Smith; +Cc: containers-qjLDD68F18O7TbgM5vRIOg
Quoting Dan Smith (danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org):
Thanks, Dan, this looks very nice with the CR_COPY, plus you
fixed the bug I couldn't find :) A few comments:
> +struct cr_hdr_cpu {
> + __u64 args[1];
Dave wanted this to not be an array, right?
> + __u64 gprs[NUM_GPRS];
> + __u64 orig_gpr2;
> + __u16 svcnr;
> + __u16 ilc;
> + __u32 acrs[NUM_ACRS];
> + __u64 ieee_instruction_pointer;
> +
> + /* psw_t */
> + __u64 psw_t_mask;
> + __u64 psw_t_addr;
> +
> + /* s390_fp_regs_t */
> + __u32 fpc;
> + union {
> + float f;
> + double d;
> + __u64 ui;
Since this is a union, and you don't deal with its
members but just memcpy it, why not just change it
to
__u64 fprs[NUM_FPRS];
and not have a union at all?
> + struct {
> + __u32 fp_hi;
> + __u32 fp_lo;
> + } fp;
> + } fprs[NUM_FPRS];
> +
> + /* per_struct */
> + __u64 per_control_regs[3];
I assume Dave still wants you to add a
#define PER_NUM_REGS 3
into the arch/s390/include/asm/processor.h or something.
> +void cr_s390_mm(int op, struct cr_hdr_mm_context *hh, struct mm_struct *mm)
> +{
> +#if 0
The comment about why this is ifdefed out for now should stay
here.
> + CR_COPY(op, hh->vdso_base, mm->context.vdso_base);
> +#endif
> + CR_COPY(op, hh->noexec, mm->context.noexec);
> + CR_COPY(op, hh->has_pgste, mm->context.has_pgste);
> + CR_COPY(op, hh->alloc_pgste, mm->context.alloc_pgste);
> + CR_COPY(op, hh->asce_bits, mm->context.asce_bits);
> + CR_COPY(op, hh->asce_limit, mm->context.asce_limit);
> +}
> +
> +int cr_write_thread(struct cr_ctx *ctx, struct task_struct *t)
> +{
> + return 0;
> +}
> +
> +/* dump the cpu state and registers of a given task */
> +int cr_write_cpu(struct cr_ctx *ctx, struct task_struct *t)
> +{
> + struct cr_hdr h;
> + struct cr_hdr_cpu *hh = cr_hbuf_get(ctx, sizeof(*hh));
> + int ret;
> +
> + h.type = CR_HDR_CPU;
> + h.len = sizeof(*hh);
> + h.parent = task_pid_vnr(t);
BTW - I know Dave mentioened using a generic helper for this
often-used stanza above, but I continue to be against that
bc the helper ends up having to take a bunch of eye-numbing
arguments and I think the code ends up hard to read. But
maybe you can think of a way to make that clearer...
> +
> + cr_s390_regs(CR_CPT, hh, t);
> +
> + ret = cr_write_obj(ctx, &h, hh);
> + cr_hbuf_put(ctx, sizeof(*hh));
> +
> + return ret;
> +}
> +
> +int cr_write_head_arch(struct cr_ctx *ctx)
> +{
> + return 0;
> +}
> +
> +/* Nothing to do for mm context state */
The above comment is clearly wrong :)
> +int cr_write_mm_context(struct cr_ctx *ctx, struct mm_struct *mm, int parent)
> +{
> + struct cr_hdr h;
> + struct cr_hdr_mm_context *hh = cr_hbuf_get(ctx, sizeof(*hh));
> + int ret;
> +
> + h.type = CR_HDR_MM_CONTEXT;
> + h.len = sizeof(*hh);
> + h.parent = parent;
> +
> + cr_s390_mm(CR_CPT, hh, mm);
> +
> + ret = cr_write_obj(ctx, &h, hh);
> + cr_hbuf_put(ctx, sizeof(*hh));
> +
> + return ret;
> +}
...
> +int cr_read_cpu(struct cr_ctx *ctx)
> +{
> + struct cr_hdr_cpu *hh = cr_hbuf_get(ctx, sizeof(*hh));
> + struct pt_regs *regs = task_pt_regs(current);
> + int parent, ret;
> +
> + parent = cr_read_obj_type(ctx, hh, sizeof(*hh), CR_HDR_CPU);
> + if (parent < 0) {
> + ret = parent;
> + goto out;
> + }
> + ret = 0;
> +
> + regs->psw.addr &= ~PSW_ADDR_INSN;
> + cr_s390_regs(CR_RST, hh, current);
> + restore_access_regs(hh->acrs);
Just a comment explaining why?
> +out:
> + cr_hbuf_put(ctx, sizeof(*hh));
> + return ret;
> +}
thanks
-serge
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
[not found] ` <20090224193737.GB24007-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-02-24 19:46 ` Dave Hansen
2009-02-24 20:04 ` Serge E. Hallyn
2009-02-24 19:56 ` Dan Smith
1 sibling, 1 reply; 13+ messages in thread
From: Dave Hansen @ 2009-02-24 19:46 UTC (permalink / raw)
To: Serge E. Hallyn; +Cc: containers-qjLDD68F18O7TbgM5vRIOg, Dan Smith
On Tue, 2009-02-24 at 13:37 -0600, Serge E. Hallyn wrote:
>
> > +/* dump the cpu state and registers of a given task */
> > +int cr_write_cpu(struct cr_ctx *ctx, struct task_struct *t)
> > +{
> > + struct cr_hdr h;
> > + struct cr_hdr_cpu *hh = cr_hbuf_get(ctx, sizeof(*hh));
> > + int ret;
> > +
> > + h.type = CR_HDR_CPU;
> > + h.len = sizeof(*hh);
> > + h.parent = task_pid_vnr(t);
>
> BTW - I know Dave mentioened using a generic helper for this
> often-used stanza above, but I continue to be against that
> bc the helper ends up having to take a bunch of eye-numbing
> arguments and I think the code ends up hard to read. But
> maybe you can think of a way to make that clearer...
Yeah, that's true. The plethora of types also makes it hard to do with
a function. For plain readability you can't beat what we already have
there.
But, I do still wonder why we need the .parent member in the cr_hdr
itself. Shouldn't that be something that gets pushed down to where we
can actually describe it, like in the cr_hdr_foo structures?
-- Dave
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
[not found] ` <20090224193737.GB24007-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 19:46 ` Dave Hansen
@ 2009-02-24 19:56 ` Dan Smith
[not found] ` <87k57flib8.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
1 sibling, 1 reply; 13+ messages in thread
From: Dan Smith @ 2009-02-24 19:56 UTC (permalink / raw)
To: Serge E. Hallyn; +Cc: containers-qjLDD68F18O7TbgM5vRIOg
>> +struct cr_hdr_cpu {
>> + __u64 args[1];
SH> Dave wanted this to not be an array, right?
I think he was okay with it since it matched what is in the rest of
the s390 code. I think that the use of the CR_COPY() macros makes it
nicer to have matching types as closely as possible.
>> + union {
>> + float f;
>> + double d;
>> + __u64 ui;
SH> Since this is a union, and you don't deal with its members but
SH> just memcpy it, why not just change it to
That's a fair argument, although I was thinking that there was some
expectation of being able to include this in userspace at some point
to inspect the contents of the CR stream. The #ifdef __KERNEL__ at
the top of the file makes me think that's true. If so, does it make
sense to leave this as-is for easier inspection of the contents?
>> + struct {
>> + __u32 fp_hi;
>> + __u32 fp_lo;
>> + } fp;
>> + } fprs[NUM_FPRS];
>> +
>> + /* per_struct */
>> + __u64 per_control_regs[3];
SH> I assume Dave still wants you to add a
SH> #define PER_NUM_REGS 3
SH> into the arch/s390/include/asm/processor.h or something.
Ah, right, I thought I was getting out of fixing that with the
CR_COPY() macro, but I forgot about this one :)
>> +void cr_s390_mm(int op, struct cr_hdr_mm_context *hh, struct mm_struct *mm)
>> +{
>> +#if 0
SH> The comment about why this is ifdefed out for now should stay
SH> here.
Yep.
>> +/* Nothing to do for mm context state */
SH> The above comment is clearly wrong :)
Oops :)
>> + restore_access_regs(hh->acrs);
SH> Just a comment explaining why?
But it's *so* obvious, right? <ahem> ... Yeah, agreed :)
--
Dan Smith
IBM Linux Technology Center
email: danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
2009-02-24 19:46 ` Dave Hansen
@ 2009-02-24 20:04 ` Serge E. Hallyn
[not found] ` <20090224200430.GA26259-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 13+ messages in thread
From: Serge E. Hallyn @ 2009-02-24 20:04 UTC (permalink / raw)
To: Dave Hansen; +Cc: containers-qjLDD68F18O7TbgM5vRIOg, Dan Smith
Quoting Dave Hansen (dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org):
> On Tue, 2009-02-24 at 13:37 -0600, Serge E. Hallyn wrote:
> >
> > > +/* dump the cpu state and registers of a given task */
> > > +int cr_write_cpu(struct cr_ctx *ctx, struct task_struct *t)
> > > +{
> > > + struct cr_hdr h;
> > > + struct cr_hdr_cpu *hh = cr_hbuf_get(ctx, sizeof(*hh));
> > > + int ret;
> > > +
> > > + h.type = CR_HDR_CPU;
> > > + h.len = sizeof(*hh);
> > > + h.parent = task_pid_vnr(t);
> >
> > BTW - I know Dave mentioened using a generic helper for this
> > often-used stanza above, but I continue to be against that
> > bc the helper ends up having to take a bunch of eye-numbing
> > arguments and I think the code ends up hard to read. But
> > maybe you can think of a way to make that clearer...
>
> Yeah, that's true. The plethora of types also makes it hard to do with
> a function. For plain readability you can't beat what we already have
> there.
>
> But, I do still wonder why we need the .parent member in the cr_hdr
> itself. Shouldn't that be something that gets pushed down to where we
> can actually describe it, like in the cr_hdr_foo structures?
Hmm, yeah, moving it would have two upsides: make the common
stanza a line shorter, and let us use more descriptive names
for the variables. parent is really not helpful unless you've
spent years with the code...
OTOH I'm not eager to make such a change right now only to find
months later that there was a good reason to keep it in the hdr
after all :)
-serge
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
[not found] ` <87k57flib8.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
@ 2009-02-24 20:09 ` Serge E. Hallyn
[not found] ` <20090224200939.GB26259-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 13+ messages in thread
From: Serge E. Hallyn @ 2009-02-24 20:09 UTC (permalink / raw)
To: Dan Smith; +Cc: containers-qjLDD68F18O7TbgM5vRIOg
Quoting Dan Smith (danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org):
> >> +struct cr_hdr_cpu {
> >> + __u64 args[1];
>
> SH> Dave wanted this to not be an array, right?
>
> I think he was okay with it since it matched what is in the rest of
> the s390 code. I think that the use of the CR_COPY() macros makes it
> nicer to have matching types as closely as possible.
Ok with me. Dave can speak up if he needs to :)
> >> + union {
> >> + float f;
> >> + double d;
> >> + __u64 ui;
>
> SH> Since this is a union, and you don't deal with its members but
> SH> just memcpy it, why not just change it to
>
> That's a fair argument, although I was thinking that there was some
> expectation of being able to include this in userspace at some point
> to inspect the contents of the CR stream. The #ifdef __KERNEL__ at
> the top of the file makes me think that's true. If so, does it make
> sense to leave this as-is for easier inspection of the contents?
But what is userspace supposed to gain from seeing that in the
headers? No matter how many other ways we represent the data
containined in a fprs union, all we know based on the checkpoint
image is what the size of NUM_FPRS*sizeof(*fprs) is, right?
Or do you mean the programmers will see that and be able to tell
more easiliy where in ptrace.h the corresponding union is?
-serge
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
[not found] ` <20090224200939.GB26259-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-02-24 20:53 ` Dan Smith
0 siblings, 0 replies; 13+ messages in thread
From: Dan Smith @ 2009-02-24 20:53 UTC (permalink / raw)
To: Serge E. Hallyn; +Cc: containers-qjLDD68F18O7TbgM5vRIOg
SH> Or do you mean the programmers will see that and be able to tell
SH> more easiliy where in ptrace.h the corresponding union is?
Right, I was thinking about it from the point of view of letting the
user of that structure (which could be in userspace) know what the
contents are. In other words, I don't see why we should have some of
the fields be opaque outside of the kernel and not others (not
including any that really can't be interpreted by userspace in a
meaningful way).
--
Dan Smith
IBM Linux Technology Center
email: danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
[not found] ` <20090224200430.GA26259-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-02-24 21:21 ` Dave Hansen
2009-02-24 21:49 ` Serge E. Hallyn
0 siblings, 1 reply; 13+ messages in thread
From: Dave Hansen @ 2009-02-24 21:21 UTC (permalink / raw)
To: Serge E. Hallyn; +Cc: containers-qjLDD68F18O7TbgM5vRIOg, Dan Smith
On Tue, 2009-02-24 at 14:04 -0600, Serge E. Hallyn wrote:
> OTOH I'm not eager to make such a change right now only to find
> months later that there was a good reason to keep it in the hdr
> after all :)
The thing that bothers me about all of these things is that we can't
truly evaluate them on their merits because we can't see how they are
expected to be used in the future. Surely there are multiple ways we
can implement details of the incremental checkpoint.
-- Dave
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5)
2009-02-24 21:21 ` Dave Hansen
@ 2009-02-24 21:49 ` Serge E. Hallyn
0 siblings, 0 replies; 13+ messages in thread
From: Serge E. Hallyn @ 2009-02-24 21:49 UTC (permalink / raw)
To: Dave Hansen; +Cc: containers-qjLDD68F18O7TbgM5vRIOg, Dan Smith
Quoting Dave Hansen (dave-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org):
> On Tue, 2009-02-24 at 14:04 -0600, Serge E. Hallyn wrote:
> > OTOH I'm not eager to make such a change right now only to find
> > months later that there was a good reason to keep it in the hdr
> > after all :)
>
> The thing that bothers me about all of these things is that we can't
> truly evaluate them on their merits because we can't see how they are
> expected to be used in the future. Surely there are multiple ways we
> can implement details of the incremental checkpoint.
>
> -- Dave
Oh I think that was a bogus guess on my part anyway.
Like I say I don't want to encourage churn for the sake of churn
at this point, but you've got me thinking that moving parent into
the details and giving it a more useful name could *really*
dilute some of the mystery in these patches.
It's sounding good to me...
-serge
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2009-02-24 21:49 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-24 18:37 [PATCH 0/2] c/r: Add s390 support Dan Smith
[not found] ` <1235500639-9597-1-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 18:37 ` [PATCH 1/2] c/r: Add CR_COPY() macro Dan Smith
[not found] ` <1235500639-9597-2-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 19:20 ` Serge E. Hallyn
2009-02-24 18:37 ` [PATCH 2/2] c/r: define s390-specific checkpoint-restart code (v5) Dan Smith
[not found] ` <1235500639-9597-3-git-send-email-danms-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 19:37 ` Serge E. Hallyn
[not found] ` <20090224193737.GB24007-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 19:46 ` Dave Hansen
2009-02-24 20:04 ` Serge E. Hallyn
[not found] ` <20090224200430.GA26259-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 21:21 ` Dave Hansen
2009-02-24 21:49 ` Serge E. Hallyn
2009-02-24 19:56 ` Dan Smith
[not found] ` <87k57flib8.fsf-FLMGYpZoEPULwtHQx/6qkW3U47Q5hpJU@public.gmane.org>
2009-02-24 20:09 ` Serge E. Hallyn
[not found] ` <20090224200939.GB26259-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-02-24 20:53 ` Dan Smith
2009-02-24 19:31 ` [PATCH 0/2] c/r: Add s390 support Dan Smith
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.