[Crash-utility] The problems when running SuSE 12 on VirtualBox

Dave Anderson anderson at redhat.com
Thu Nov 19 19:20:08 UTC 2015



----- Original Message -----
> On 11/19/2015 08:37 AM, David Mair wrote:
> > On 11/19/2015 07:45 AM, Dave Anderson wrote:
> > 
> > Hi Dave,
> > 
> >> ----- Original Message -----
> > <snip>
> >>
> >>> (2) Execute "crash -d8" on physical machine will cause crash utility core
> >>> dump.
> >>
> >> I can reproduce this, so I'll look into it.  It's related to the /dev/mem "test"
> >> to determine whether the kernel was configured with CONFIG_STRICT_DEVMEM, where
> >> it tries to read from pfn 257 (just above the CONFIG_STRICT_DEVMEM limit), but
> >> gets into an infinite loop when used in conjunction with -d.
> >>
> >> Anyway, just continue to use /proc/kcore and you should be fine.
> > 
> > This is the cause in readmem():
> > 
> > switch(READMEM(...))
> > {
> > 	.
> > 	.
> > 	.
> > case READ_ERROR:
> > 	if (PRINT_ERROR_MESSAGE) ********** THIS ***********
> > 	{
> > 		causes a nested readmem() call before the goto gives it
> > 		to the caller to deal with
> > 	}
> > 	goto readmem_error
> > }
> > 	.
> > 	.
> > 	.
> > switch(error_handle)
> > {
> > 	case (RETURN_ON_ERROR):
> > }
> > 
> > The PRINT_ERROR_MESSAGE I assume is an escalation from -d 8 in this case.
> > 
> 
> The whole switch_to_proc_kcore() probably shouldn't be conditional on
> the presence of PRINT_ERROR_MESSAGE, only the actual error message
> should be.
> 
> Patch shortly.
> 
> --
> David.

Yeah, I agree.  It was done that way to catch the very first non-QUIET readmem()
call from kernel_init(), and make the bait-and-switch right there.  Without the 
CRASHDEBUG(x) override, it works as-is because the readmem() calls in 
devmem_is_restricted() are purposely set to QUIET.  

So we're thinking something like this, right?:

diff --git a/memory.c b/memory.c
index 824b3ae..2282ba9 100644
--- a/memory.c
+++ b/memory.c
@@ -2207,13 +2207,12 @@ readmem(ulonglong addr, int memtype, void *buffer, long size,
                         goto readmem_error;
 
                case READ_ERROR:
-                        if (PRINT_ERROR_MESSAGE) {
-                               if ((pc->flags & DEVMEM) && (kt->flags & PRE_KERNEL_INIT) &&
-                                   devmem_is_restricted() && switch_to_proc_kcore())
-                                       return(readmem(addr, memtype, bufptr, size,
-                                               type, error_handle));
+                       if ((pc->flags & DEVMEM) && (kt->flags & PRE_KERNEL_INIT) && 
+                           !(error_handle & QUIET) && devmem_is_restricted() && switch_to_proc_kcore())
+                               return(readmem(addr, memtype, bufptr, size,
+                                       type, error_handle));
+                       if (PRINT_ERROR_MESSAGE)
                                error(INFO, READ_ERRMSG, memtype_string(memtype, 0), addr, type);
-                       }
                         goto readmem_error;
 
                case PAGE_EXCLUDED:

Works for me, and is better than hiding a recursive-call check in devmem_is_restricted().

Dave






More information about the Crash-utility mailing list