Re: [PATCH v2] Add read diagnostics to crash

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




----- Original Message -----
> 
> ----- Original Message -----
> 
> > > But there is still no need to redundantly display the virtual and physical
> > > addresses.  And the displays of the calculated file offsets, zero-fill, etc.
> > > will still end up showing the complete function sequence by putting the
> > > function name in the output.  For example, the updated readmem() output would
> > > show a call to read_kdump(), but the file offset display would show that it
> > > has transitioned to read_netdump(), so there's no need for any debug output
> > > at all in read_kdump().
> > 
> > 
> > Well, read_kdump() in the case of a non-hyper-mode XEN dump has code
> > that has the appearance of a route of change for paddr, i.e. the 
> > following doesn't result in no change or in P2M_FAILURE:
> > 
> > paddr = xen_kdump_p2m(paddr)
> > 
> > The code I posted can show two unique paths through read_kdump() but if
> > as you say, you log calling it with the physical address known and log
> > in read_netdump() with the physical address included then you get the
> > same result.
> 
> No, you're right -- that particular "switch" of the paddr value
> should probably have its own debug statement.
> 
> > Also, are there any cases of overlapped/threaded execution of reads?
> > If  not then removal of redundant output is wise but the virt/phys addr
> > would identify which thread of execution each line refers to among
> > overlapped output in most cases.
> 
> Well, at least in the Xen case, yes it is possible.  But they would be
> encapsulated by the debug statements that indicate the "temporary" change
> from read_kdump() to read_netdump() in x86.c, x86_64.c (and ia64.c).
> 
> Dave

 
Hi Dave,

I've attached what I'm going with for now.  It covers all bases that
your original patch did, and then some.  More specifically I added
some additional debug statements to xen_kdump_p2m() in order 
to clarify the xen kdump read path through read_kdump(), because
xen_kdump_p2m() calls read_netdump() directly to get a MFN frame
before returning to read_kdump() to complete the original read
via read_netdump().  And so because of that twisty path xen kdump
reads do take, I left the addr/paddr/cnt display in read_netdump()
to allay any confusion.  The diskdump path is always straight-forward,
so the debug statements there only show the paddr/pfn pair, since
that's all it ever deals with, and the readmem()-generated statement
just above them would give you all the rest of the arguments.  I didn't
make individual debug statements in read_netdump() w/respect to whether
the offset came from a 32-bit ELF vmcore, or from a single or multiple 
PT_LOAD 64-bit ELF vmcore, because you get that information immediately
with "-d1" on the invocation command line, or from "help -n" during runtime.
I added a few simple statements in ia64.c, but this patch is primarily
concerned with x86/x86_64.  The readmem-assignment display is done
in one place, using a new readmem_function_name() function, which is
also used in readmem() and dump_program_context().  Everything is still
CRASHDEBUG(8) or less.  So I'm hoping that you'll be happy with the
modifications to your original, quite useful, proposal.

Thanks,
  Dave

 
--- defs.h	5 Jan 2012 20:57:20 -0000	1.493
+++ defs.h	11 Jan 2012 19:58:58 -0000
@@ -3544,6 +3544,8 @@
 #endif
 int clean_exit(int);
 int untrusted_file(FILE *, char *);
