public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jan Blunck <jblunck@suse.de>
To: David Chinner <dgc@sgi.com>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	Balbir Singh <balbir@in.ibm.com>
Subject: Re: [PATCH] Per-superblock unused dentry LRU lists V3
Date: Tue, 30 May 2006 17:04:38 +0200	[thread overview]
Message-ID: <20060530150438.GB4377@hasse.suse.de> (raw)
In-Reply-To: <4de7f8a60605300753j3b1e257u3849b72e7bc4d100@mail.gmail.com>

> David Chinner <dgc@sgi.com> wrote:
>
> +/*
> + * Shrink the dentry LRU on a given superblock.
> + *
> + * If flags is non-zero, we need to do special processing based on
> + * which flags are set. This means we don't need to maintain multiple
> + * similar copies of this loop.
> + */
> +static void __shrink_dcache_sb(struct super_block *sb, int *count, int 
> flags)
> +{
> +       struct dentry *dentry;
> +       int cnt = *count;
> +
> +       spin_lock(&dcache_lock);
> +       while (!list_empty(&sb->s_dentry_lru) && cnt--) {
> +               dentry = list_entry(sb->s_dentry_lru.prev,
> +                                       struct dentry, d_lru);
> +               dentry_lru_del_init(dentry);
> +               BUG_ON(dentry->d_sb != sb);
> +               prefetch(sb->s_dentry_lru.prev);
> +
> +               spin_lock(&dentry->d_lock);
> +               /*
> +                * We found an inuse dentry which was not removed from
> +                * the LRU because of laziness during lookup.  Do not free
> +                * it - just keep it off the LRU list.
> +                */
> +               if (atomic_read(&dentry->d_count)) {
> +                       spin_unlock(&dentry->d_lock);
> +                       continue;
> +               }
> +               /*
> +                * If we are honouring the DCACHE_REFERENCED flag and the
> +                * dentry has this flag set, don't free it. Clear the flag
> +                * and put it back on the LRU
> +                */
> +               if ((flags & DCACHE_REFERENCED) &&
> +                   (dentry->d_flags & DCACHE_REFERENCED)) {
> +                       dentry->d_flags &= ~DCACHE_REFERENCED;
> +                       dentry_lru_add(dentry);
> +                       spin_unlock(&dentry->d_lock);
> +                       continue;
> +               }
> +               prune_one_dentry(dentry);
> +       }
> +       spin_unlock(&dcache_lock);
> +       *count = cnt;
> +}
> +
> /**
>  * shrink_dcache_sb - shrink dcache for a superblock
>  * @sb: superblock
> @@ -507,44 +529,9 @@ static void prune_dcache(int count, stru
>  * is used to free the dcache before unmounting a file
>  * system
>  */
> -
> void shrink_dcache_sb(struct super_block * sb)
> {
> -       struct list_head *tmp, *next;
> -       struct dentry *dentry;
> -
> -       /*
> -        * Pass one ... move the dentries for the specified
> -        * superblock to the most recent end of the unused list.
> -        */
> -       spin_lock(&dcache_lock);
> -       list_for_each_safe(tmp, next, &dentry_unused) {
> -               dentry = list_entry(tmp, struct dentry, d_lru);
> -               if (dentry->d_sb != sb)
> -                       continue;
> -               list_move(tmp, &dentry_unused);
> -       }
> -
> -       /*
> -        * Pass two ... free the dentries for this superblock.
> -        */
> -repeat:
> -       list_for_each_safe(tmp, next, &dentry_unused) {
> -               dentry = list_entry(tmp, struct dentry, d_lru);
> -               if (dentry->d_sb != sb)
> -                       continue;
> -               dentry_stat.nr_unused--;
> -               list_del_init(tmp);
> -               spin_lock(&dentry->d_lock);
> -               if (atomic_read(&dentry->d_count)) {
> -                       spin_unlock(&dentry->d_lock);
> -                       continue;
> -               }
> -               prune_one_dentry(dentry);
> -               cond_resched_lock(&dcache_lock);
> -               goto repeat;
> -       }
> -       spin_unlock(&dcache_lock);
> +       __shrink_dcache_sb(sb, &sb->s_dentry_lru_nr, 0);
> }

This doesn't prune all the dentries on the unused list. The parents of the
pruned dentries are added to the unused list. Therefore just shrinking
sb->s_dentry_lru_nr dentries isn't enough.

Jan

  parent reply	other threads:[~2006-05-30 15:04 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-26  2:35 [PATCH] Per-superblock unused dentry LRU lists V3 David Chinner
2006-05-26  3:01 ` Andrew Morton
2006-05-26  3:49   ` David Chinner
     [not found] ` <4de7f8a60605300753j3b1e257u3849b72e7bc4d100@mail.gmail.com>
2006-05-30 15:04   ` Jan Blunck [this message]
2006-05-31  0:40     ` David Chinner
2006-05-31  2:58       ` Balbir Singh

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=20060530150438.GB4377@hasse.suse.de \
    --to=jblunck@suse.de \
    --cc=balbir@in.ibm.com \
    --cc=dgc@sgi.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox