[PATCH 12/16] [PATCH v3 12/12] Add --cyclic-buffer option to specify buffer size for cyclic mode.

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Thu Aug 30 03:56:47 EDT 2012


>From 885f063af4b3884be254506bb4b4d6c22eefe6d1 Mon Sep 17 00:00:00 2001
From: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>
Date: Fri, 24 Aug 2012 10:22:24 +0900
Subject: [PATCH 12/16] [PATCH v3 12/12] Add --cyclic-buffer option to specify buffer size for cyclic mode.

Introduce --cyclic-buffer option to specify buffer size for cyclic mode.
This option requires a integer as buffer size in kilo bytes.

  Usage:
      # makedumpfile --cyclic-buffer 1024 /proc/vmcore dumpfile

Signed-off-by: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>
---
 makedumpfile.8 |   16 ++++++++++++++++
 makedumpfile.c |   41 ++++++++++++++++++++++++++++++++++-------
 makedumpfile.h |    5 +++--
 print_info.c   |   11 +++++++++++
 4 files changed, 64 insertions(+), 9 deletions(-)

diff --git a/makedumpfile.8 b/makedumpfile.8
index 7535a60..95bf3e8 100644
--- a/makedumpfile.8
+++ b/makedumpfile.8
@@ -347,6 +347,22 @@ on the following example.
 # makedumpfile \-\-reassemble dumpfile1 dumpfile2 dumpfile
 
 .TP
+\fB\-\-cyclic\-buffer\fR \fIbuffer_size\fR
+Specify the buffer size in kilo bytes for analysis in cyclic mode.
+Actually, the double of \fIbuffer_size\fR kilo bytes will be allocated in memory.
+In cyclic mode, the number of cycles is represented as:
+
+    num_of_cycles = system_memory / (\fIbuffer_size\fR * 1024 * bit_per_bytes * page_size )
+
+The lesser number of cycles, the faster working speed is expected.
+Default \fIbuffer_size\fR is 1024.
+
+.br
+.B Example:
+.br
+# makedumpfile \-\-cyclic\-buffer 1024 \-d 31 \-x vmlinux /proc/vmcore dumpfile
+
+.TP
 \fB\-\-non\-cyclic\fR
 Running in non-cyclic mode, this mode uses old filtering logic same as v1.4.4 or before.
 If you feel cyclic mode is too slow, please try this mode.
diff --git a/makedumpfile.c b/makedumpfile.c
index 879f73a..208087e 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -2541,6 +2541,29 @@ initial(void)
 	}
 #endif
 
