All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Glauber Costa <glommer@openvz.org>
Cc: linux-mm@kvack.org, cgroups@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Greg Thelen <gthelen@google.com>,
	kamezawa.hiroyu@jp.fujitsu.com, Michal Hocko <mhocko@suse.cz>,
	Johannes Weiner <hannes@cmpxchg.org>,
	linux-fsdevel@vger.kernel.org, Dave Chinner <dchinner@redhat.com>
Subject: Re: [PATCH v7 04/31] dcache: remove dentries from LRU before putting on dispose list
Date: Tue, 14 May 2013 17:10:46 +1000	[thread overview]
Message-ID: <20130514071046.GH29466@dastard> (raw)
In-Reply-To: <20130514054640.GE29466@dastard>

On Tue, May 14, 2013 at 03:46:40PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> 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
> differently because the dentry isn't on the LRU list.
> 
> [ v2: don't decrement nr unused twice, spotted by Sha Zhengju ]
> [ v7: (dchinner)
> - shrink list leaks dentries when inode/parent can't be locked in
>   dentry_kill().
> - fix the scope of the sb locking inside shrink_dcache_sb()

<sigh>

I need find a dealer that sells better crack.

> @@ -883,9 +923,16 @@ void shrink_dcache_sb(struct super_block *sb)
>  
>  	spin_lock(&sb->s_dentry_lru_lock);
>  	while (!list_empty(&sb->s_dentry_lru)) {
> -		list_splice_init(&sb->s_dentry_lru, &tmp);
> +		/*
> +		 * account for removal here so we don't need to handle it later
> +		 * even though the dentry is no longer on the lru list.
> +		 */
>  		spin_unlock(&sb->s_dentry_lru_lock);
> -		shrink_dentry_list(&tmp);
> +		list_splice_init(&sb->s_dentry_lru, &tmp);
> +		this_cpu_sub(nr_dentry_unused, sb->s_nr_dentry_unused);
> +		sb->s_nr_dentry_unused = 0;
> +
> +		shrink_dcache_list(&tmp);
>  		spin_lock(&sb->s_dentry_lru_lock);

This is now completely wrong. It should end up like this:

	while (!list_empty(&sb->s_dentry_lru)) {
		/*
		 * account for removal here so we don't need to handle it later
		 * even though the dentry is no longer on the lru list.
		 */
		list_splice_init(&sb->s_dentry_lru, &tmp);
		this_cpu_sub(nr_dentry_unused, sb->s_nr_dentry_unused);
		sb->s_nr_dentry_unused = 0;
		spin_unlock(&sb->s_dentry_lru_lock);

		shrink_dcache_list(&tmp);

		spin_lock(&sb->s_dentry_lru_lock);
	}
	spin_unlock(&sb->s_dentry_lru_lock);

-Dave.
-- 
Dave Chinner
david@fromorbit.com

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2013-05-14  7:10 UTC|newest]

Thread overview: 151+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-12 18:13 [PATCH v6 00/31] kmemcg shrinkers Glauber Costa
2013-05-12 18:13 ` Glauber Costa
2013-05-12 18:13 ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 01/31] super: fix calculation of shrinkable objects for small numbers Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 02/31] dcache: convert dentry_stat.nr_unused to per-cpu counters Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 03/31] dentry: move to per-sb LRU locks Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 04/31] dcache: remove dentries from LRU before putting on dispose list Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-14  2:02   ` Dave Chinner
2013-05-14  5:46   ` [PATCH v7 " Dave Chinner
2013-05-14  7:10     ` Dave Chinner [this message]
2013-05-14 12:43     ` Glauber Costa
2013-05-14 12:43       ` Glauber Costa
2013-05-14 12:43       ` Glauber Costa
     [not found]       ` <51923158.7040002-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-05-14 20:32         ` Dave Chinner
2013-05-14 20:32           ` Dave Chinner
2013-05-12 18:13 ` [PATCH v6 05/31] mm: new shrinker API Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 06/31] shrinker: convert superblock shrinkers to new API Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 07/31] list: add a new LRU list type Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-13  9:25   ` Mel Gorman
2013-05-12 18:13 ` [PATCH v6 08/31] inode: convert inode lru list to generic lru list code Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 09/31] dcache: convert to use new lru list infrastructure Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
     [not found]   ` <1368382432-25462-10-git-send-email-glommer-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2013-05-14  6:59     ` Dave Chinner
2013-05-14  6:59       ` Dave Chinner
2013-05-14  7:50       ` Glauber Costa
2013-05-14  7:50         ` Glauber Costa
2013-05-14 14:01       ` Glauber Costa
2013-05-14 14:01         ` Glauber Costa
2013-05-14 14:01         ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 10/31] list_lru: per-node " Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 11/31] shrinker: add node awareness Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 12/31] fs: convert inode and dentry shrinking to be node aware Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
     [not found]   ` <1368382432-25462-13-git-send-email-glommer-GEFAQzZX7r8dnm+yROfE0A@public.gmane.org>
2013-05-14  9:52     ` Dave Chinner
2013-05-14  9:52       ` Dave Chinner
2013-05-15 15:27       ` Glauber Costa
2013-05-15 15:27         ` Glauber Costa
2013-05-15 15:27         ` Glauber Costa
2013-05-16  0:02         ` Dave Chinner
2013-05-16  8:03           ` Glauber Costa
2013-05-16  8:03             ` Glauber Costa
2013-05-16  8:03             ` Glauber Costa
2013-05-16 19:14           ` Glauber Costa
2013-05-16 19:14             ` Glauber Costa
2013-05-17  0:51             ` Dave Chinner
2013-05-17  7:29               ` Glauber Costa
2013-05-17  7:29                 ` Glauber Costa
     [not found]                 ` <5195DC59.8000205-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-05-17 14:49                   ` Glauber Costa
2013-05-17 14:49                     ` Glauber Costa
2013-05-17 14:49                     ` Glauber Costa
     [not found]                     ` <51964381.8010406-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-05-17 22:54                       ` Glauber Costa
2013-05-17 22:54                         ` Glauber Costa
2013-05-17 22:54                         ` Glauber Costa
2013-05-18  3:39                     ` Dave Chinner
2013-05-18  7:20                       ` Glauber Costa
2013-05-18  7:20                         ` Glauber Costa
2013-05-18  7:20                         ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 13/31] xfs: convert buftarg LRU to generic code Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 14/31] xfs: convert dquot cache lru to list_lru Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 15/31] fs: convert fs shrinkers to new scan/count API Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-13  6:12   ` Artem Bityutskiy
     [not found]     ` <1368425530.3208.13.camel-Bxnoe/o8FG+Ef9UqXRslZEEOCMrvLtNR@public.gmane.org>
