[Crash-utility] LKCD v9 dumps with non-standard dump header size

Dave Anderson anderson at redhat.com
Tue Nov 29 13:46:30 UTC 2005


"Kurtis D. Rader" wrote:

> The SUSE SLES 9 "bigsmp" kernel configuration defines NR_CPUS == 128. That
> causes DUMP_BUFFER_SIZE_MIN to be set to 112 KiB. That is greater than
> the default for DUMP_BUFFER_SIZE (which is 64 KiB). Which has the effect
> of causing the first page of memory to start 48 KiB farther into the dump
> file than crash(1) expects. Which in turn causes crash(1) to croak with a
> "conflicting page" error as it tries to handle a bunch of nulls as valid
> page data.
>
> The solution is to have crash(1) honor the dh_dump_buffer_size member
> of struct __dump_header rather than using the hard-coded constant
> LKCD_OFFSET_TO_FIRST_PAGE in lkcd_dump_init_v8().  Of course, that
> structure member only exists in version 9 dumps but it didn't seem
> worthwhile to create a lkcd_v9.c file just for this one difference.
> On the other hand LKCD_OFFSET_TO_FIRST_PAGE is also used in
> mclx_cache_page_headers_v8().  The following patch is the minimalist
> approach to dealing with this.
>

Less is more, I always say...

Looks good to me, unless any other LKCD-ophiles have any objection.

The mclx functions are pretty much cruft these days, since I doubt anybody
on the planet still uses that dump format, but it can't hurt to fix them up too.

Thanks,
  Dave


>
> --- lkcd_v8.c.old       2005-11-17 03:19:54.246463152 -0800
> +++ lkcd_v8.c   2005-11-17 03:22:29.425872296 -0800
> @@ -26,6 +26,7 @@ static dump_header_t dump_header_v8 = {
>  // static dump_header_asm_t dump_header_asm_v8 = { 0 };
>  static dump_page_t dump_page = { 0 };
>  static void mclx_cache_page_headers_v8(void);
> +static off_t lkcd_offset_to_first_page = LKCD_OFFSET_TO_FIRST_PAGE;
>
>  /*
>   *  Verify and initialize the LKCD environment, storing the common data
> @@ -146,7 +147,8 @@ lkcd_dump_init_v8(FILE *fp, int fd, char
>         lkcd->compression = dh->dh_dump_compress;
>          lkcd->page_header_size = sizeof(dump_page_t);
>
> -        lseek(lkcd->fd, LKCD_OFFSET_TO_FIRST_PAGE, SEEK_SET);
> +        lkcd_offset_to_first_page = dh_dump_buffer_size;
> +        lseek(lkcd->fd, lkcd_offset_to_first_page, SEEK_SET);
>
>         /*
>          * Read all of the pages and save the page offsets for lkcd_lseek().
> @@ -483,7 +485,7 @@ mclx_cache_page_headers_v8(void)
>         /*
>          *  Determine the granularity between offsets.
>          */
> -        if (lseek(lkcd->fd, page_headers[0] + LKCD_OFFSET_TO_FIRST_PAGE,
> +        if (lseek(lkcd->fd, page_headers[0] + lkcd_offset_to_first_page,
>             SEEK_SET) == -1)
>                 return;
>          if (read(lkcd->fd, dp, lkcd->page_header_size) !=
> @@ -491,7 +493,7 @@ mclx_cache_page_headers_v8(void)
>                  return;
>          physaddr1 = (dp->dp_address - lkcd->kvbase) << lkcd->page_shift;
>
> -        if (lseek(lkcd->fd, page_headers[1] + LKCD_OFFSET_TO_FIRST_PAGE,
> +        if (lseek(lkcd->fd, page_headers[1] + lkcd_offset_to_first_page,
>              SEEK_SET) == -1)
>                  return;
>          if (read(lkcd->fd, dp, lkcd->page_header_size)
> @@ -508,7 +510,7 @@ mclx_cache_page_headers_v8(void)
>         for (i = 0; i < (MCLX_PAGE_HEADERS-1); i++) {
>                 if (!page_headers[i])
>                         break;
> -               lkcd->curhdroffs = page_headers[i] + LKCD_OFFSET_TO_FIRST_PAGE;
> +               lkcd->curhdroffs = page_headers[i] + lkcd_offset_to_first_page;
>                 set_mb_benchmark((granularity * (i+1))/lkcd->page_size);
>         }
>  }
>
> --
> Kurtis D. Rader, Level 3 Linux Support
> ABC Service Center, Linux Change Team
> T/L 775-3714, DID +1 503-578-3714
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility




More information about the Crash-utility mailing list