Skip to content
  • Dave Chinner's avatar
    dcache: remove dentries from LRU before putting on dispose list · dd1f6b2e
    Dave Chinner authored
    
    
    One of the big problems with modifying the way the dcache shrinker and LRU
    implementation works is that the LRU is abused in several ways.  One of
    these is shrink_dentry_list().
    
    Basically, we can move a dentry off the LRU onto a different list without
    doing any accounting changes, and then use dentry_lru_prune() to remove it
    from what-ever list it is now on to do the LRU accounting at that point.
    
    This makes it -really hard- to change the LRU implementation.  The use of
    the per-sb LRU lock serialises movement of the dentries between the
    different lists and the removal of them, and this is the only reason that
    it works.  If we want to break up the dentry LRU lock and lists into, say,
    per-node lists, we remove the only serialisation that allows this lru
    list/dispose list abuse to work.
    
    To make this work effectively, the dispose list has to be isolated from
    the LRU list - dentries have to be removed from the LRU *before* being
    placed on the dispose list.  This means that the LRU accounting and
    isolation is completed before disposal is started, and that means we can
    change the LRU implementation freely in future.
    
    This means that dentries *must* be marked with DCACHE_SHRINK_LIST when
    they are placed on the dispose list so that we don't think that parent
    dentries found in try_prune_one_dentry() are on the LRU when the are
    actually on the dispose list.  This would result in accounting the dentry
    to the LRU a second time.  Hence dentry_lru_del() has to handle the
    DCACHE_SHRINK_LIST case
    
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarGlauber Costa <glommer@openvz.org>
    Cc: "Theodore Ts'o" <tytso@mit.edu>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
    Cc: Arve Hjønnevåg <arve@android.com>
    Cc: Carlos Maiolino <cmaiolino@redhat.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Chuck Lever <chuck.lever@oracle.com>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Gleb Natapov <gleb@redhat.com>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: J. Bruce Fields <bfields@redhat.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Kent Overstreet <koverstreet@google.com>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Marcelo Tosatti <mtosatti@redhat.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Steven Whitehouse <swhiteho@redhat.com>
    Cc: Thomas Hellstrom <thellstrom@vmware.com>
    Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    dd1f6b2e