+char *readmem_function_name(void);
+char *writemem_function_name(void);
 
 /*
  *  cmdline.c
--- diskdump.c	12 Oct 2011 17:35:56 -0000	1.40
+++ diskdump.c	11 Jan 2012 20:03:26 -0000
@@ -7,8 +7,8 @@
  * netdump dumpfiles, the facilities in netdump.c are used.  For
  * compressed dumpfiles, the facilities in this file are used.
  *
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 David Anderson
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 David Anderson
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. All rights reserved.
  * Copyright (C) 2005  FUJITSU LIMITED
  * Copyright (C) 2005  NEC Corporation
  *
@@ -432,6 +432,11 @@
 
 	dd->dumpable_bitmap = calloc(bitmap_len, 1);
 
+	if (CRASHDEBUG(8))
+		fprintf(fp, "%s: memory bitmap offset: %llx\n",
+			DISKDUMP_VALID() ? "diskdump" : "compressed kdump",
+			(ulonglong)offset);
+
 	if (FLAT_FORMAT()) {
 		if (!read_flattened_format(dd->dfd, offset, dd->bitmap, bitmap_len)) {
 			error(INFO, "%s: cannot read memory bitmap\n",
@@ -844,29 +849,71 @@
 			}
 		}
 
-		if (i == num_dumpfiles)
+		if (i == num_dumpfiles) {
+			if (CRASHDEBUG(8))
+				fprintf(fp, "read_diskdump: SEEK_ERROR: "
+				    "paddr/pfn %llx/%lx beyond last dumpfile\n",
+					(ulonglong)paddr, pfn);
 			return SEEK_ERROR;
+		}
 	}
 
 	curpaddr = paddr & ~((physaddr_t)(dd->block_size-1));
 	page_offset = paddr & ((physaddr_t)(dd->block_size-1));
 
-	if ((pfn >= dd->header->max_mapnr) || !page_is_ram(pfn))
+	if ((pfn >= dd->header->max_mapnr) || !page_is_ram(pfn)) {
+		if (CRASHDEBUG(8)) {
+			fprintf(fp, "read_diskdump: SEEK_ERROR: "
+			    "paddr/pfn: %llx/%lx ",
+				(ulonglong)paddr, pfn);
+			if (pfn >= dd->header->max_mapnr)
+				fprintf(fp, "max_mapnr: %x\n",
+					dd->header->max_mapnr);
+			else
+				fprintf(fp, "!page_is_ram\n");
+		}
+
 		return SEEK_ERROR;
+	}
+
 	if (!page_is_dumpable(pfn)) {
 		if ((dd->flags & (ZERO_EXCLUDED|ERROR_EXCLUDED)) ==
-		    ERROR_EXCLUDED)
+		    ERROR_EXCLUDED) {
+			if (CRASHDEBUG(8))
+				fprintf(fp, "read_diskdump: PAGE_EXCLUDED: "
+			    	    "paddr/pfn: %llx/%lx\n",
+					(ulonglong)paddr, pfn);
 			return PAGE_EXCLUDED;
+		}
+		if (CRASHDEBUG(8))
+			fprintf(fp, "read_diskdump: zero-fill: "
+		    	    "paddr/pfn: %llx/%lx\n",
+				(ulonglong)paddr, pfn);
 		memset(bufptr, 0, cnt);
 		return cnt;
 	}
 
-	if (!page_is_cached(curpaddr))
-		if ((ret = cache_page(curpaddr)) < 0)
+	if (!page_is_cached(curpaddr)) {
+		if (CRASHDEBUG(8))
+			fprintf(fp, "read_diskdump: paddr/pfn: %llx/%lx"
+			    " -> cache physical page: %llx\n",
+				(ulonglong)paddr, pfn, (ulonglong)curpaddr);
+
+		if ((ret = cache_page(curpaddr)) < 0) {
+			if (CRASHDEBUG(8))
+				fprintf(fp, "read_diskdump: " 
+				    "%s: cannot cache page: %llx\n",
+					ret == SEEK_ERROR ?  
+					"SEEK_ERROR" : "READ_ERROR",
+					(ulonglong)curpaddr);
 			return ret;
+		}
+	} else if (CRASHDEBUG(8))
+		fprintf(fp, "read_diskdump: paddr/pfn: %llx/%lx"
+		    " -> physical page is cached: %llx\n", 
+			(ulonglong)paddr, pfn, (ulonglong)curpaddr);
 	
 	memcpy(bufptr, dd->curbufptr + page_offset, cnt);
-
 	return cnt;
 }
 
--- filesys.c	2 Dec 2011 16:36:58 -0000	1.92
+++ filesys.c	10 Jan 2012 20:56:10 -0000
@@ -1,8 +1,8 @@
 /* filesys.c - core analysis suite
  *
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 David Anderson
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 David Anderson
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -136,6 +136,18 @@
 	}
 
 	memory_source_init();
+
+	if (CRASHDEBUG(1)) {
+		fprintf(fp, "readmem: %s() ", readmem_function_name());
+		if (ACTIVE()) {
+			fprintf(fp, "-> %s ", pc->live_memsrc);
+			if (pc->flags & MEMMOD)
+				fprintf(fp, "(module)");
+			else if (pc->flags & CRASHBUILTIN)
+				fprintf(fp, "(built-in)");
+		}
+		fprintf(fp, "\n");
+	}
 }
 
 /*
--- ia64.c	22 Sep 2011 14:57:15 -0000	1.104
+++ ia64.c	10 Jan 2012 22:00:55 -0000
@@ -1,8 +1,8 @@
 /* ia64.c - core analysis suite
  *
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 David Anderson
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 David Anderson
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 Red Hat, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -3947,8 +3947,10 @@
 	 */
 	pc->readmem = read_netdump;
 
-	if (CRASHDEBUG(1))
+	if (CRASHDEBUG(1)) {
+		fprintf(fp, "readmem (temporary): read_netdump()\n");
 		fprintf(fp, "ia64_xen_kdump_p2m_create: p2m_mfn: %lx\n", xkd->p2m_mfn);
+	}
 
 	if ((xkd->p2m_mfn_frame_list = (ulong *)malloc(PAGESIZE())) == NULL)
 		error(FATAL, "cannot malloc p2m_frame_list");
@@ -3960,6 +3962,8 @@
 	xkd->p2m_frames = PAGESIZE()/sizeof(ulong);
 
 	pc->readmem = read_kdump;
+	if (CRASHDEBUG(1))
+		fprintf(fp, "readmem (restore): read_kdump()\n");
 
 	return TRUE;
 }
@@ -3976,6 +3980,8 @@
 	 *  going directly to read_netdump() instead of via read_kdump().
 	 */
 	pc->readmem = read_netdump;
+	if (CRASHDEBUG(1))
+		fprintf(fp, "readmem (temporary): read_netdump()\n");
 
 	xkd->accesses += 2;
 
@@ -4028,6 +4034,9 @@
 
 out:
 	pc->readmem = read_kdump;
+	if (CRASHDEBUG(1))
+		fprintf(fp, "readmem (restore): read_kdump()\n");
+
 	return paddr;
 }
 
