[PATCH 02/13] Add option to specify working directory for the bitmap.

Atsushi Kumagai ats-kumagai at wm.jp.nec.com
Sun May 10 23:22:45 PDT 2015


Introduce the new option "--work-dir" to specify the directory
used to store the bitmap. This is the alternative to the combination
of --non-cyclic and TMPDIR.

Signed-off-by: Atsushi Kumagai <ats-kumagai at wm.jp.nec.com>
---
 makedumpfile.8 | 13 +++++++++++++
 makedumpfile.c | 21 +++++++++++++++++++--
 makedumpfile.h |  2 ++
 print_info.c   |  7 +++++++
 4 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/makedumpfile.8 b/makedumpfile.8
index 9752671..b6055d8 100644
--- a/makedumpfile.8
+++ b/makedumpfile.8
@@ -421,6 +421,19 @@ If you feel the cyclic mode is too slow, please try this mode.
 # makedumpfile \-\-non\-cyclic \-d 31 \-x vmlinux /proc/vmcore dumpfile
 
 .TP
+\fB\-\-work\-dir\fR
+Specify the working directory for the temporary bitmap file.
+If this option isn't specified, the bitmap will be saved on memory.
+Filtering processing has to do 2 pass scanning to fix the memory consumption,
+but it can be avoided by using working directory on file system.
+So if you specify this option, the filtering speed may be bit faster.
+
+.br
+.B Example:
+.br
+# makedumpfile \-\-work\-dir /tmp \-d 31 \-x vmlinux /proc/vmcore dumpfile
+
+.TP
 \fB\-\-non\-mmap\fR
 Never use \fBmmap(2)\fR to read \fIVMCORE\fR even if it supports \fBmmap(2)\fR.
 Generally, reading \fIVMCORE\fR with \fBmmap(2)\fR is faster than without it,
diff --git a/makedumpfile.c b/makedumpfile.c
index 1192cfe..f0ec741 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1033,8 +1033,14 @@ open_dump_bitmap(void)
 	int i, fd;
 	char *tmpname;
 
+	/* Unnecessary to open */
+	if (!info->working_dir)
+		return TRUE;
+
 	tmpname = getenv("TMPDIR");
-	if (!tmpname)
+	if (info->working_dir)
+		tmpname = info->working_dir;
+	else if (!tmpname)
 		tmpname = "/tmp";
 
 	if ((info->name_bitmap = (char *)malloc(sizeof(FILENAME_BITMAP) +
@@ -3251,7 +3257,11 @@ out:
 	if (!get_max_mapnr())
 		return FALSE;
 
-	if (info->flag_cyclic) {
+	if (info->working_dir) {
+		/* Implemented as non-cyclic mode based on the file */
+		info->flag_cyclic = FALSE;
+		info->pfn_cyclic = info->max_mapnr;
+	} else {
 		if (info->bufsize_cyclic == 0) {
 			if (!calculate_cyclic_buffer_size())
 				return FALSE;
@@ -7489,6 +7499,9 @@ close_dump_file(void)
 void
 close_dump_bitmap(void)
 {
+	if (!info->working_dir)
+		return;
+
 	if ((info->fd_bitmap = close(info->fd_bitmap)) < 0)
 		ERRMSG("Can't close the bitmap file(%s). %s\n",
 		    info->name_bitmap, strerror(errno));
@@ -9832,6 +9845,7 @@ static struct option longopts[] = {
 	{"non-mmap", no_argument, NULL, OPT_NON_MMAP},
 	{"mem-usage", no_argument, NULL, OPT_MEM_USAGE},
 	{"splitblock-size", required_argument, NULL, OPT_SPLITBLOCK_SIZE},
+	{"work-dir", required_argument, NULL, OPT_WORKING_DIR},
 	{0, 0, 0, 0}
 };
 
@@ -9975,6 +9989,9 @@ main(int argc, char *argv[])
 		case OPT_SPLITBLOCK_SIZE:
 			info->splitblock_size = atoi(optarg);
 			break;
+		case OPT_WORKING_DIR:
+			info->working_dir = 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 4beac65..990c76f 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -1151,6 +1151,7 @@ struct DumpInfo {
 	 */
 	struct dump_bitmap *partial_bitmap1;
 	struct dump_bitmap *partial_bitmap2;
+	char	           *working_dir;	     /* working directory for bitmap */
 	mdf_pfn_t          num_dumpable;
 	unsigned long      bufsize_cyclic;
 	unsigned long      pfn_cyclic;
@@ -1897,6 +1898,7 @@ struct elf_prstatus {
 #define OPT_NON_MMAP            OPT_START+13
 #define OPT_MEM_USAGE            OPT_START+14
 #define OPT_SPLITBLOCK_SIZE	OPT_START+15
+#define OPT_WORKING_DIR         OPT_START+16
 
 /*
  * Function Prototype.
diff --git a/print_info.c b/print_info.c
index 9215e0f..6610e76 100644
--- a/print_info.c
+++ b/print_info.c
@@ -213,6 +213,13 @@ print_usage(void)
 	MSG("      same as v1.4.4 or before.\n");
 	MSG("      If you feel the cyclic mode is too slow, please try this mode.\n");
 	MSG("\n");
+	MSG("  [--work-dir]:\n");
+	MSG("      Specify the working directory for the temporary bitmap file.\n");
+	MSG("      If this option isn't specified, the bitmap will be saved on memory.\n");
+	MSG("      Filtering processing has to do 2 pass scanning to fix the memory consumption,\n");
+	MSG("      but it can be avoided by using working directory on file system.\n");
+	MSG("      So if you specify this option, the filtering speed may be bit faster.\n");
+	MSG("\n");
 	MSG("  [--non-mmap]:\n");
 	MSG("      Never use mmap(2) to read VMCORE even if it supports mmap(2).\n");
 	MSG("      Generally, reading VMCORE with mmap(2) is faster than without it,\n");
-- 
1.9.0



More information about the kexec mailing list