svn commit: r208589 - head/sys/mips/mips

Alan Cox alc at cs.rice.edu
Fri Jun 4 17:14:17 UTC 2010


C. Jayachandran wrote:
> On Thu, Jun 3, 2010 at 10:33 PM, Alan Cox <alc at cs.rice.edu> wrote:
>   
[snip]
>
>> Add a static counter to pmap_ptpgzone_allocf().  When the counter reaches
>> some not-too-small prime number, don't call vm_phys_alloc_contig(), instead
>> set "m" to NULL and reset the counter to zero.  Setting "m" to NULL should
>> then trigger the vm_contig_grow_cache() call.  Make sense?
>>     
>
> Is this to move the vm_contig_grow_cache() out of the
> pmap_ptpgzone_allocf() and into the function calling uma_zalloc()?  I
> am wondering why the prime number is needed.
>
> Another implementation I had thought about was to have a kernel
> process maintain a pool of direct mapped pages for MIPS. This will be
> woken up if the pool goes below a low water mark - any comments on
> this?
>
>   

Here is how the page table page allocation should be done.  It's not 
much harder than the vm_contig_grow_cache() change.

1. Look at vm/vm_phys.c, in particular, vm_phys_init().  Create a new 
freelist, like      VM_FREELIST_ISADMA, for the direct-mapped memory on 
MIPS.  Perhaps, call it VM_FREELIST_LOWMEM.  The controlling macros 
should be defined in mips/include/vmparam.h.

2. Trivially refactor vm_phys_alloc_pages().  Specifically, take the 
body of the outer for loop and make it a new function, 
vm_phys_alloc_freelist(),  that takes the variable "flind" as a parameter.

3. Eliminate the UMA zone for page table pages.  In place of 
vm_phys_alloc_contig() call your new function with VM_FREELIST_LOWMEM.  
(The vm_contig_grow_cache() remains unchanged.)  Go back to calling 
vm_page_free() to release page table pages.

For the record, the changes that you made to start using a zone for page 
table page allocation introduced at least one possible race condition 
between pmap_remove_pages() and pmap_remove_all().  Specifically, by 
dropping and reacquiring the page queues and pmap lock when you free a 
page table page, you allow a pmap_remove_all() call while 
pmap_remove_pages() is running to leave the variable "npv" in 
pmap_remove_pages() pointing at a freed pv entry.

Regards,
Alan
 



More information about the freebsd-mips mailing list