+	if (info->flag_cyclic) {
+		/*
+		 * buffer size is specified as Kbyte
+		 */
+		if (info->bufsize_cyclic == 0)
+			info->bufsize_cyclic = DEFAULT_BUFSIZE_CYCLIC;
+		else
+			info->bufsize_cyclic <<= 10;
+	
+		/*
+		 * Max buffer size is 100 MB
+		 */
+		if (info->bufsize_cyclic > (100 << 20)) {
+			MSG("Specified buffer size is too large, ");
+			MSG("The buffer size for cyclic mode will be truncated to 100 MB.\n");
+			info->bufsize_cyclic = (100 << 20);
+		}
+		info->pfn_cyclic = info->bufsize_cyclic * BITPERBYTE;
+
+		DEBUG_MSG("\n");
+		DEBUG_MSG("Buffer size for cyclic mode: %ld\n", info->bufsize_cyclic);
+	}
+
 	if (!is_xen_memory() && info->flag_exclude_xen_dom) {
 		MSG("'-X' option is disable,");
 		MSG("because %s is not Xen's memory core image.\n", info->name_memory);
@@ -2726,7 +2749,7 @@ initialize_bitmap(struct dump_bitmap *bitmap)
 void
 initialize_bitmap_cyclic(char *bitmap)
 {
-	memset(bitmap, 0, BUFSIZE_CYCLIC);
+	memset(bitmap, 0, info->bufsize_cyclic);
 }
 
 void
@@ -3859,7 +3882,7 @@ exclude_unnecessary_pages(void)
 void
 copy_bitmap_cyclic(void)
 {
-	memcpy(info->partial_bitmap2, info->partial_bitmap1, BUFSIZE_CYCLIC);
+	memcpy(info->partial_bitmap2, info->partial_bitmap1, info->bufsize_cyclic);
 }
 
 int
@@ -3907,8 +3930,8 @@ update_cyclic_region(unsigned long long pfn)
 	if (is_cyclic_region(pfn))
 		return TRUE;
 
-	info->cyclic_start_pfn = round(pfn, PFN_CYCLIC);
-	info->cyclic_end_pfn = info->cyclic_start_pfn + PFN_CYCLIC;
+	info->cyclic_start_pfn = round(pfn, info->pfn_cyclic);
+	info->cyclic_end_pfn = info->cyclic_start_pfn + info->pfn_cyclic;
 
 	if (info->cyclic_end_pfn > info->max_mapnr)
 		info->cyclic_end_pfn = info->max_mapnr;
@@ -4079,12 +4102,12 @@ prepare_bitmap_buffer_cyclic(void)
 	/*
 	 * Prepare partial bitmap buffers for cyclic processing.
 	 */
-	if ((info->partial_bitmap1 = (char *)malloc(BUFSIZE_CYCLIC)) == NULL) {
+	if ((info->partial_bitmap1 = (char *)malloc(info->bufsize_cyclic)) == NULL) {
 		ERRMSG("Can't allocate memory for the 1st-bitmap. %s\n",
 		       strerror(errno));
 		return FALSE;
 	}
-	if ((info->partial_bitmap2 = (char *)malloc(BUFSIZE_CYCLIC)) == NULL) {
+	if ((info->partial_bitmap2 = (char *)malloc(info->bufsize_cyclic)) == NULL) {
 		ERRMSG("Can't allocate memory for the 2nd-bitmap. %s\n",
 		       strerror(errno));
 		return FALSE;
@@ -4919,7 +4942,7 @@ get_loads_dumpfile_cyclic(void)
 	 * Initialize target reggion and bitmap.
 	 */
 	info->cyclic_start_pfn = 0;
-	info->cyclic_end_pfn = PFN_CYCLIC;
+	info->cyclic_end_pfn = info->pfn_cyclic;
 	if (!create_1st_bitmap_cyclic())
 		return FALSE;
 	if (!exclude_unnecessary_pages_cyclic())
@@ -7731,6 +7754,7 @@ static struct option longopts[] = {
 	{"help", no_argument, NULL, 'h'},
 	{"diskset", required_argument, NULL, 'k'},
 	{"non-cyclic", no_argument, NULL, 'Y'},
+	{"cyclic-buffer", required_argument, NULL, 'Z'},
 	{0, 0, 0, 0}
 };
 
@@ -7851,6 +7875,9 @@ main(int argc, char *argv[])
 			info->flag_read_vmcoreinfo = 1;
 			info->name_vmcoreinfo = optarg;
 			break;
+		case 'Z':
+			info->bufsize_cyclic = atoi(optarg);
+			break;
 		case '?':
 			MSG("Commandline parameter is invalid.\n");
 			MSG("Try `makedumpfile --help' for more information.\n");
diff --git a/makedumpfile.h b/makedumpfile.h
index 77b824e..4d6cbbb 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -175,8 +175,7 @@ isAnon(unsigned long mapping)
 /*
  * For cyclic processing
  */
-#define BUFSIZE_CYCLIC         (1024 * 1024)
-#define PFN_CYCLIC             (BUFSIZE_CYCLIC * BITPERBYTE)
+#define DEFAULT_BUFSIZE_CYCLIC         (1024 * 1024)
 
 /*
  * Minimam vmcore has 2 ProgramHeaderTables(PT_NOTE and PT_LOAD).
@@ -939,6 +938,8 @@ struct DumpInfo {
 	unsigned long long cyclic_start_pfn;
 	unsigned long long cyclic_end_pfn;  
 	unsigned long long num_dumpable;
+	unsigned long      bufsize_cyclic;
+	unsigned long      pfn_cyclic;
 
 	/*
 	 * sadump info:
diff --git a/print_info.c b/print_info.c
index 14eec8e..4da9a78 100644
--- a/print_info.c
+++ b/print_info.c
@@ -162,6 +162,17 @@ print_usage(void)
 	MSG("      Reassemble multiple DUMPFILEs, which are created by --split option,\n");
 	MSG("      into one DUMPFILE. dumpfile1 and dumpfile2 are reassembled into dumpfile.\n");
 	MSG("\n");
+	MSG("  [--cyclic-buffer BUFFER_SIZE]:\n");
+	MSG("      Specify the buffer size in kilo bytes for analysis in cyclic mode.\n");
+	MSG("      Actually, the double of BUFFER_SIZE kilo bytes will be allocated in memory.\n");
+	MSG("      In cyclic mode, the number of cycles is represented as:\n");
+	MSG("\n");
+	MSG("          num_of_cycles = system_memory / \n");
+	MSG("                          (BUFFER_SIZE * 1024 * bit_per_bytes * page_size)\n");
+	MSG("\n");
+	MSG("      The lesser number of cycles, the faster working speed is expected.\n");
+	MSG("      Default BUFFER_SIZE is 1024.\n");
+	MSG("\n");
 	MSG("  [--non-cyclic]:\n");
 	MSG("      Running in non-cyclic mode, this mode uses old filtering logic same as\n");
 	MSG("      v1.4.4 or before.\n");
-- 
1.7.9.2



More information about the kexec mailing list