Subject: port-arm32/5666: arm32 pmap does not free PTs once all mappings are removed
To: None <gnats-bugs@gnats.netbsd.org>
From: Jason R Thorpe <thorpej@nas.nasa.gov>
List: netbsd-bugs
Date: 06/26/1998 15:58:12
>Number:         5666
>Category:       port-arm32
>Synopsis:       arm32 pmap does not free PTs once all mappings are removed
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    gnats-admin (GNATS administrator)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Jun 26 16:20:00 1998
>Last-Modified:
>Originator:     
>Organization:
Numerical Aerospace Simulation Facility - NASA Ames
>Release:        NetBSD 1.3F, June 26, 1998
>Environment:
	
System: NetBSD jaws 1.3F NetBSD 1.3F (JAWS) #1: Fri Jun 26 14:05:13 PDT 1998 thorpej@jaws:/tmp_mnt/dracul/u5/netbsd/src/sys/arch/arm32/compile/JAWS arm32


>Description:
	The arm32 pmap dynamically allocates level 2 page table pages when
	they are needed.  However, it does not track references to these
	tables.  This means that once all of the mappings are removed for
	a particular level 2 table, the page is not freed back to the system,
	until the pmap is destroyed, when the process exits.

	This is a problem if the system goes into a desperate memory
	condition, and begins to swap out processes.  When a process
	is swapped out, the VM system calls pmap_collect() with that
	process's pmap, so that the pmap module can free resources in
	use by that pmap.  Since the pmap module is allowed to "forget"
	mappings for a map at any time, it would be able to pmap_remove()
	the entire user address space of that pmap, thus freeing up the
	level 2 PT pages.  However, since pmap_remove() doesn't free those
	pages back, doing so is useless.

	For an example of how this is done, take a look at the NetBSD/alpha
	pmap module: src/sys/arch/alpha/alpha/pmap.c.

>How-To-Repeat:
	I managed to tickle this by doing a few parallel kernel builds on
	my 32M Shark.  Eventually, the pmap module died because no more
	free pages were available.  It should have been able to hobble
	along a little longer if pages were freed up as it began to swap
	out processes.

>Fix:
	An implementation that tracks PT page references and removes
	mappings (thus freeing pages to the system) in pmap_collect()
	can be found at: src/sys/arch/alpha/alpha/pmap.c.  This could
	be used as an example of how to implement it for the arm32 pmap.
>Audit-Trail:
>Unformatted: