Hi Atsushi, Since both of our test machines where this bug was reproduced are reserved, I haven't tested this patch. But after several times of the code flow of elf dump, finally this only this suspect is found. Could you also help check this? Also below change is OK too, and its meaning is more obvious. But my previous patch is more readable for code. int calculate_cyclic_buffer_size(void) { unsigned long long free_size, needed_size; if (info->max_mapnr <= 0) { ERRMSG("Invalid max_mapnr(%llu).\n", info->max_mapnr); return FALSE; } /* * free_size will be used to allocate 1st and 2nd bitmap, so it * should be 40% of free memory to keep the size of cyclic * buffer * within 80% of free memory. */ if (info->flag_elf_dumpfile) { free_size = get_free_memory_size() * 0.4 * 2; needed_size = (info->max_mapnr * 2) / BITPERBYTE; } else { free_size = get_free_memory_size() * 0.8; needed_size = info->max_mapnr / BITPERBYTE; } /* if --split was specified cyclic buffer allocated per dump * file */ if (info->num_dumpfile > 1) needed_size /= info->num_dumpfile; info->bufsize_cyclic = (free_size <= needed_size) ? free_size/2 : needed_size/2; return TRUE; } Thanks Baoquan On 04/14/14 at 04:02pm, Baoquan He wrote: > In case elf dump, the code to calculate the cyclic buffer size is > not correct. Since elf need bitmap1/2, so the needed memory for > bufsize_cyclic need be double. Hence free size should be 40% of > free memory, however the needed_size which free_size is compared > with should be info->max_mapnr / BITPERBYTE, but not 2 times of it. > > Because of this, in case of free memory in 2nd kernel is not too much, > OOM will happen very often. > > Signed-off-by: Baoquan He <bhe at redhat.com> > --- > makedumpfile.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/makedumpfile.c b/makedumpfile.c > index 75092a8..01ec516 100644 > --- a/makedumpfile.c > +++ b/makedumpfile.c > @@ -9010,7 +9010,7 @@ calculate_cyclic_buffer_size(void) { > */ > if (info->flag_elf_dumpfile) { > free_size = get_free_memory_size() * 0.4; > - needed_size = (info->max_mapnr * 2) / BITPERBYTE; > + needed_size = info->max_mapnr / BITPERBYTE; > } else { > free_size = get_free_memory_size() * 0.8; > needed_size = info->max_mapnr / BITPERBYTE; > -- > 1.8.5.3 > > > _______________________________________________ > kexec mailing list > kexec at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec