On Sat, 09 Mar 2013 15:08:05 +0900 (JST) HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com> wrote: > > But, anyway, I created the branch "mmap": > > > > http://makedumpfile.git.sourceforge.net/git/gitweb.cgi?p=makedumpfile/makedumpfile;a=shortlog;h=refs/heads/mmap > > > > Please use it for benchmark. > > Thanks! It's very helpful. > > Also, I tested a little the mmap branch code and found a small bug > that max file offset used in calculating mmap()'s position is > wrong. Please see the next patch. > > # But sorry, I made this quickly so I didn't consider design enough. Thanks, that's enough for now. I've pushed this into the mmap branch. Atsushi Kumagai > From 77ef0e836bba4713bfb578949d2785962179d630 Mon Sep 17 00:00:00 2001 > From: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com> > Date: Sat, 9 Mar 2013 13:49:43 +0900 > Subject: [PATCH] makedumpfile: fix max offset relative to file > > To see file offset of each memory chunk, it's correct to read p_offset > in the corresponing PT_LOAD entrie. > > On /proc/vmcore PT_LOAD entries are sorted on p_load values in > increasing order. So, it's sufficient to refer to the last PT_LOAD > entry only. But the code here doesn't assuming that, calculating > maximum one from all the PT_LOAD entries. > > Signed-off-by: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com> > --- > elf_info.c | 12 ++++++++++++ > elf_info.h | 2 ++ > makedumpfile.c | 2 +- > 3 files changed, 15 insertions(+), 1 deletion(-) > > diff --git a/elf_info.c b/elf_info.c > index 9bd8cd0..aa8cacb 100644 > --- a/elf_info.c > +++ b/elf_info.c > @@ -45,6 +45,7 @@ struct pt_load_segment { > }; > > static int nr_cpus; /* number of cpu */ > +static off_t max_file_offset; > > /* > * File information about /proc/vmcore: > @@ -637,6 +638,12 @@ get_elf_info(int fd, char *filename) > return FALSE; > j++; > } > + max_file_offset = 0; > + for (i = 0; i < num_pt_loads; ++i) { > + struct pt_load_segment *p = &pt_loads[i]; > + max_file_offset=MAX(max_file_offset, > + p->file_offset+p->phys_end-p->phys_start); > + } > if (!has_pt_note()) { > ERRMSG("Can't find PT_NOTE Phdr.\n"); > return FALSE; > @@ -869,3 +876,8 @@ set_eraseinfo(off_t offset, unsigned long size) > size_eraseinfo = size; > } > > +off_t > +get_max_file_offset(void) > +{ > + return max_file_offset; > +} > diff --git a/elf_info.h b/elf_info.h > index eb58023..61ab3c9 100644 > --- a/elf_info.h > +++ b/elf_info.h > @@ -71,6 +71,8 @@ int has_eraseinfo(void); > void get_eraseinfo(off_t *offset, unsigned long *size); > void set_eraseinfo(off_t offset, unsigned long size); > > +off_t get_max_file_offset(void); > + > #endif /* ELF_INFO_H */ > > > diff --git a/makedumpfile.c b/makedumpfile.c > index 3351158..7acbf72 100644 > --- a/makedumpfile.c > +++ b/makedumpfile.c > @@ -235,7 +235,7 @@ static int > update_mmap_range(off_t offset) { > off_t start_offset; > off_t map_size; > - off_t max_offset = info->max_mapnr * info->page_size; > + off_t max_offset = get_max_file_offset(); > > munmap(info->mmap_buf, > info->mmap_end_offset - info->mmap_start_offset); > -- > 1.8.1.4