Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Jul 2012 21:33:26 -0400
From:      Justin Hibbits <chmeeedalf@gmail.com>
To:        mdf@freebsd.org
Cc:        freebsd-current <freebsd-current@freebsd.org>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Subject:   Re: panic with DEBUG_MEMGUARD on PowerPC
Message-ID:  <307005B6-C8E5-4DCF-BD10-6BC79D8C2FE3@gmail.com>
In-Reply-To: <CAMBSHm-5Xix46MaYAwBek6hWvcOHZ7%2BR_4cpdG5SH_5RD7difQ@mail.gmail.com>
References:  <A3CD63CD-694A-48F5-B0F7-9C8923AFCB90@gmail.com> <CAMBSHm-5Xix46MaYAwBek6hWvcOHZ7%2BR_4cpdG5SH_5RD7difQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Jul 12, 2012, at 9:11 PM, mdf@freebsd.org wrote:

> On Thu, Jul 12, 2012 at 4:43 PM, Justin Hibbits  
> <chmeeedalf@gmail.com> wrote:
>> When tracking down a panic exposed by INVARIANTS, I tried setting
>> DEBUG_MEMGUARD, so I could find the culprit that's trashing freed  
>> memory.
>> However, this causes a panic at bootup.  It shows up right after  
>> the first
>> WARNING: WITNESS message, with the following:
>>
>> panic: kmem_suballoc: bad status return of 3
>> cpuid = 0
>> KDB: stack backtrace:
>> 0xd0004ad0: at kdb_backtrace+0x4c
>> 0xd0004b40: at panic+0x224
>> 0xd0004ba0: at kmem_suballoc+0x8c
>> 0xd0004bd0: at kmeminit+0x1ac
>> 0xd0004c20: at mi_startup+0x13c
>> 0xd0004c50: at btext+0xc0
>>
>> Tracing, and printf() debugging, I see arguments to  
>> vm_map_findspace():
>> start: 0xD0000000, length: 4246446080, and map->max_offset =  
>> 4026531839.
>>
>> Beyond that, I'm lost with tracking this down.  Machine is a dual  
>> processor
>> PowerPC G4, with 2GB RAM.
>
> The length is 0xFD1BA000 which is almost 4GB.  Asking for 4GB of
> virtual space for 2GB of RAM sounds about right (it's been a while
> since I was in this code), unless this is a 32-bit kernel, in which
> case it'd be too much since there isn't that much virtual space
> available.
>
> So, is the kernel 32-bit?  What are the values used and returned by
> memguard_fudge()?  The intent of that routine is to get kmeminit() to
> allocate a larger map so memguard can use part of it for private
> virtual addresses.  But it shouldn't be asking for "too much"; i.e.
> the intent was to check both physical and virtual space available and
> be greedy, but not too greedy.
>
> There were some issues with that code for some platforms that e.g.
> didn't define a VM_KMEM_SIZE_MAX, but alc@ fixed that in r216425.
>
> Thanks,
> matthew

It is a 32-bit kernel, on 32-bit hardware.  The values for  
memguard_fudge are (defaults):

tmp: 4246446080, vm_kmem_size: 117440512, vm_kmem_size_max: 0

When setting vm.kmem_size/vm.kmem_size_max to 2GB they are:

tmp: 2147483648, vm_kmem_size: 214793648, vm_kmem_sizee_max:  
2147483648 (all 2GB).

But the start and map->max_offset remain the same on all runs I make.

- Justin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?307005B6-C8E5-4DCF-BD10-6BC79D8C2FE3>