--- main.c	15 Dec 2011 20:26:12 -0000	1.125
+++ main.c	10 Jan 2012 21:59:33 -0000
@@ -1,8 +1,8 @@
 /* main.c - core analysis suite
  *
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 David Anderson
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 David Anderson
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -1069,6 +1069,7 @@
 {
 	int i;
 	int others = 0;
+	char *p1;
 	char buf[BUFSIZE];
 	char buf2[BUFSIZE];
 
@@ -1500,54 +1501,90 @@
 	fprintf(fp, "             rmfd: %d\n", pc->rmfd);
 	fprintf(fp, "             rkfd: %d\n", pc->rkfd);
 	fprintf(fp, "       rcvbufsize: %ld\n", pc->rcvbufsize);
+
+	fprintf(fp, "          readmem: ");
+	if ((p1 = readmem_function_name()))
+		fprintf(fp, "%s()\n", p1);
+	else
+		fprintf(fp, "%lx\n", (ulong)pc->readmem);
+
+	fprintf(fp, "         writemem: ");
+	if ((p1 = writemem_function_name()))
+		fprintf(fp, "%s()\n", p1);
+	else
+		fprintf(fp, "%lx\n", (ulong)pc->writemem);
+
+	fprintf(fp, "  dumpfile memory: %d\n", 
+		dumpfile_memory(DUMPFILE_MEM_USED)); 
+	fprintf(fp, "           curext: %lx\n", (ulong)pc->curext); 
+	fprintf(fp, "             sbrk: %lx\n", (ulong)pc->sbrk); 
+	fprintf(fp, "          cleanup: %s\n", pc->cleanup);
+}
+
+char *
+readmem_function_name(void)
+{
 	if (pc->readmem == read_dev_mem)
-		fprintf(fp, "          readmem: read_dev_mem()\n");
+		return("read_dev_mem");
 	else if (pc->readmem == read_mclx_dumpfile)
-		fprintf(fp, "          readmem: read_mclx_dumpfile()\n");
+		return("read_mclx_dumpfile");
 	else if (pc->readmem == read_lkcd_dumpfile)
-		fprintf(fp, "          readmem: read_lkcd_dumpfile()\n");
+		return("read_lkcd_dumpfile");
 	else if (pc->readmem == read_daemon)
-		fprintf(fp, "          readmem: read_daemon()\n");
+		return("read_daemon");
 	else if (pc->readmem == read_netdump)
-		fprintf(fp, "          readmem: read_netdump()\n");
+		return("read_netdump");
 	else if (pc->readmem == read_xendump)
-		fprintf(fp, "          readmem: read_xendump()\n");
+		return("read_xendump");
 	else if (pc->readmem == read_kdump)
-		fprintf(fp, "          readmem: read_kdump()\n");
+		return("read_kdump");
 	else if (pc->readmem == read_memory_device)
-		fprintf(fp, "          readmem: read_memory_device()\n");
+		return("read_memory_device");
 	else if (pc->readmem == read_xendump_hyper)
-		fprintf(fp, "          readmem: read_xendump_hyper()\n");
+		return("read_xendump_hyper");
 	else if (pc->readmem == read_diskdump)
-		fprintf(fp, "          readmem: read_diskdump()\n");
+		return("read_diskdump");
+	else if (pc->readmem == read_proc_kcore)
+		return("read_proc_kcore");
+	else if (pc->readmem == read_sadump)
+		return("read_sadump");
+	else if (pc->readmem == read_s390_dumpfile)
+		return("read_s390_dumpfile");
 	else
-		fprintf(fp, "          readmem: %lx\n", (ulong)pc->readmem);
-        if (pc->writemem == write_dev_mem)
-                fprintf(fp, "         writemem: write_dev_mem()\n");
-        else if (pc->writemem == write_mclx_dumpfile)
-                fprintf(fp, "         writemem: write_mclx_dumpfile()\n");
-        else if (pc->writemem == write_lkcd_dumpfile)
-                fprintf(fp, "         writemem: write_lkcd_dumpfile()\n");
-        else if (pc->writemem == write_daemon)
-                fprintf(fp, "         writemem: write_daemon()\n");
-        else if (pc->writemem == write_netdump)
-                fprintf(fp, "         writemem: write_netdump()\n");
-        else if (pc->writemem == write_xendump)
-                fprintf(fp, "         writemem: write_xendump()\n");
-        else if (pc->writemem == write_kdump)
-                fprintf(fp, "         writemem: write_kdump()\n");
-        else if (pc->writemem == write_memory_device)
-                fprintf(fp, "         writemem: write_memory_device()\n");
-        else if (pc->writemem == write_diskdump)
-                fprintf(fp, "         writemem: write_diskdump()\n");
-        else
-                fprintf(fp, "         writemem: %lx\n", (ulong)pc->writemem);
+		return NULL;
+}
 
-	fprintf(fp, "  dumpfile memory: %d\n", 
-		dumpfile_memory(DUMPFILE_MEM_USED)); 
-	fprintf(fp, "           curext: %lx\n", (ulong)pc->curext); 
-	fprintf(fp, "             sbrk: %lx\n", (ulong)pc->sbrk); 
-	fprintf(fp, "          cleanup: %s\n", pc->cleanup);
+char *
+writemem_function_name(void)
+{
+	if (pc->writemem == write_dev_mem)
+		return("write_dev_mem");
+	else if (pc->writemem == write_mclx_dumpfile)
+		return("write_mclx_dumpfile");
+	else if (pc->writemem == write_lkcd_dumpfile)
+		return("write_lkcd_dumpfile");
+	else if (pc->writemem == write_daemon)
+		return("write_daemon");
+	else if (pc->writemem == write_netdump)
+		return("write_netdump");
+	else if (pc->writemem == write_xendump)
+		return("write_xendump");
+	else if (pc->writemem == write_kdump)
+		return("write_kdump");
+	else if (pc->writemem == write_memory_device)
+		return("write_memory_device");
+//	else if (pc->writemem == write_xendump_hyper)
+//		return("write_xendump_hyper");
+	else if (pc->writemem == write_diskdump)
+		return("write_diskdump");
+	else if (pc->writemem == write_proc_kcore)
+		return("write_proc_kcore");
+	else if (pc->writemem == write_sadump)
+		return("write_sadump");
+	else if (pc->writemem == write_s390_dumpfile)
+		return("write_s390_dumpfile");
+	else
+		return NULL;
 }
 
 /*
--- memory.c	10 Jan 2012 15:10:02 -0000	1.264
+++ memory.c	11 Jan 2012 16:05:50 -0000
@@ -1993,9 +1993,10 @@
                 if (cnt > size)
                         cnt = size;
 
-		if (CRASHDEBUG(8))
-			fprintf(fp, "    addr: %llx  paddr: %llx  cnt: %ld\n", 
-				addr, (unsigned long long)paddr, cnt);
+		if (CRASHDEBUG(4))
+			fprintf(fp, "<%s: addr: %llx paddr: %llx cnt: %ld>\n", 
+				readmem_function_name(), addr, 
+				(unsigned long long)paddr, cnt);
 
 		if (memtype == KVADDR)
 			pc->curcmd_flags |= MEMTYPE_KVADDR;
--- netdump.c	10 Jan 2012 14:52:53 -0000	1.119
+++ netdump.c	11 Jan 2012 16:29:09 -0000
@@ -538,24 +538,51 @@
 			if (pls->zero_fill && (paddr >= pls->phys_end) &&
 			    (paddr < pls->zero_fill)) {
 				memset(bufptr, 0, cnt);
+				if (CRASHDEBUG(8))
+					fprintf(fp, "read_netdump: zero-fill: "
+					    "addr: %lx paddr: %llx cnt: %d\n",
+						addr, (ulonglong)paddr, cnt);
                 		return cnt;
 			}
 		}
 	
-		if (!offset) 
+		if (!offset) {
+			if (CRASHDEBUG(8))
+				fprintf(fp, "read_netdump: READ_ERROR: "
+				    "offset not found for paddr: %llx\n",
+					(ulonglong)paddr);
 	                return READ_ERROR;
+		}
 		
 		break;
 	}	
 
+	if (CRASHDEBUG(8))
+		fprintf(fp, "read_netdump: addr: %lx paddr: %llx cnt: %d offset: %llx\n",
+			addr, (ulonglong)paddr, cnt, (ulonglong)offset);
+
 	if (FLAT_FORMAT()) {
-		if (!read_flattened_format(nd->ndfd, offset, bufptr, cnt))
+		if (!read_flattened_format(nd->ndfd, offset, bufptr, cnt)) {
+			if (CRASHDEBUG(8))
+				fprintf(fp, "read_netdump: READ_ERROR: "
+				    "read_flattened_format failed for offset:"
+				    " %llx\n",
+					(ulonglong)offset);
 			return READ_ERROR;
+		}
 	} else {
-		if (lseek(nd->ndfd, offset, SEEK_SET) == -1)
+		if (lseek(nd->ndfd, offset, SEEK_SET) == -1) {
+			if (CRASHDEBUG(8))
+				fprintf(fp, "read_netdump: SEEK_ERROR: "
+				    "offset: %llx\n", (ulonglong)offset);
 			return SEEK_ERROR;
-		if (read(nd->ndfd, bufptr, cnt) != cnt)
+		}
+		if (read(nd->ndfd, bufptr, cnt) != cnt) {
+			if (CRASHDEBUG(8))
+				fprintf(fp, "read_netdump: READ_ERROR: "
+				    "offset: %llx\n", (ulonglong)offset);
 			return READ_ERROR;
+		}
 	}
 
         return cnt;
@@ -2666,6 +2693,8 @@
 int
 read_kdump(int fd, void *bufptr, int cnt, ulong addr, physaddr_t paddr)
 {
+	physaddr_t paddr_in = paddr;
+
 	if (XEN_CORE_DUMPFILE() && !XEN_HYPER_MODE()) {
 	    	if (!(nd->xen_kdump_data->flags & KDUMP_P2M_INIT)) {
         		if (!machdep->xen_kdump_p2m_create)
@@ -2684,8 +2713,15 @@
         		nd->xen_kdump_data->flags |= KDUMP_P2M_INIT;
 		}
 
-		if ((paddr = xen_kdump_p2m(paddr)) == P2M_FAILURE)
+		if ((paddr = xen_kdump_p2m(paddr)) == P2M_FAILURE) {
+			if (CRASHDEBUG(8)) 
+				fprintf(fp, "read_kdump: xen_kdump_p2m(%llx): "
+					"P2M_FAILURE\n", (ulonglong)paddr_in);
 			return READ_ERROR;
+		}
+		if (CRASHDEBUG(8))
+			fprintf(fp, "read_kdump: xen_kdump_p2m(%llx): %llx\n",
+				(ulonglong)paddr_in, (ulonglong)paddr);
 	}
 
 	return read_netdump(fd, bufptr, cnt, addr, paddr);
@@ -2762,15 +2798,26 @@
 	pfn = (ulong)BTOP(pseudo);
 	mfn_idx = pfn / (PAGESIZE()/sizeof(ulong));
 	frame_idx = pfn % (PAGESIZE()/sizeof(ulong));
-	if (mfn_idx >= xkd->p2m_frames)
+	if (mfn_idx >= xkd->p2m_frames) {
+		if (CRASHDEBUG(8))
+			fprintf(fp, "xen_kdump_p2m: paddr/pfn: %llx/%lx: "
+			    "mfn_idx nonexistent\n",
+				(ulonglong)pseudo, pfn);
 		return P2M_FAILURE;
+	}
 	mfn_frame = xkd->p2m_mfn_frame_list[mfn_idx];
 
 	if (mfn_frame == xkd->last_mfn_read)
 		xkd->cache_hits++;
-	else if (read_netdump(0, xkd->page, PAGESIZE(), 0, 
-	    	(physaddr_t)PTOB(mfn_frame)) != PAGESIZE())
-		return P2M_FAILURE;
+	else {
+		if (CRASHDEBUG(8))
+			fprintf(fp, "xen_kdump_p2m: paddr/pfn: %llx/%lx: "
+			    "read mfn_frame: %llx\n",
+				(ulonglong)pseudo, pfn, PTOB(mfn_frame));
+		if (read_netdump(0, xkd->page, PAGESIZE(), 0, 
+		    (physaddr_t)PTOB(mfn_frame)) != PAGESIZE())
+			return P2M_FAILURE;
+	}
 
 	xkd->last_mfn_read = mfn_frame;
 
@@ -2780,7 +2827,7 @@
 
 	if (CRASHDEBUG(7))
 		fprintf(fp, 
-		    "xen_dump_p2m(%llx): mfn_idx: %ld frame_idx: %ld"
+		    "xen_kdump_p2m(%llx): mfn_idx: %ld frame_idx: %ld"
 		    " mfn_frame: %lx mfn: %lx => %llx\n",
 			(ulonglong)pseudo, mfn_idx, frame_idx, 
 			mfn_frame, *mfnptr, (ulonglong)paddr);
--- x86.c	21 Oct 2011 21:17:25 -0000	1.141
+++ x86.c	10 Jan 2012 21:28:12 -0000
@@ -1,8 +1,8 @@
 /* x86.c - core analysis suite
  *
  * Portions Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 David Anderson
- * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 David Anderson
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -4391,6 +4391,8 @@
 	 *  going directly to read_netdump() instead of via read_kdump().
 	 */ 
 	pc->readmem = read_netdump;
+	if (CRASHDEBUG(1)) 
+		fprintf(fp, "readmem (temporary): read_netdump()\n");
 
 	if (xkd->flags & KDUMP_CR3)
 		goto use_cr3;
@@ -4468,6 +4470,9 @@
         }
 
 	pc->readmem = read_kdump;
+	if (CRASHDEBUG(1)) 
+		fprintf(fp, "readmem (restore): read_kdump()\n");
+
 	return TRUE;
 
 use_cr3:
@@ -4554,6 +4559,8 @@
         machdep->last_ptbl_read = 0;
         machdep->last_pmd_read = 0;
 	pc->readmem = read_kdump;
+	if (CRASHDEBUG(1)) 
+		fprintf(fp, "readmem (restore): read_kdump()\n");
 
 	return TRUE;
 }
--- x86_64.c	15 Dec 2011 16:40:02 -0000	1.191
+++ x86_64.c	11 Jan 2012 19:58:55 -0000
@@ -1,7 +1,7 @@
 /* x86_64.c -- core analysis suite
  *
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 David Anderson
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 David Anderson
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -5399,6 +5399,8 @@
          *  going directly to read_netdump() instead of via read_kdump().
          */
         pc->readmem = read_netdump;
+	if (CRASHDEBUG(1))
+		fprintf(fp, "readmem (temporary): read_netdump()\n");
 
         if (xkd->flags & KDUMP_CR3)
                 goto use_cr3;
@@ -5459,6 +5461,9 @@
 	}
 
         pc->readmem = read_kdump;
+	if (CRASHDEBUG(1))
+		fprintf(fp, "readmem (restore): read_kdump()\n");
+
 	return TRUE;
 
 use_cr3:
@@ -5525,6 +5530,8 @@
         machdep->last_ptbl_read = 0;
         machdep->last_pmd_read = 0;
         pc->readmem = read_kdump;
+	if (CRASHDEBUG(1))
+		fprintf(fp, "readmem (restore): read_kdump()\n");
 
         return TRUE;
 }
--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux