[PATCH] makedumpfile: change the wrong code to calculate bufsize_cyclic for elf dump

Atsushi Kumagai kumagai-atsushi at mxc.nes.nec.co.jp
Wed Apr 16 21:01:01 PDT 2014


Hello Baoquan,

>Hi Atsushi,
>
>I have got the test machine where bug reported and did a test. The
>changed code can make elf dump successful.

Great, thanks for your help!
However, I still have questions.

First, what is the difference between yours and mine?

http://lists.infradead.org/pipermail/kexec/2014-April/011535.html

My patch includes renaming some values, but the purpose looks
the same as yours.
Further, you described as below, 

>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.

but I still don't think this bug causes OOM.
Even if needed_size is calculated as so much size wrongly, bufsize_cyclic
will not exceed 40% of free memory by the check below:

    info->bufsize_cyclic = (free_size <= needed_size) ? free_size : needed_size;

So it looks that bitmap1(40%) and bitmap2(40%) will fit in 80% of free
memory in any case.

I may misunderstand something since your patch has an effect on this
issue in practice, could you correct me?


Thanks
Atsushi Kumagai

>> 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