I added a '-p' flag to ckptinfo based on this patch (will push
to repository later).

Thanks,

Oren.


On 03/09/2010 04:05 PM, Serge E. Hallyn wrote:
> 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 <[email protected]>
> ---
>  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;
_______________________________________________
Containers mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
[email protected]
https://openvz.org/mailman/listinfo/devel

Reply via email to