2013-05-13  7:28       ` Glauber Costa
2013-05-13  7:28         ` Glauber Costa
2013-05-13  7:28         ` Glauber Costa
     [not found]         ` <51909610.1010801-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-05-13  7:43           ` Artem Bityutskiy
2013-05-13  7:43             ` Artem Bityutskiy
2013-05-13 10:36   ` Jan Kara
2013-05-12 18:13 ` [PATCH v6 16/31] drivers: convert shrinkers to new count/scan API Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 17/31] i915: bail out earlier when shrinker cannot acquire mutex Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 18/31] shrinker: convert remaining shrinkers to count/scan API Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 19/31] hugepage: convert huge zero page shrinker to new shrinker API Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 20/31] shrinker: Kill old ->shrink API Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 21/31] vmscan: also shrink slab in memcg pressure Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 22/31] memcg,list_lru: duplicate LRUs upon kmemcg creation Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 23/31] lru: add an element to a memcg list Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 24/31] list_lru: per-memcg walks Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 25/31] memcg: per-memcg kmem shrinking Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 26/31] memcg: scan cache objects hierarchically Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 27/31] vmscan: take at least one pass with shrinkers Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 28/31] super: targeted memcg reclaim Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 29/31] memcg: move initialization to memcg creation Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 30/31] vmpressure: in-kernel notifications Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13 ` [PATCH v6 31/31] memcg: reap dead memcgs upon global memory pressure Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-12 18:13   ` Glauber Costa
2013-05-13  7:14 ` [PATCH v6 00/31] kmemcg shrinkers Dave Chinner
2013-05-13  7:21   ` Dave Chinner
2013-05-13  8:00   ` Glauber Costa
2013-05-13  8:00     ` Glauber Costa
2013-05-13  8:00     ` Glauber Costa
     [not found]     ` <51909D84.7040800-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
2013-05-14  1:48       ` Dave Chinner
2013-05-14  1:48         ` Dave Chinner
2013-05-14  5:22         ` Dave Chinner
2013-05-14  5:45           ` Dave Chinner
2013-05-14  7:38           ` Glauber Costa
2013-05-14  7:38             ` Glauber Costa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130514071046.GH29466@dastard \
    --to=david@fromorbit.com \
    --cc=akpm@linux-foundation.org \
    --cc=cgroups@vger.kernel.org \
    --cc=dchinner@redhat.com \
    --cc=glommer@openvz.org \
    --cc=gthelen@google.com \
    --cc=hannes@cmpxchg.org \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.