Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 02 Dec 2010 11:54:52 -0600
From:      Alan Cox <alc@rice.edu>
To:        Warner Losh <imp@bsdimp.com>
Cc:        Alan Cox <alc@cs.rice.edu>, freebsd-mips@freebsd.org
Subject:   Re: vm_page_startup()
Message-ID:  <4CF7DD6C.6020303@rice.edu>
In-Reply-To: <4CF71F79.3020500@bsdimp.com>
References:  <4CF5E518.20508@rice.edu> <4CF71F79.3020500@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Warner Losh wrote:
> On 11/30/2010 23:03, Alan Cox wrote:
>> Given this bit of code in the MIPS pmap:
>>
>> vm_offset_t
>> pmap_map(vm_offset_t *virt, vm_offset_t start, vm_offset_t end, int 
>> prot)
>> {
>>    vm_offset_t va, sva;
>>
>>    if (MIPS_DIRECT_MAPPABLE(end))
>>        return (MIPS_PHYS_TO_DIRECT(start));
> All mips architectures have at least a small direct map...

vm_page_startup() places the data structures that it allocates and 
initializes at the upper end of the largest contiguous chunk of physical 
memory.  So, machines with minimal physical memory will wind up using 
"direct mappable" memory and obviously 64-bit machines will do so as 
well.  It is the machines "in the middle", i.e., with more than 512MB 
but not 64-bit, that will wind up not using the direct map here.

Doesn't the above test have an off-by-error, specifically, shouldn't it 
be "MIPS_DIRECT_MAPPABLE(end - 1)"?
 
>
>> The following in vm_page_startup() can apply to MIPS (as well as amd64):
>>
>> #ifdef __amd64__
>>    /*
>>     * pmap_map on amd64 comes out of the direct-map, not kvm like i386,
>>     * so the pages must be tracked for a crashdump to include this data.
>>     * This includes the vm_page_array and the early UMA bootstrap pages.
>>     */
>>    for (pa = new_end; pa < phys_avail[biggestone + 1]; pa += PAGE_SIZE)
>>        dump_add_page(pa);
>> #endif
>>
>> Even if a particular MIPS-based machine didn't wind up using the 
>> direct map for the pmap_map calls in vm_page_startup() there would be 
>> no harm in having called dump_add_page().  On the other hand, if you 
>> don't call dump_add_page() when the direct map is used, you're crash 
>> dump will be missing some kernel data structures.
> So would you suggest having:
>
> #if defined(__mips__) || defined(__amd64__)
>
> or
>
> #if __VM_HAS_DIRECT_MAP
>
> and adding that define to pmap.h for mips and amd64?  I'm leaning to 
> the latter, since I don't like #ifdef arch in vm/* code on general 
> principles, but you're the maintainer...
>

I can live with the former, since it's not really adding a new #ifdef, 
just updating an existing one.  (For the upcoming 8.2-RELEASE, you might 
just want to do this.)

As for the latter, the "right" solution is slightly more complicated.  
There exist architectures, e.g., ia64 and sparc64, that have direct maps 
but don't implement minidumps.  So, there really needs to be two 
#define's, one for each of those features, and then the #if would be:

#if defined(__VM_HAS_DIRECT_MAP) && defined ("implements minidumps")

Alan
 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4CF7DD6C.6020303>