> > +static void exclude_ram(struct memory_range *mr, int *nr_mr) > +{ > + int ranges, i, j, m; > + > + ranges = *nr_mr; > + for (i = 0, j = 0; i < ranges; i++) { > + if (mr[j].type == RANGE_RAM) { > + dbgprintf("Remove RAM %016llx-%016llxx: (%d)\n", mr[j].start, mr[j].end, mr[j].type); > + for (m = j; m < *nr_mr; m++) > + mr[m] = mr[m+1]; > + (*nr_mr)--; > + } else { > + j++; > + } > + } > + > + dbgprint_mem_range("After remove RAM", mr, *nr_mr); > +} This is probably not necessary, what I understand you are doing is below: get_crash_memory_ranges() -> collect all SYSTEM_RAM, ACPI, ACPI_NVS ranges, exclude crash reserved ranges. -> the system ram ranges are used to create elf header -> the ACPI, ACPI_NVS ranges are used by cmdline_add_memmap_acpi etc. memmap_p -> contains all the crash reserved ranges -> to be used by cmdline_add_memmap The several memory ranges are twisted and somehow the funcions are duplicate. So how about just keep one memory ranges array which contains all the ranges which include system_ram, acpi, acpi_nvs, crash_reserved range. In the crashdump-elf.c the function for creating elf headers will check the range type, it will just skip the range which is not ram. Ditto for other functions they can also just select what range type they need instead of creating these different arrays which is confusing. Thanks Dave