[PATCH] makedumpfile: change the wrong code to calculate bufsize_cyclic for elf dump
Baoquan He
bhe at redhat.com
Mon Apr 14 01:11:28 PDT 2014
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
More information about the kexec
mailing list