WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] Re: [PATCH 4/4] extract vmcoreinfo from /proc/vmcore for Xen

To: Itsuro ODA <oda@xxxxxxxxxxxxx>
Subject: [Xen-devel] Re: [PATCH 4/4] extract vmcoreinfo from /proc/vmcore for Xen
From: "Ken'ichi Ohmichi" <oomichi@xxxxxxxxxxxxxxxxx>
Date: Thu, 03 Apr 2008 17:59:54 +0900
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, kexec@xxxxxxxxxxxxxxxxxxx
Delivery-date: Thu, 03 Apr 2008 02:00:47 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <20080331132027.DDD3.ODA@xxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20080331132027.DDD3.ODA@xxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.6 (Windows/20070728)
Hi ODA-san,

Itsuro ODA wrote:
> This patch is for makedumpfile-1.2.4.

Thank you very much for the patch.
I have reviewed your patch and it is almost fine, but I have one concern.
Please let me know your opinion.

If your patch is merged and /proc/vmcore contains VMCOREINFO_XEN,
makedumpfile excludes all the user domain's pages automatically
without any options. So somebody may use makedumpfile only for
printing progress indicator[1] without excluding pages, but it
will be impossible.

So I think it is better that a new option is added for excluding
user domain's pages. For example, there are 2 following plans.

Plan1: Add a new "--exclude-xen-user-domain" option
Plan2: Add a new dump_level '32'

What do you think it ?


Thanks
Ken'ichi Ohmichi

---
[1] progress indicator
  # makedumpfile /proc/vmcore dumpfile
  [100 %]  <- *THIS*


