[PATCH 2/3] makedumpfile: Mark unstored ELF pages as filtered

Atsushi Kumagai ats-kumagai at wm.jp.nec.com
Mon Jun 6 21:18:48 PDT 2016


>>+static void
>>+exclude_nodata_pages(struct cycle *cycle)
>>+{
>>+	int i;
>>+	unsigned long long phys_start, phys_end;
>>+	off_t file_size;
>>+
>>+	i = 0;
>>+	while (get_pt_load_extents(i, &phys_start, &phys_end,
>>+				   NULL, &file_size)) {
>>+		unsigned long long pfn, pfn_end;
>>+
>>+		pfn = paddr_to_pfn(phys_start + file_size);
>>+		pfn_end = paddr_to_pfn(phys_end);
>
>Does this code exclude the first pfn of out of PT_LOAD even if there is
>no unstored pages ? pfn and pfn_end will point at the next pfn to the
>last pfn of PT_LOAD.
>This will be problem for the environments which have a overlapped PT_LOAD
>segment like ia64.
>
>>+		if (pfn < cycle->start_pfn)
>>+			pfn = cycle->start_pfn;
>>+		if (pfn_end >= cycle->end_pfn)
>>+			pfn_end = cycle->end_pfn - 1;
>>+		while (pfn <= pfn_end) {
>
>Should we change this condition to "pfn < pfn_end" ?
>
>>+			clear_bit_on_2nd_bitmap(pfn, cycle);
>>+			++pfn;
>>+		}
>>+		++i;
>>+	}
>>+}

I fixed this as below for v1.6.0.
Of course your comment would still be helpful.

--
Author: Atsushi Kumagai <ats-kumagai at wm.jp.nec.com>
Date:   Thu May 26 15:17:25 2016 +0900

    [PATCH] Fix boundary value bug for checking memory holes

    Now the next pfn to the last pfn of PT_LOAD is always excluded
    by boundary value bug.

         --------- PT_LOAD ----------|
         ----+-----------------------+---------------------+----
             |         pfn:N         |       pfn:N+1       | ...
         ----+-----------------------+---------------------+----
                                              ^ this pfn

    This will be problem in the environments which have a overlapped
    PT_LOAD segment like ia64 because the pfn excluded by this bug
    can be included in another PT_LOAD.

    Signed-off-by: Atsushi Kumagai <ats-kumagai at wm.jp.nec.com>

diff --git a/makedumpfile.c b/makedumpfile.c
index 4f17686..8a80976 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -4449,7 +4449,7 @@ exclude_nodata_pages(struct cycle *cycle)
                        pfn = cycle->start_pfn;
                if (pfn_end >= cycle->end_pfn)
                        pfn_end = cycle->end_pfn - 1;
-               while (pfn <= pfn_end) {
+               while (pfn < pfn_end) {
                        clear_bit_on_2nd_bitmap(pfn, cycle);
                        ++pfn;
                }

Thanks,
Atsushi Kumagai

>
>Thanks,
>Atsushi Kumagai
>
>>+
>> int
>> read_flat_data_header(struct makedumpfile_data_header *fdh)
>> {
>>@@ -6087,6 +6113,12 @@ create_2nd_bitmap(struct cycle *cycle)
>> 	}
>>
>> 	/*
>>+	 * If re-filtering ELF dump, exclude pages that were already
>>+	 * excluded in the original file.
>>+	 */
>>+	exclude_nodata_pages(cycle);
>>+
>>+	/*
>> 	 * Exclude cache pages, cache private pages, user data pages,
>> 	 * and hwpoison pages.
>> 	 */
>>
>>_______________________________________________
>>kexec mailing list
>>kexec at lists.infradead.org
>>http://lists.infradead.org/mailman/listinfo/kexec
>
>_______________________________________________
>kexec mailing list
>kexec at lists.infradead.org
>http://lists.infradead.org/mailman/listinfo/kexec



More information about the kexec mailing list