[PATCH 2/3] makedumpfile: use struct cycle to update cyclic region and clean up
Baoquan He
bhe at redhat.com
Wed Jan 22 19:47:05 EST 2014
> @@ -5929,6 +5897,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
> off_t off_seg_load, off_memory;
> Elf64_Phdr load;
> struct timeval tv_start;
> + struct cycle cycle = {0};
>
> if (!info->flag_elf_dumpfile)
> return FALSE;
> @@ -5946,11 +5915,6 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
> pfn_user = pfn_free = pfn_hwpoison = 0;
> pfn_memhole = info->max_mapnr;
>
> - info->cyclic_start_pfn = 0;
> - info->cyclic_end_pfn = 0;
> - if (!update_cyclic_region(0))
> - return FALSE;
> -
> if (!(phnum = get_phnum_memory()))
> return FALSE;
>
> @@ -5982,30 +5946,17 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
> if (frac_tail)
> pfn_end++;
>
> - for (pfn = pfn_start; pfn < pfn_end; pfn++) {
> + for_each_cycle(pfn_start, pfn_end, &cycle) {
> /*
> * Update target region and partial bitmap if necessary.
> */
> - if (!update_cyclic_region(pfn))
> + if (!create_1st_bitmap_cyclic(&cycle))
> + return FALSE;
> + if (!exclude_unnecessary_pages_cyclic(&cycle))
> return FALSE;
If in first_cycle(), the cycle->start_pfn is changed to
cycle->start_pfn = round(start, info->pfn_cyclic);
Here the cycle.start_pfn need be reassigned, otherwise some paddr may be
out of load segment.
cycle.start_pfn = MAX(pfn_start, cycle.start_pfn);
>
> - if (!is_dumpable_cyclic(info->partial_bitmap2, pfn)) {
> - num_excluded++;
> - if ((pfn == pfn_end - 1) && frac_tail)
> - memsz += frac_tail;
> - else
> - memsz += page_size;
> - continue;
> - }
> -
> - /*
> - * Exclude zero pages.
> - */
> - if (info->dump_level & DL_EXCLUDE_ZERO) {
> - if (!read_pfn(pfn, buf))
> - return FALSE;
> - if (is_zero_page(buf, page_size)) {
> - pfn_zero++;
> + for (pfn = cycle.start_pfn; pfn < cycle.end_pfn; pfn++) {
> + if (!is_dumpable_cyclic(info->partial_bitmap2, pfn, &cycle)) {
> num_excluded++;
> if ((pfn == pfn_end - 1) && frac_tail)
> memsz += frac_tail;
More information about the kexec
mailing list