> --- makedumpfile.c.org        2008-03-25 13:35:03.000000000 +0900
> +++ makedumpfile.c    2008-03-27 11:32:03.000000000 +0900
> @@ -2389,7 +2389,7 @@
>       off_t offset, off_note;
>       int flag_elf64;
>       unsigned long sz_note;
> -     char buf[VMCOREINFO_NOTE_NAME_BYTES];
> +     char buf[VMCOREINFO_XEN_NOTE_NAME_BYTES];
>       Elf64_Nhdr note64;
>       Elf32_Nhdr note32;
>  
> @@ -2430,30 +2430,40 @@
>                           info->name_memory, strerror(errno));
>                       return FALSE;
>               }
> -             if (strncmp(VMCOREINFO_NOTE_NAME, buf,
> +             if (!strncmp(VMCOREINFO_XEN_NOTE_NAME, buf,
> +                 VMCOREINFO_XEN_NOTE_NAME_BYTES)) { /* must be first */
> +                     if (flag_elf64) {
> +                             info->offset_vmcoreinfo_xen = offset + 
> (sizeof(note64)
> +                                 + ((note64.n_namesz + 3) & ~3));
> +                             info->size_vmcoreinfo_xen = note64.n_descsz;
> +                     } else {
> +                             info->offset_vmcoreinfo_xen = offset + 
> (sizeof(note32)
> +                                 + ((note32.n_namesz + 3) & ~3));
> +                             info->size_vmcoreinfo_xen = note32.n_descsz;
> +                     }
> +                     (*flag_found) |= VMCOREINFO_XEN;
> +             } else if (!strncmp(VMCOREINFO_NOTE_NAME, buf,
>                   VMCOREINFO_NOTE_NAME_BYTES)) {
>                       if (flag_elf64) {
> -                             offset += sizeof(Elf64_Nhdr)
> -                                 + ((note64.n_namesz + 3) & ~3)
> -                                 + ((note64.n_descsz + 3) & ~3);
> +                             info->offset_vmcoreinfo = offset + 
> (sizeof(note64)
> +                                 + ((note64.n_namesz + 3) & ~3));
> +                             info->size_vmcoreinfo = note64.n_descsz;
>                       } else {
> -                             offset += sizeof(Elf32_Nhdr)
> -                                 + ((note32.n_namesz + 3) & ~3)
> -                                 + ((note32.n_descsz + 3) & ~3);
> +                             info->offset_vmcoreinfo = offset + 
> (sizeof(note32)
> +                                 + ((note32.n_namesz + 3) & ~3));
> +                             info->size_vmcoreinfo = note32.n_descsz;
>                       }
> -                     continue;
> +                     (*flag_found) |= VMCOREINFO_LINUX;
>               }
>               if (flag_elf64) {
> -                     info->offset_vmcoreinfo = offset + (sizeof(note64)
> -                         + ((note64.n_namesz + 3) & ~3));
> -                     info->size_vmcoreinfo = note64.n_descsz;
> +                     offset += sizeof(Elf64_Nhdr)
> +                         + ((note64.n_namesz + 3) & ~3)
> +                         + ((note64.n_descsz + 3) & ~3);
>               } else {
> -                     info->offset_vmcoreinfo = offset + (sizeof(note32)
> -                         + ((note32.n_namesz + 3) & ~3));
> -                     info->size_vmcoreinfo = note32.n_descsz;
> +                     offset += sizeof(Elf32_Nhdr)
> +                         + ((note32.n_namesz + 3) & ~3)
> +                         + ((note32.n_descsz + 3) & ~3);
>               }
> -             (*flag_found) = TRUE;
> -             break;
>       }
>       return TRUE;
>  }
> @@ -2501,6 +2511,46 @@
>       return TRUE;
>  }
>  
> +int
> +copy_vmcoreinfo_xen()
> +{
> +     int fd;
> +     char buf[VMCOREINFO_BYTES];
> +     const off_t failed = (off_t)-1;
> +
> +     if (!info->offset_vmcoreinfo_xen || !info->size_vmcoreinfo_xen)
> +             return FALSE;
> +
> +     if ((fd = mkstemp(info->name_vmcoreinfo)) < 0) {
> +             ERRMSG("Can't open the vmcoreinfo file(%s). %s\n",
> +                 info->name_vmcoreinfo, strerror(errno));
> +             return FALSE;
> +     }
> +     if (lseek(info->fd_memory, info->offset_vmcoreinfo_xen, SEEK_SET)
> +         == failed) {
> +             ERRMSG("Can't seek the dump memory(%s). %s\n",
> +                 info->name_memory, strerror(errno));
> +             return FALSE;
> +     }
> +     if (read(info->fd_memory, &buf, info->size_vmcoreinfo_xen)
> +         != info->size_vmcoreinfo_xen) {
> +             ERRMSG("Can't read the dump memory(%s). %s\n",
> +                 info->name_memory, strerror(errno));
> +             return FALSE;
> +     }
> +     if (write(fd, &buf, info->size_vmcoreinfo_xen) != 
> info->size_vmcoreinfo_xen) {
> +             ERRMSG("Can't write the vmcoreinfo file(%s). %s\n",
> +                 info->name_vmcoreinfo, strerror(errno));
> +             return FALSE;
> +     }
> +     if (close(fd) < 0) {
> +             ERRMSG("Can't close the vmcoreinfo file(%s). %s\n",
> +                 info->name_vmcoreinfo, strerror(errno));
> +             return FALSE;
> +     }
> +     return TRUE;
> +}
> +
>  /*
>   * Get the number of online nodes.
>   */
> @@ -3182,8 +3232,6 @@
>  int
>  initial()
>  {
> -     int vmcoreinfo_in_vmcore = FALSE;
> -
>       if (!get_elf_info())
>               return FALSE;
>  
> @@ -3208,48 +3256,8 @@
>  
>               if (!get_srcfile_info())
>                       return FALSE;
> -     /*
> -      * Get the debug information for analysis from /proc/vmcore
> -      */
> -     } else {
> -             /*
> -              * Check whether /proc/vmcore contains vmcoreinfo,
> -              * and get both the offset and the size.
> -              */
> -             if (!is_vmcoreinfo_in_vmcore(&vmcoreinfo_in_vmcore))
> -                     return FALSE;
> -
> -             if (!vmcoreinfo_in_vmcore) {
> -                     if (info->dump_level <= DL_EXCLUDE_ZERO)
> -                             goto out;
> -
> -                     MSG("%s doesn't contain vmcoreinfo.\n",
> -                         info->name_memory);
> -                     MSG("'-x' or '-i' must be specified.\n");
> -                     return FALSE;
> -             }
> -             /*
> -              * Copy vmcoreinfo to /tmp/vmcoreinfoXXXXXX.
> -              */
> -             if ((info->name_vmcoreinfo
> -                 = malloc(sizeof(FILENAME_VMCOREINFO))) == NULL) {
> -                     ERRMSG("Can't allocate memory for the name(%s). %s\n",
> -                         FILENAME_VMCOREINFO, strerror(errno));
> -                     return FALSE;
> -             }
> -             strcpy(info->name_vmcoreinfo, FILENAME_VMCOREINFO);
> -             if (!copy_vmcoreinfo())
> -                     return FALSE;
> -             /*
> -              * Read vmcoreinfo from /tmp/vmcoreinfoXXXXXX.
> -              */
> -             if (!open_vmcoreinfo("r"))
> -                     return FALSE;
> -             if (!read_vmcoreinfo())
> -                     return FALSE;
> -             unlink(info->name_vmcoreinfo);
>       }
> -out:
> +
>       if (info->dump_level <= DL_EXCLUDE_ZERO) {
>               if (!get_mem_map_without_mm())
>                       return FALSE;
> @@ -5880,6 +5888,7 @@
>  main(int argc, char *argv[])
>  {
>       int opt, flag_debug = FALSE;
> +     int vmcoreinfo_in_vmcore = FALSE;
>  
>       if ((info = calloc(1, sizeof(struct DumpInfo))) == NULL) {
>               ERRMSG("Can't allocate memory for the pagedesc cache. %s.\n",
> @@ -6043,6 +6052,39 @@
>                       print_usage();
>                       goto out;
>               }
> +             if (!info->flag_vmlinux && !info->flag_read_vmcoreinfo
> +                 && !info->flag_rearrange) {
> +                     if (!open_dump_memory())
> +                             goto out;
> +                     if (!is_vmcoreinfo_in_vmcore(&vmcoreinfo_in_vmcore))
> +                             goto out;
> +                     if (!vmcoreinfo_in_vmcore && info->dump_level > 
> DL_EXCLUDE_ZERO) {
> +                             MSG("%s doesn't contain vmcoreinfo.\n",
> +                                 info->name_memory);
> +                             MSG("'-x' or '-i' must be specified.\n");
> +                             goto out;
> +                     }
> +                     /*
> +                      * Copy vmcoreinfo to /tmp/vmcoreinfoXXXXXX.
> +                      */
> +                     if ((info->name_vmcoreinfo
> +                         = malloc(sizeof(FILENAME_VMCOREINFO))) == NULL) {
> +                             ERRMSG("Can't allocate memory for the name(%s). 
> %s\n",
> +                                 FILENAME_VMCOREINFO, strerror(errno));
> +                             goto out;
> +                     }
> +                     strcpy(info->name_vmcoreinfo, FILENAME_VMCOREINFO);
> +                     if (vmcoreinfo_in_vmcore & VMCOREINFO_XEN) {
> +                             info->flag_xen = 1;
> +                             if (!copy_vmcoreinfo_xen())
> +                                     goto out;
> +                     } else {
> +                             if (!copy_vmcoreinfo())
> +                                     goto out;
> +                     }
> +                     info->flag_read_vmcoreinfo = 1;
> +                     close_dump_memory();
> +             }
>       }
>  
>       if (elf_version(EV_CURRENT) == EV_NONE ) {
> @@ -6081,7 +6123,8 @@
>                       goto out;
>               }
>               info->dump_level |= DL_EXCLUDE_XEN;
> -             return handle_xen();
> +             retcd = handle_xen();
> +             goto out;
>  
>       } else if (info->flag_rearrange) {
>               if (!open_files_for_rearranging_dumpdata())
> @@ -6155,6 +6198,9 @@
>               free(info->mem_map_data);
>       if (info->dump_header != NULL)
>               free(info->dump_header);
> +     if (vmcoreinfo_in_vmcore && info->name_vmcoreinfo) {
> +             unlink(info->name_vmcoreinfo);
> +     }
>       if (info != NULL)
>               free(info);
>  
> --- makedumpfile.h.org        2008-03-25 13:35:19.000000000 +0900
> +++ makedumpfile.h    2008-03-25 14:29:33.000000000 +0900
> @@ -430,7 +430,11 @@
>  #define VMCOREINFO_BYTES             (4096)
>  #define VMCOREINFO_NOTE_NAME         "VMCOREINFO"
>  #define VMCOREINFO_NOTE_NAME_BYTES   (sizeof(VMCOREINFO_NOTE_NAME))
> +#define VMCOREINFO_XEN_NOTE_NAME     "VMCOREINFO_XEN"
> +#define VMCOREINFO_XEN_NOTE_NAME_BYTES       
> (sizeof(VMCOREINFO_XEN_NOTE_NAME))
>  #define FILENAME_VMCOREINFO          "/tmp/vmcoreinfoXXXXXX"
> +#define VMCOREINFO_LINUX     (0x01)
> +#define VMCOREINFO_XEN               (0x02)
>  
>  /*
>   * field name of vmcoreinfo file
> @@ -762,6 +766,8 @@
>        */
>       off_t                   offset_vmcoreinfo;
>       unsigned long           size_vmcoreinfo;
> +     off_t                   offset_vmcoreinfo_xen;
> +     unsigned long           size_vmcoreinfo_xen;
>  
>       /*
>        * for Xen extraction
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>