freebsd-nq/sys/vm
Alan Cox 8bcd3b1998 Essentially, neither madvise(..., MADV_DONTNEED) nor madvise(..., MADV_FREE)
work.  (Moreover, I don't believe that they have ever worked as intended.)
The explanation is fairly simple.  Both MADV_DONTNEED and MADV_FREE perform
vm_page_dontneed() on each page within the range given to madvise().  This
function moves the page to the inactive queue.  Specifically, if the page is
clean, it is moved to the head of the inactive queue where it is first in
line for processing by the page daemon.  On the other hand, if it is dirty,
it is placed at the tail.  Let's further examine the case in which the page
is clean.  Recall that the page is at the head of the line for processing by
the page daemon.  The expectation of vm_page_dontneed()'s author was that
the page would be transferred from the inactive queue to the cache queue by
the page daemon.  (Once the page is in the cache queue, it is, in effect,
free, that is, it can be reallocated to a new vm object by vm_page_alloc()
if it isn't reactivated quickly enough by a user of the old vm object.)  The
trouble is that nowhere in the execution of either MADV_DONTNEED or
MADV_FREE is either the machine-independent reference flag (PG_REFERENCED)
or the reference bit in any page table entry (PTE) mapping the page cleared.
Consequently, the immediate reaction of the page daemon is to reactivate the
page because it is referenced.  In effect, the madvise() was for naught.
The case in which the page was dirty is not too different.  Instead of being
laundered, the page is reactivated.

Note: The essential difference between MADV_DONTNEED and MADV_FREE is
that MADV_FREE clears a page's dirty field.  So, MADV_FREE is always
executing the clean case above.

This revision changes vm_page_dontneed() to clear both the machine-
independent reference flag (PG_REFERENCED) and the reference bit in all PTEs
mapping the page.

MFC after:	6 weeks
2008-06-06 18:38:43 +00:00
..
default_pager.c
device_pager.c Preset a device object's alignment ("pg_color") based upon the 2008-05-17 16:26:34 +00:00
memguard.c Provide the new argument to kmem_suballoc(). 2008-05-10 23:39:27 +00:00
memguard.h Improve memguard a bit: 2005-12-30 11:45:07 +00:00
phys_pager.c Correct a copy and paste'o in phys_pager.c, we are talking about phys here 2007-10-30 14:48:13 +00:00
pmap.h Retire pmap_addr_hint(). It is no longer used. 2008-05-18 04:16:57 +00:00
redzone.c Modify stack(9) stack_print() and stack_sbuf_print() routines to use new 2007-12-01 22:04:16 +00:00
redzone.h Add buffer corruption protection (RedZone) for kernel's malloc(9). 2006-01-31 11:09:21 +00:00
swap_pager.c add malloc flag to blist so that it can be used in ithread context 2008-05-05 19:48:54 +00:00
swap_pager.h - Move 'struct swdevt' back into swap_pager.h and expose it to userland. 2007-02-07 17:43:11 +00:00
uma_core.c Reintroduce UMA_SLAB_KMAP; however, change its spelling to 2008-04-04 18:41:12 +00:00
uma_dbg.c
uma_dbg.h
uma_int.h Update stale comment on protecting UMA per-CPU caches: we now use 2007-05-09 22:53:34 +00:00
uma.h Reintroduce UMA_SLAB_KMAP; however, change its spelling to 2008-04-04 18:41:12 +00:00
vm_contig.c VOP_LOCK1() (and so VOP_LOCK()) and VOP_UNLOCK() are only used in 2008-01-13 14:44:15 +00:00
vm_extern.h Introduce a new parameter "superpage_align" to kmem_suballoc() that is 2008-05-10 21:46:20 +00:00
vm_fault.c Simplify the inner loop of vm_fault()'s delete-behind heuristic. 2008-03-16 17:37:19 +00:00
vm_glue.c - Make SCHED_STATS more generic by adding a wrapper to create the 2008-04-17 04:20:10 +00:00
vm_init.c Introduce a new parameter "superpage_align" to kmem_suballoc() that is 2008-05-10 21:46:20 +00:00
vm_kern.c Introduce a new parameter "superpage_align" to kmem_suballoc() that is 2008-05-10 21:46:20 +00:00
vm_kern.h The clean_map has been made local to vm_init.c long ago. 2006-11-20 16:23:34 +00:00
vm_map.c Generalize vm_map_find(9)'s parameter "find_space". Specifically, add 2008-05-10 18:55:35 +00:00
vm_map.h Generalize vm_map_find(9)'s parameter "find_space". Specifically, add 2008-05-10 18:55:35 +00:00
vm_meter.c - Relax requirements for p_numthreads, p_threads, p_swtick, and p_nice from 2008-03-19 06:19:01 +00:00
vm_mmap.c To date, our implementation of munmap(2) has required that the 2008-05-24 21:57:16 +00:00
vm_object.c Allow VM object creation in ufs_lookup. (If vfs.vmiodirenable is set) 2008-05-20 19:05:43 +00:00
vm_object.h Allow VM object creation in ufs_lookup. (If vfs.vmiodirenable is set) 2008-05-20 19:05:43 +00:00
vm_page.c Essentially, neither madvise(..., MADV_DONTNEED) nor madvise(..., MADV_FREE) 2008-06-06 18:38:43 +00:00
vm_page.h Rename vm_pageq_requeue() to vm_page_requeue() on account of its recent 2008-03-19 20:24:35 +00:00
vm_pageout.c Rename vm_pageq_requeue() to vm_page_requeue() on account of its recent 2008-03-19 20:24:35 +00:00
vm_pageout.h Make contigmalloc(9)'s page laundering more robust. Specifically, use 2007-11-25 20:37:29 +00:00
vm_pager.c Consider a scenario in which one processor, call it Pt, is performing 2007-08-05 21:04:32 +00:00
vm_pager.h
vm_param.h Fix CTL_VM_NAMES. 2007-10-16 11:32:57 +00:00
vm_phys.c Introduce vm_reserv_reclaim_contig(). This function is used by 2008-04-06 18:09:28 +00:00
vm_phys.h Modify vm_phys_unfree_page() so that it no longer requires the given 2007-12-20 22:45:54 +00:00
vm_reserv.c Introduce vm_reserv_reclaim_contig(). This function is used by 2008-04-06 18:09:28 +00:00
vm_reserv.h Introduce vm_reserv_reclaim_contig(). This function is used by 2008-04-06 18:09:28 +00:00
vm_unix.c
vm_zeroidle.c - Make SCHED_STATS more generic by adding a wrapper to create the 2008-04-17 04:20:10 +00:00
vm.h Add the superpage reservation type. 2007-12-27 17:08:11 +00:00
vnode_pager.c Allow VM object creation in ufs_lookup. (If vfs.vmiodirenable is set) 2008-05-20 19:05:43 +00:00
vnode_pager.h