On Fri, 28 Mar 2014 17:46:22 +0100 Michael Holzheu <holzheu at linux.vnet.ibm.com> wrote: > On Fri, 28 Mar 2014 12:00:47 +0100 > Petr Tesarik <ptesarik at suse.cz> wrote: > [snip] > > That's because the bitmap length is calculated in prepare_bitmap_buffer > > using info->max_mapnr, but create_1st_bitmap() still loops over all > > PT_LOAD segments, calling set_bit_on_1st_bitmap() for each PFN. The > > offset may easily fall beyond the bitmap size. > > What about the following patch. It works for me when I specify > the "--non-cyclic" option. > > Michael > --- > [PATCH] makedumpfile: Fix bitmap create for adjusted info->max_mapnr > > If info->max_mapnr has been adjusted, for example because the dumped > system has specified the "mem=" kernel parameter, makedumpfile writes > the following error messages for Xen dumps or when the "--non-cyclic" > option has been specified: > > set_bitmap: Can't read the bitmap(/tmp/kdump_bitmap96s9V8). Success > > Fix this and consider "info->max_mapnr" in the create bitmap functions. > > Signed-off-by: Michael Holzheu <holzheu at linux.vnet.ibm.com> > --- [snip] > @@ -7575,6 +7581,9 @@ exclude_xen4_user_domain(void) > pfn = paddr_to_pfn(phys_start); > pfn_end = paddr_to_pfn(phys_end); > size = pfn_end - pfn; > + if (pfn > info->max_mapnr) > + continue; > + pfn_end = MIN(phys_end, info->max_mapnr); Hmm, probably time for weekend. Of course this should be: pfn_end = MIN(pfn_end, info->max_mapnr); Here the updated patch: --- [PATCH] makedumpfile: Fix bitmap create for adjusted info->max_mapnr If info->max_mapnr has been adjusted, for example because the dumped system has specified the "mem=" kernel parameter, makedumpfile writes the following error messages for Xen dumps or when the "--non-cyclic" option has been specified: set_bitmap: Can't read the bitmap(/tmp/kdump_bitmap96s9V8). Success Fix this and consider "info->max_mapnr" in the create bitmap functions. Signed-off-by: Michael Holzheu <holzheu at linux.vnet.ibm.com> --- makedumpfile.c | 9 +++++++++ 1 file changed, 9 insertions(+) --- a/makedumpfile.c +++ b/makedumpfile.c @@ -4402,6 +4402,9 @@ create_1st_bitmap(void) pfn_start = paddr_to_pfn(phys_start); pfn_end = paddr_to_pfn(phys_end); + if (pfn_start > info->max_mapnr) + continue; + pfn_end = MIN(pfn_end, info->max_mapnr); for (pfn = pfn_start; pfn < pfn_end; pfn++) { set_bit_on_1st_bitmap(pfn); @@ -7511,6 +7514,9 @@ exclude_xen3_user_domain(void) pfn = paddr_to_pfn(phys_start); pfn_end = paddr_to_pfn(phys_end); size = pfn_end - pfn; + if (pfn > info->max_mapnr) + continue; + pfn_end = MIN(pfn_end, info->max_mapnr); for (j = 0; pfn < pfn_end; pfn++, j++) { print_progress(PROGRESS_XEN_DOMAIN, j + (size * i), @@ -7575,6 +7581,9 @@ exclude_xen4_user_domain(void) pfn = paddr_to_pfn(phys_start); pfn_end = paddr_to_pfn(phys_end); size = pfn_end - pfn; + if (pfn > info->max_mapnr) + continue; + pfn_end = MIN(pfn_end, info->max_mapnr); for (j = 0; pfn < pfn_end; pfn++, j++) { print_progress(PROGRESS_XEN_DOMAIN, j + (size * i),