Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Oct 2000 13:10:03 -0800 (PST)
From:      David Greenman <dg@root.com>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: i386/22441: pmap_growkernel() is not effective at kernel vm limit of 0xffc00000 
Message-ID:  <200010312110.NAA92290@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/22441; it has been noted by GNATS.

From: David Greenman <dg@root.com>
To: William J Carpenter <carp@world.std.com>
Cc: freebsd-gnats-submit@FreeBSD.ORG
Subject: Re: i386/22441: pmap_growkernel() is not effective at kernel vm limit of 0xffc00000 
Date: Tue, 31 Oct 2000 13:03:29 -0800

 >I am not sure that what I am doing is strictly necessary, but
 >I can successfully allocate kernel vm this way in BSDI.
 >
 >   but I
 >   should point out that the alternate page table map (APTmap) starts
 >   at 0xffc00000, so I don't see how you could ever use that area of
 >   virtual memory without serious problems. What am I missing?
 >
 >That's good to know.
 >
 >The problem is that 0xffc00000 is passed as a limit to pmap_growkernel().
 >I am not using 0xffc00000, I am using memory up to 0xffc00000 which
 >is the advertised limit to kernel vm. (kernel_map->header.end)
 >
 >(kgdb) print /x * kernel_map
 >$221 = {header = {prev = 0xc02c1d60, next = 0xc02c1f70, start = 0xbfeff000, 
 >    end = 0xffc00000, avail_ssize = 0x0, object = {vm_object = 0x0, 
 >      sub_map = 0x0}, offset = 0x0, eflags = 0x0, protection = 0x0, 
 >    max_protection = 0x0, inheritance = 0x0, wired_count = 0x0, lastr = 0x0}, 
 >  lock = {lk_interlock = {lock_data = 0x0}, lk_flags = 0x1000000, 
 >    lk_sharecount = 0x0, lk_waitcount = 0x0, lk_exclusivecount = 0x0, 
 >    lk_prio = 0x4, lk_wmesg = 0xc0277da0, lk_timo = 0x0, 
 >    lk_lockholder = 0xffffffff}, nentries = 0x9, size = 0x1e531000, 
 >  system_map = 0x1, hint = 0xc02c1d60, timestamp = 0x21, 
 >  first_free = 0xc02c1d00, pmap = 0xc02cf8c0}
 >
 >Pmap_growkernel()'s job is to set-up the physical page mappings to 
 >cover the increased kernel vm.  In order to do this on the i386
 >architecture, a page map directory entry must be made for every
 >4mbytes of memory.  The kernel vm layer rounds vm up to a page
 >boundary.  The physical map layer must round-up a 4mbyte boundary
 >because of the two level i386 page mapping hierarchy.
 >
 >If the vm layer kernel memory limit falls on a page boundary,
 >but not on a page directory boundary, say 0xffb01000, 
 >then as far as physical map layer is concerned, a page directory 
 >entry must be created to cover vm from 0xffb00000 to 0xffbfffff.
 >If the vm layer limit falls on 0xffb00000, this means that
 >the kernel requested vm in the range 0xffaff000 to 0xffafffff.
 >The vm layer rounds this address up to 0xffb00000 and declares
 >that this is the limit for pmap_growkernel().  In the case where
 >the limit is 0xffb00000, pmap_growkernel actually makes a 
 >page directory entry for adresses >= 0xffb00000 -- a harmless
 >sort of overflow which merely sucks up an extra page of memory.
 >In the case where the kernel vm grows to the range of
 >[ 0xffbff001, 0xffc00000-1 ], (the page below 0xffc00000, in this
 >case, kernel vm requested explicitly by me), pmap_growkernel() 
 >overflows by rounding 0xffc0000 up to the next 4m boundary which 
 >on 32-bit machines is 0.
 >
 >I hope this helps explain what I think is a problem.
 
    Your analysis appears to be correct, and using roundup() seems like a fine
 solution. All three rounding expressions in that function need to be changed
 to completely fix the problem.
    Thanks for the bug report!
 
 -DG
 
 David Greenman
 Co-founder, The FreeBSD Project - http://www.freebsd.org
 President, TeraSolutions, Inc. - http://www.terasolutions.com
 Pave the road of life with opportunities.
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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