[PATCH] makedumpfile: Fix wrong statistics in ELF format mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The -E option, which creates a dumpfile in ELF format, reports wrong
statistics like the ones below, because:
 (1) counts excluded pages repeatedly due to overlapped cycles
 (2) does not calculate the number of memory hole pages in cyclic mode
 (3) does not take account of the number of pages excluded actually
     in ELF format, which excludes only contiguous 256 or more pages
     that can be excluded.

  Original pages  : 0x0000000000000000
    Excluded pages   : 0x00000000007daf05
      Pages filled with zero  : 0x0000000000002dcc
      Non-private cache pages : 0x00000000000471d6
      Private cache pages     : 0x0000000000000001
      User process data pages : 0x00000000000147f1
      Free pages              : 0x000000000077c771
      Hwpoison pages          : 0x0000000000000000
      Offline pages           : 0x0000000000000000
    Remaining pages  : 0xffffffffff8250fb
  Memory Hole     : 0x0000000000440000
  --------------------------------------------------
  Total pages     : 0x0000000000440000

In order to fix this issue:
 (1) start the first cycle from the start pfn of a segment to avoid
     overlaps between cycles
 (2) calculate the number of memory hole pages in cyclic mode
 (3) introduce pfn_elf_excluded variable to store the actual number
     of the excluded pages in ELF format

With the patch, a report message in ELF format mode becomes like this:

  Original pages  : 0x00000000003f1538
    Excluded pages   : 0x00000000003c8c9d
       in ELF format : 0x00000000003c4319
      Pages filled with zero  : 0x00000000000026d8
      Non-private cache pages : 0x0000000000047032
      Private cache pages     : 0x0000000000000001
      User process data pages : 0x0000000000014794
      Free pages              : 0x000000000036adfe
      Hwpoison pages          : 0x0000000000000000
      Offline pages           : 0x0000000000000000
    Remaining pages  : 0x000000000002889b
       in ELF format : 0x000000000002d21f
    (The number of pages is reduced to 4%.)
  Memory Hole     : 0x000000000004eac8
  --------------------------------------------------
  Total pages     : 0x0000000000440000

where the "Excluded pages" and "Remaining pages" do not mean the
actual numbers of excluded and remaining pages.  But remain the
same for some reference.

Signed-off-by: Kazuhito Hagio <k-hagio@xxxxxxxxxxxxx>
---
 makedumpfile.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index 4a000112ba59..9569251ce0c7 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -56,6 +56,9 @@ static void first_cycle(mdf_pfn_t start, mdf_pfn_t max, struct cycle *cycle)
 	if (cycle->end_pfn > max)
 		cycle->end_pfn = max;
 
+	if (info->flag_elf_dumpfile && cycle->start_pfn < start)
+		cycle->start_pfn = start;
+
 	cycle->exclude_pfn_start = 0;
 	cycle->exclude_pfn_end = 0;
 }
@@ -89,6 +92,7 @@ mdf_pfn_t pfn_user;
 mdf_pfn_t pfn_free;
 mdf_pfn_t pfn_hwpoison;
 mdf_pfn_t pfn_offline;
+mdf_pfn_t pfn_elf_excluded;
 
 mdf_pfn_t num_dumped;
 
@@ -7499,7 +7503,7 @@ get_loads_dumpfile_cyclic(void)
 				if (!create_2nd_bitmap(&cycle))
 					return FALSE;
 			}
-			for (pfn = MAX(pfn_start, cycle.start_pfn); pfn < cycle.end_pfn; pfn++) {
+			for (pfn = cycle.start_pfn; pfn < cycle.end_pfn; pfn++) {
 				if (!is_dumpable(info->bitmap2, pfn, &cycle)) {
 					num_excluded++;
 					continue;
@@ -7594,7 +7598,10 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
 					return FALSE;
 			}
 
-			for (pfn = MAX(pfn_start, cycle.start_pfn); pfn < cycle.end_pfn; pfn++) {
+			for (pfn = cycle.start_pfn; pfn < cycle.end_pfn; pfn++) {
+				if (info->flag_cyclic)
+					pfn_memhole--;
+
 				if (!is_dumpable(info->bitmap2, pfn, &cycle)) {
 					num_excluded++;
 					if ((pfn == pfn_end - 1) && frac_tail)
@@ -7639,6 +7646,9 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
 					continue;
 				}
 
+				/* The number of pages excluded actually in ELF format */
+				pfn_elf_excluded += num_excluded;
+
 				/*
 				 * If the number of the contiguous pages to be excluded
 				 * is 256 or more, those pages are excluded really.
@@ -7691,6 +7701,9 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
 			}
 		}
 
+		/* The number of pages excluded actually in ELF format */
+		pfn_elf_excluded += num_excluded;
+
 		/*
 		 * Write the last PT_LOAD.
 		 */
@@ -9777,6 +9790,9 @@ print_report(void)
 	REPORT_MSG("\n");
 	REPORT_MSG("Original pages  : 0x%016llx\n", pfn_original);
 	REPORT_MSG("  Excluded pages   : 0x%016llx\n", pfn_excluded);
+	if (info->flag_elf_dumpfile)
+		REPORT_MSG("     in ELF format : 0x%016llx\n",
+			pfn_elf_excluded);
 	REPORT_MSG("    Pages filled with zero  : 0x%016llx\n", pfn_zero);
 	REPORT_MSG("    Non-private cache pages : 0x%016llx\n", pfn_cache);
 	REPORT_MSG("    Private cache pages     : 0x%016llx\n",
@@ -9788,6 +9804,13 @@ print_report(void)
 	REPORT_MSG("  Remaining pages  : 0x%016llx\n",
 	    pfn_original - pfn_excluded);
 
+	if (info->flag_elf_dumpfile) {
+		REPORT_MSG("     in ELF format : 0x%016llx\n",
+			pfn_original - pfn_elf_excluded);
+
+		pfn_excluded = pfn_elf_excluded;
+	}
+
 	if (pfn_original != 0) {
 		shrinking = (pfn_original - pfn_excluded) * 100;
 		shrinking = shrinking / pfn_original;
-- 
2.18.1



_______________________________________________
kexec mailing list
kexec@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/kexec



[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux