In particular, I'm trying to figure what's responsible for freeing slab items of type "nfs_inode_cache" and "dentry_cache". Earlier today Lisa gave me the mystery of figuring out why two identical machines (hardware, software, roles, weighting) showed massively different amounts of free memory. (120 MB vs 500 MB). I looked at /proc/slabinfo and saw nfs_inode_cache and dentry_cache incredibly high on one, which I immediately recognized as find(1)'s fault, which was the only machine of ours with that not disabled.
So while I had confidence those cache items in the slabs would be reclaimed when necessary, I wanted to see the magic.
I've been looking at the slab, NFS, fs, and now VM code. Think I found what I was looking for:
mm/vmscan.c:try_to_free_pages -> shrink_slab
It's pretty cool... there's a "shrinker_list" of caches that can be shrunk with callbacks for the VM.
(easily amused at 2am)
So from there:
fs/dcache.c: set_shrinker(DEFAULT_SEEKS, shrink_dcache_memory);
fs/inode.c: set_shrinker(DEFAULT_SEEKS, shrink_icache_memory);
Now I'm curious if there's a way to invoke try_to_free_pages by hand, without waiting for the system memory to get low. I recognize it's not very useful, but I'm just curious.
I should sleep though or I won't get to work on time and be able wear my employee of the month shirt for the ~5th month in a row come May 1st.