Hello,

I found a bug in cyclic mode, I'll merge this patch to next version.


Thanks
Atsushi Kumagai

--
In cyclic mode, get_loads_dumpfile_cyclic() is called as setup for
writing phase. But get_loads_dumpfile_cyclic() calls filter_data_buffer()
via read_pfn(), then filter_info is consumed. As a result, filter_info
doesn't exist at the moment when it is actually necessary to scrub data.

That's why --config option doesn't work correctly in cyclic mode
with -E option.

Signed-off-by: Atsushi Kumagai <[email protected]>
---
 makedumpfile.c |   14 ++++++++++++--
 1 files changed, 12 insertios(+), 2 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index ebdc31a..4187b84 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -5207,6 +5207,7 @@ get_loads_dumpfile_cyclic(void)
        long page_size = info->page_size;
        unsigned char buf[info->page_size];
        unsigned long long pfn, pfn_start, pfn_end, num_excluded;
+       unsigned long long paddr;
        unsigned long frac_head, frac_tail;
        Elf64_Phdr load;
 
@@ -5260,8 +5261,12 @@ get_loads_dumpfile_cyclic(void)
                         * Exclude zero pages.
                         */
                        if (info->dump_level & DL_EXCLUDE_ZERO) {
-                               if (!read_pfn(pfn, buf))
+                               paddr = pfn_to_paddr(pfn);
+                               if (!readmem(PADDR, paddr, buf, page_size)) {
+                                       ERRMSG("Can't get the page 
data(pfn:%llx,max_mapnr:%llx).\n",
+                                              pfn, info->max_mapnr);
                                        return FALSE;
+                               }
                                if (is_zero_page(buf, page_size)) {
                                        num_excluded++;
                                        continue;
@@ -5291,6 +5296,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, 
struct cache_data *cd_page)
        long page_size = info->page_size;
        unsigned char buf[info->page_size];
        unsigned long long pfn, pfn_start, pfn_end, paddr, num_excluded;
+       unsigned long long paddr_buf;
        unsigned long long num_dumpable, per;
        unsigned long long memsz, filesz;
        unsigned long frac_head, frac_tail;
@@ -5370,8 +5376,12 @@ write_elf_pages_cyclic(struct cache_data *cd_header, 
struct cache_data *cd_page)
                         * Exclude zero pages.
                         */
                        if (info->dump_level & DL_EXCLUDE_ZERO) {
-                               if (!read_pfn(pfn, buf))
+                               paddr_buf = pfn_to_paddr(pfn);
+                               if (!readmem(PADDR, paddr_buf, buf, page_size)) 
{
+                                       ERRMSG("Can't get the page 
data(pfn:%llx max_mapnr:%llx).\n",
+                                              pfn, info->max_mapnr);
                                        return FALSE;
+                               }
                                if (is_zero_page(buf, page_size)) {
                                        pfn_zero++;
                                        num_excluded++;
-- 
1.7.1

_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to