Forgot updating the git log with v4 change.

Have posted new one, please review v5.

On 08/25/14 at 11:33am, Baoquan He wrote:
> Recently people complained that they don't know how to decide how
> much disk size need be reserved for kdump. E.g there are lots of
> machines with different memory size, if the memory usage information
> of current system can be shown, that can help them to make an estimate
> how much storage space need be reserved.
> 
> In this patch, a new interface is added into makedumpfile. By the
> help of this, people can know the page number of memory in different
> use. The implementation is analyzing the "System Ram" and "kernel text"
> program segment of /proc/kcore excluding the crashkernel range, then
> calculating the page number of different kind per vmcoreinfo.
> 
> The print is like below:
> ->$ ./makedumpfile  --mem-usage  /proc/kcore
> Excluding unnecessary pages        : [100.0 %] |
> 
> Page number of memory in different use
> --------------------------------------------------
> TYPE          PAGES                   EXCLUDABLE      DESCRIPTION
> ZERO          0                       yes             Pages filled with zero
> CACHE         562006                  yes             Cache pages
> CACHE_PRIVATE 353502                  yes             Cache pages + private
> USER          225780                  yes             User process pages
> FREE          2761884                 yes             Free pages
> KERN_DATA     235873                  no              Dumpable kernel data
> 
> Total pages on system:        4139045
> 
> Signed-off-by: Baoquan He <[email protected]>
> ---
>  makedumpfile.8 | 17 +++++++++++++
>  makedumpfile.c | 76 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  makedumpfile.h |  2 ++
>  print_info.c   |  8 +++++++
>  4 files changed, 103 insertions(+)
> 
> diff --git a/makedumpfile.8 b/makedumpfile.8
> index 25fe74e..64abbc7 100644
> --- a/makedumpfile.8
> +++ b/makedumpfile.8
> @@ -532,6 +532,23 @@ it is necessary to specfiy [\-x \fIVMLINUX\fR] or [\-i 
> \fIVMCOREINFO\fR].
>  # makedumpfile \-\-dump-dmesg -x vmlinux /proc/vmcore dmesgfile
>  .br
>  
> +
> +.TP
> +\fB\-\-mem-usage\fR
> +This option is used to show the page numbers of current system in different
> +use. It should be executed in 1st kernel. By the help of this, user can know
> +how many pages is dumpable when different dump_level is specified. It 
> analyzes
> +the 'System Ram' and 'kernel text' program segment of /proc/kcore excluding
> +the crashkernel range, then calculates the page number of different kind per
> +vmcoreinfo. So currently /proc/kcore need be specified explicitly.
> +
> +.br
> +.B Example:
> +.br
> +# makedumpfile \-\-mem-usage /proc/kcore
> +.br
> +
> +
>  .TP
>  \fB\-\-diskset=VMCORE\fR
>  Specify multiple \fIVMCORE\fRs created on sadump diskset configuration
> diff --git a/makedumpfile.c b/makedumpfile.c
> index c8d1299..87cca71 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -7955,6 +7955,7 @@ print_mem_usage(void)
>       shrinking = shrinking / pfn_original;
>  
>       MSG("\n");
> +     MSG("\n");
>       MSG("Page number of memory in different use\n");
>       MSG("--------------------------------------------------\n");
>       MSG("TYPE               PAGES                   EXCLUDABLE      
> DESCRIPTION\n");
> @@ -9008,6 +9009,13 @@ check_param_for_creating_dumpfile(int argc, char 
> *argv[])
>                */
>               info->name_memory   = argv[optind];
>  
> +     } else if ((argc == optind + 1) && info->flag_mem_usage) {
> +             /*
> +             * Parameter for showing the page number of memory
> +             * in different use from.
> +             */
> +             info->name_memory   = argv[optind];
> +
>       } else
>               return FALSE;
>  
> @@ -9252,6 +9260,58 @@ static int get_sys_kernel_vmcoreinfo(uint64_t *addr, 
> uint64_t *len)
>       return TRUE;
>  }
>  
> +int show_mem_usage(void)
> +{
> +        uint64_t vmcoreinfo_addr, vmcoreinfo_len;
> +
> +        if (!is_crashkernel_mem_reserved()) {
> +                ERRMSG("No memory is reserved for crashkenrel!\n");
> +                return FALSE;
> +        }
> +
> +
> +        if (!info->flag_cyclic)
> +                info->flag_cyclic = TRUE;
> +
> +     info->dump_level = MAX_DUMP_LEVEL;
> +
> +        if (!get_page_offset())
> +                return FALSE;
> +
> +        if (!open_dump_memory())
> +                return FALSE;
> +
> +        if (!get_elf_loads(info->fd_memory, info->name_memory))
> +                return FALSE;
> +
> +        if (!get_sys_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len))
> +                return FALSE;
> +
> +        if (!set_kcore_vmcoreinfo(vmcoreinfo_addr, vmcoreinfo_len))
> +                return FALSE;
> +
> +        if (!get_kcore_dump_loads())
> +                return FALSE;
> +
> +        if (!initial())
> +                return FALSE;
> +
> +
> +        if (!prepare_bitmap2_buffer_cyclic())
> +                return FALSE;
> +
> +        info->num_dumpable = get_num_dumpable_cyclic();
> +
> +     free_bitmap2_buffer_cyclic();
> +
> +        print_mem_usage();
> +
> +        if (!close_files_for_creating_dumpfile())
> +                return FALSE;
> +
> +        return TRUE;
> +}
> +
>  
>  static struct option longopts[] = {
>       {"split", no_argument, NULL, OPT_SPLIT},
> @@ -9269,6 +9329,7 @@ static struct option longopts[] = {
>       {"cyclic-buffer", required_argument, NULL, OPT_CYCLIC_BUFFER},
>       {"eppic", required_argument, NULL, OPT_EPPIC},
>       {"non-mmap", no_argument, NULL, OPT_NON_MMAP},
> +     {"mem-usage", no_argument, NULL, OPT_MEM_USAGE},
>       {0, 0, 0, 0}
>  };
>  
> @@ -9360,6 +9421,9 @@ main(int argc, char *argv[])
>               case OPT_DUMP_DMESG:
>                       info->flag_dmesg = 1;
>                       break;
> +             case OPT_MEM_USAGE:
> +                       info->flag_mem_usage = 1;
> +                       break;
>               case OPT_COMPRESS_SNAPPY:
>                       info->flag_compress = DUMP_DH_COMPRESSED_SNAPPY;
>                       break;
> @@ -9500,6 +9564,18 @@ main(int argc, char *argv[])
>  
>               MSG("\n");
>               MSG("The dmesg log is saved to %s.\n", info->name_dumpfile);
> +     } else if (info->flag_mem_usage) {
> +             if (!check_param_for_creating_dumpfile(argc, argv)) {
> +                     MSG("Commandline parameter is invalid.\n");
> +                     MSG("Try `makedumpfile --help' for more 
> information.\n");
> +                     goto out;
> +             }
> +
> +             if (!show_mem_usage())
> +                     goto out;
> +
> +             MSG("\n");
> +             MSG("Showing page number of memory in different use 
> successfully.\n");
>       } else {
>               if (!check_param_for_creating_dumpfile(argc, argv)) {
>                       MSG("Commandline parameter is invalid.\n");
> diff --git a/makedumpfile.h b/makedumpfile.h
> index e83bd95..6ee4cae 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -978,6 +978,7 @@ struct DumpInfo {
>       int             flag_force;          /* overwrite existing stuff */
>       int             flag_exclude_xen_dom;/* exclude Domain-U from xen-kdump 
> */
>       int             flag_dmesg;          /* dump the dmesg log out of the 
> vmcore file */
> +     int             flag_mem_usage;  /*show the page number of memory in 
> different use*/
>       int             flag_use_printk_log; /* did we read printk_log symbol 
> name? */
>       int             flag_nospace;        /* the flag of "No space on 
> device" error */
>       int             flag_vmemmap;        /* kernel supports vmemmap address 
> space */
> @@ -1867,6 +1868,7 @@ struct elf_prstatus {
>  #define OPT_CYCLIC_BUFFER       OPT_START+11
>  #define OPT_EPPIC               OPT_START+12
>  #define OPT_NON_MMAP            OPT_START+13
> +#define OPT_MEM_USAGE            OPT_START+14
>  
>  /*
>   * Function Prototype.
> diff --git a/print_info.c b/print_info.c
> index 7592690..29db918 100644
> --- a/print_info.c
> +++ b/print_info.c
> @@ -264,6 +264,14 @@ print_usage(void)
>       MSG("      LOGFILE. If a VMCORE does not contain VMCOREINFO for dmesg, 
> it is\n");
>       MSG("      necessary to specfiy [-x VMLINUX] or [-i VMCOREINFO].\n");
>       MSG("\n");
> +     MSG("  [--mem-usage]:\n");
> +     MSG("      This option is used to show the page numbers of current 
> system in different\n");
> +     MSG("      use. It should be executed in 1st kernel. By the help of 
> this, user can know\n");
> +     MSG("      how many pages is dumpable when different dump_level is 
> specified. It analyzes\n");
> +     MSG("      the 'System Ram' and 'kernel text' program segment of 
> /proc/kcore excluding\n");
> +     MSG("      the crashkernel range, then calculates the page number of 
> different kind per\n");
> +     MSG("      vmcoreinfo. So currently /proc/kcore need be specified 
> explicitly.\n");
> +     MSG("\n");
>       MSG("  [-D]:\n");
>       MSG("      Print debugging message.\n");
>       MSG("\n");
> -- 
> 1.8.5.3
> 

_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to