[PATCH v2 2/2] powerpc/fadump: merge adjacent memory ranges to reduce PT_LOAD segements

Hari Bathini hbathini at linux.vnet.ibm.com
Wed Aug 8 19:35:42 AEST 2018



On Wednesday 08 August 2018 02:38 PM, Mahesh Jagannath Salgaonkar wrote:
> On 08/07/2018 02:12 AM, Hari Bathini wrote:
>> With dynamic memory allocation support for crash memory ranges array,
>> there is no hard limit on the no. of crash memory ranges kernel could
>> export, but program headers count could overflow in the /proc/vmcore
>> ELF file while exporting each memory range as PT_LOAD segment. Reduce
>> the likelihood of a such scenario, by folding adjacent crash memory
>> ranges which minimizes the total number of PT_LOAD segments.
>>
>> Signed-off-by: Hari Bathini <hbathini at linux.ibm.com>
>> ---
>>   arch/powerpc/kernel/fadump.c |   45 ++++++++++++++++++++++++++++++++++--------
>>   1 file changed, 36 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c
>> index 2ec5704..cd0c555 100644
>> --- a/arch/powerpc/kernel/fadump.c
>> +++ b/arch/powerpc/kernel/fadump.c
>> @@ -908,22 +908,41 @@ static int allocate_crash_memory_ranges(void)
>>   static inline int fadump_add_crash_memory(unsigned long long base,
>>   					  unsigned long long end)
>>   {
>> +	u64  start, size;
>> +	bool is_adjacent = false;
>> +
>>   	if (base == end)
>>   		return 0;
>>   
>> -	if (crash_mem_ranges == max_crash_mem_ranges) {
>> -		int ret;
>> +	/*
>> +	 * Fold adjacent memory ranges to bring down the memory ranges/
>> +	 * PT_LOAD segments count.
>> +	 */
>> +	if (crash_mem_ranges) {
>> +		start = crash_memory_ranges[crash_mem_ranges-1].base;
>> +		size = crash_memory_ranges[crash_mem_ranges-1].size;
>>   
>> -		ret = allocate_crash_memory_ranges();
>> -		if (ret)
>> -			return ret;
>> +		if ((start + size) == base)
>> +			is_adjacent = true;
>> +	}
>> +	if (!is_adjacent) {
>> +		/* resize the array on reaching the limit */
>> +		if (crash_mem_ranges == max_crash_mem_ranges) {
>> +			int ret;
>> +
>> +			ret = allocate_crash_memory_ranges();
>> +			if (ret)
>> +				return ret;
>> +		}
>> +
>> +		start = base;
>> +		crash_memory_ranges[crash_mem_ranges].base = start;
>> +		crash_mem_ranges++;
>>   	}
>>   
>> +	crash_memory_ranges[crash_mem_ranges-1].size = (end - start);
>>   	pr_debug("crash_memory_range[%d] [%#016llx-%#016llx], %#llx bytes\n",
>> -		crash_mem_ranges, base, end - 1, (end - base));
>> -	crash_memory_ranges[crash_mem_ranges].base = base;
>> -	crash_memory_ranges[crash_mem_ranges].size = end - base;
>> -	crash_mem_ranges++;
>> +		(crash_mem_ranges - 1), start, end - 1, (end - start));
>>   	return 0;
>>   }
>>   
>> @@ -999,6 +1018,14 @@ static int fadump_setup_crash_memory_ranges(void)
>>   
>>   	pr_debug("Setup crash memory ranges.\n");
>>   	crash_mem_ranges = 0;
>> +
>> +	/* allocate memory for crash memory ranges for the first time */
>> +	if (!max_crash_mem_ranges) {
>> +		ret = allocate_crash_memory_ranges();
>> +		if (ret)
>> +			return ret;
>> +	}
>> +
> I see that the check for (!is_adjacent) in first hunk already handles
> the first time allocation. Do we need this ?

Right. This hunk in fadump_setup_crash_memory_ranges() is unnecessary. 
Can be dropped.
Also, I missed out on adding "#include <linux/slab.h>". Though it 
compiles fine with
upstream kernel, will add and post v3 just to be safe..

> Rest looks fine to me.
>
> Reviewed-by: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>

Thanks for the review

- Hari



More information about the Linuxppc-dev mailing list