On Fri, Feb 02, 2007 at 10:20:12PM -0800, Christoph Lameter wrote:This is a new variation on the earlier RFC for tracking mlocked pages.
We now mark a mlocked page with a bit in the page flags and remove
them from the LRU. Pages get moved back when no vma that references
the page has VM_LOCKED set anymore.
This means that vmscan no longer uselessly cycles over large amounts
of mlocked memory should someone attempt to mlock large amounts of
memory (may even result in a livelock on large systems).
Synchronization is build around state changes of the PageMlocked bit.
The NR_MLOCK counter is incremented and decremented based on
state transitions of PageMlocked. So the count is accurate.
There is still some unfinished business:
1. We use the 21st page flag and we only have 20 on 32 bit NUMA platforms.
2. Since mlocked pages are now off the LRU page migration will no longer
move them.
3. Use NR_MLOCK to tune various VM behaviors so that the VM does not longer fall due to too many mlocked pages in certain areas.
This patch seems to not handle the cases where more than one process mlocks
a page and you really need a pincount in the page to not release it before
all processes have munlock it or died. I did a similar patch a while
ago and tried to handle it by overloading the lru lists pointers with
a pincount, but at some point I gave up because I couldn't get that part
right.