svn commit: r210460 - head/sys/mips/include

Alan Cox alc at cs.rice.edu
Mon Jul 26 18:06:11 UTC 2010


M. Warner Losh wrote:
> In message: <4C4D3AC1.8080201 at cs.rice.edu>
>             Alan Cox <alc at cs.rice.edu> writes:
> : M. Warner Losh wrote:
> : > In message:
> : > <AANLkTik+BV6u6fNVX8Ntb-G1yF=vEDh6VqB7Xcb5VtD- at mail.gmail.com>
> : >             "Jayachandran C." <c.jayachandran at gmail.com> writes:
> : > : On Sun, Jul 25, 2010 at 10:18 AM, Alan Cox <alc at cs.rice.edu> wrote:
> : > : > Warner Losh wrote:
> : > : >>
> : > : >> Author: imp
> : > : >> Date: Sun Jul 25 04:19:05 2010
> : > : >> New Revision: 210460
> : > : >> URL: http://svn.freebsd.org/changeset/base/210460
> : > : >>
> : > : >> Log:
> : > : >>  Get N64 building by defining VM_FREELIST_DIRECT to be
> : > : >> VM_FREELIST_DEFAULT.  I believe this is correct, since KX is set
> : > in
> : > : >>  n64, and thus all RAM can be direct mapped.
> : > : : Thanks, this is something I missed in my MIPS page table changes.
> : > : : >
> : > : > Yes, it is.
> : > : : In MIPS 64bit, whole physical memory is direct mapped thru a
> : > XKPHYS
> : > : region. We can use vm_page_alloc() for pmap_alloc_pte_page() and
> : > : VM_WAIT for pmap_grow_pte_page_cache(), is this something we should
> : > : consider?
> : >
> : > Likely.  Any idea what kind of performance difference this would buy
> : > us?
> : >   
> : 
> : As long as n64 has a single free list, there is no point in changing
> : pmap_alloc_pte_page() to use vm_page_alloc().  There may, however, be
> : some point to using VM_WAIT in pmap_grow_pte_page_cache(), because
> : vm_contig_grow_cache() is far more aggressive about paging out dirty
> : pages than VM_WAIT is, and VM_WAIT would suffice.
> : 
> : For what it's worth, fixing pmap_change_wiring() and
> : pmap_page_wired_mappings() is almost certainly more important.
>
> what's broken with them now?
>   

pmap_page_wired_mappings() counts the number of pv entries for the 
specified page that have the pv entry wired flag set to TRUE.  
pmap_enter() correctly initializes this flag.  However, 
pmap_change_wiring() doesn't update the corresponding pv entry flag, 
only the PTE.  So, the count returned by pmap_page_wired_mappings() will 
sometimes be wrong.

In other words, that a particular mapping is wired is being redundantly 
stored in two places, the PTE and the pv entry, but these two places are 
not being consistently maintained.

In the short term, the best fix would be to eliminate the pv entry flag 
and use only the PTE.  That flag is wasting non-trivial memory.

However, in the long run, the use of a PTE bit on a wired flag was 
probably a suboptimal choice for MIPS given the scarcity of bits 
available to software.  For example, spending that bit on a PTE_MANAGED 
flag would save a fair number of cycles, especially now that MIPS is 
configured as VM_PHYSSEG_SPARSE.

That said, in closing, I would reiterate that the best fix for the 
foreseeable future is to eliminate the redundant pv entry flag.

Alan



More information about the freebsd-mips mailing list