On Fri, 28 Mar 2014 12:00:47 +0100 Petr Tesarik <ptesarik at suse.cz> wrote: > On Thu, 27 Mar 2014 14:54:41 +0100 > Michael Holzheu <holzheu at linux.vnet.ibm.com> wrote: [snip] > > > >Here the fixed patch: > > > > > > Thanks, I'll merge the fixed version into v1.5.6. > > > > Great! > > I'm sorry to spoil the party, but this patch broke Xen dumps for me. > I'm getting an long series of these messages: > > set_bitmap: Can't read the bitmap(/tmp/kdump_bitmap91pbsO). Invalid argument > set_bitmap: Can't read the bitmap(/tmp/kdump_bitmap91pbsO). Invalid argument > set_bitmap: Can't read the bitmap(/tmp/kdump_bitmap91pbsO). Invalid argument > ... > > In fact, it most likely broke all non-cyclic dumps. > > 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> --- 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(phys_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(phys_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(phys_end, info->max_mapnr); for (j = 0; pfn < pfn_end; pfn++, j++) { print_progress(PROGRESS_XEN_DOMAIN, j + (size * i),