[Devel] [PATCH RFC user-cr] add -p option to ckptinfo to dump pids tree
Serge E. Hallyn
serue at us.ibm.com
Tue Mar 9 13:05:40 PST 2010
This will be used by a restart wrapper to analyze /proc/$$/mountinfo.
Also add the new rpids field to ckpt_pids to reflect kernel.
It depends on the patch I just sent for linux-cr adding rpid to
struct ckpt_pids.
Signed-off-by: Serge E. Hallyn <serue at us.ibm.com>
---
ckptinfo.c | 36 +++++++++++++++++++++++++++++++++++-
include/linux/checkpoint_hdr.h | 1 +
2 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/ckptinfo.c b/ckptinfo.c
index 6190301..b5922da 100644
--- a/ckptinfo.c
+++ b/ckptinfo.c
@@ -28,6 +28,7 @@ static char usage_str[] =
"\tOptions:\n"
"\t -h,--help print this help message\n"
"\t -e,--error show error messages\n"
+"\t -p,--pids just list process tree\n"
"\t -v,--verbose verbose output\n"
"\t --show-arch-regs show registers contents\n"
"";
@@ -36,6 +37,7 @@ struct args {
int error;
int verbose;
int show_arch_regs;
+ int show_process_tree;
};
int __verbose;
@@ -55,6 +57,7 @@ static int image_parse_vma(struct ckpt_hdr *h, int fd, struct args *args);
static int image_parse_file(struct ckpt_hdr *h, int fd, struct args *args);
static int image_parse_objref(struct ckpt_hdr *h, int fd, struct args *args);
static int image_parse_error(struct ckpt_hdr *h, int fd, struct args *args);
+static void show_tasks(struct ckpt_hdr *h, int numpids);
#ifdef __i386__
#define __HAVE_image_parse_cpu
@@ -85,10 +88,11 @@ static void parse_args(struct args *args, int argc, char *argv[])
{ "help", no_argument, NULL, 'h' },
{ "error", no_argument, NULL, 'e' },
{ "verbose", no_argument, NULL, 'v' },
+ { "pids", no_argument, NULL, 'p' },
{ "show-arch-regs", no_argument, NULL, 1 },
{ NULL, 0, NULL, 0 }
};
- static char optc[] = "hve";
+ static char optc[] = "hvep";
while (1) {
int c = getopt_long(argc, argv, optc, opts, NULL);
@@ -99,6 +103,9 @@ static void parse_args(struct args *args, int argc, char *argv[])
exit(1);
case 'h':
usage(usage_str);
+ case 'p':
+ args->show_process_tree = 1;
+ break;
case 'e':
args->error = 1;
break;
@@ -208,6 +215,7 @@ static int image_parse(int fd, struct args *args)
{
struct ckpt_hdr *h;
int ret;
+ int numpids, next_read_pids = 0;
do {
ret = image_read_obj(fd, &h);
@@ -215,6 +223,11 @@ static int image_parse(int fd, struct args *args)
break;
if (!h)
continue;
+ if (next_read_pids) {
+ next_read_pids = 0;
+ if (args->show_process_tree)
+ show_tasks(h, numpids);
+ }
switch (h->type) {
case CKPT_HDR_OBJREF:
ret = image_parse_objref(h, fd, args);
@@ -232,12 +245,33 @@ static int image_parse(int fd, struct args *args)
ret = image_parse_error(h, fd, args);
break;
}
+ if (h->type == CKPT_HDR_TREE) {
+ struct ckpt_hdr_tree *t = (struct ckpt_hdr_tree *) h;
+ numpids = t->nr_tasks;
+ next_read_pids = 1;
+ }
free(h);
} while (ret > 0);
return ret;
}
+struct ckpt_hdr_pids {
+ struct ckpt_hdr h;
+ struct ckpt_pids p;
+};
+
+static void show_tasks(struct ckpt_hdr *h, int numpids)
+{
+ struct ckpt_hdr_pids *pp = (struct ckpt_hdr_pids *)h;
+ struct ckpt_pids *p = &pp->p;
+ int i;
+
+ for (i=0; i<numpids; i++)
+ printf("Task %d: rpid %d pid %d vppid %d\n", i, p[i].rpid,
+ p[i].vpid, p[i].vppid);
+}
+
static int image_parse_objref(struct ckpt_hdr *h, int fd, struct args *args)
{
struct ckpt_hdr_objref *hh = (struct ckpt_hdr_objref *) h;
diff --git a/include/linux/checkpoint_hdr.h b/include/linux/checkpoint_hdr.h
index e8eaf23..9c6bc6d 100644
--- a/include/linux/checkpoint_hdr.h
+++ b/include/linux/checkpoint_hdr.h
@@ -321,6 +321,7 @@ struct ckpt_hdr_tree {
} __attribute__((aligned(8)));
struct ckpt_pids {
+ __s32 rpid;
__s32 vpid;
__s32 vppid;
__s32 vtgid;
--
1.6.0.6
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list