From: Alex Elder <aelder@sgi.com>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, xfs@oss.sgi.com
Subject: Re: [PATCH 2/3] xfs: convert inode shrinker to per-filesystem contexts
Date: Tue, 20 Jul 2010 14:30:11 -0500 [thread overview]
Message-ID: <1279654211.1859.235.camel@doink> (raw)
In-Reply-To: <1279194418-16119-3-git-send-email-david@fromorbit.com>
On Thu, 2010-07-15 at 21:46 +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> Now the shrinker passes us a context, wire up a shrinker context per
> filesystem. This allows us to remove the global mount list and the
> locking problems that introduced. It also means that a shrinker call
> does not need to traverse clean filesystems before finding a
> filesystem with reclaimable inodes. This significantly reduces
> scanning overhead when lots of filesystems are present.
>
I have a comment below about an optimization you made.
It's not necessarily a bug, but I thought I'd call
attention to it anyway.
Outside of that it looks good to me.
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/linux-2.6/xfs_super.c | 2 -
> fs/xfs/linux-2.6/xfs_sync.c | 62 +++++++++--------------------------------
> fs/xfs/linux-2.6/xfs_sync.h | 2 -
> fs/xfs/xfs_mount.h | 2 +-
> 4 files changed, 15 insertions(+), 53 deletions(-)
. . .
> diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c
> index be37582..f433819 100644
> --- a/fs/xfs/linux-2.6/xfs_sync.c
> +++ b/fs/xfs/linux-2.6/xfs_sync.c
> @@ -828,14 +828,7 @@ xfs_reclaim_inodes(
>
> /*
> * Shrinker infrastructure.
> - *
> - * This is all far more complex than it needs to be. It adds a global list of
> - * mounts because the shrinkers can only call a global context. We need to make
> - * the shrinkers pass a context to avoid the need for global state.
> */
> -static LIST_HEAD(xfs_mount_list);
> -static struct rw_semaphore xfs_mount_list_lock;
> -
> static int
> xfs_reclaim_inode_shrink(
> struct shrinker *shrink,
> @@ -847,65 +840,38 @@ xfs_reclaim_inode_shrink(
> xfs_agnumber_t ag;
> int reclaimable = 0;
>
> + mp = container_of(shrink, struct xfs_mount, m_inode_shrink);
> if (nr_to_scan) {
> if (!(gfp_mask & __GFP_FS))
> return -1;
>
> - down_read(&xfs_mount_list_lock);
> - list_for_each_entry(mp, &xfs_mount_list, m_mplist) {
> - xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0,
> + xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0,
> XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan);
> - if (nr_to_scan <= 0)
> - break;
> - }
> - up_read(&xfs_mount_list_lock);
> - }
> + /* if we don't exhaust the scan, don't bother coming back */
> + if (nr_to_scan > 0)
> + return -1;
This short-circuit return here sort of circumvents the
SLABS_SCANNED VM event counting. On the other hand, it
seems to be counting nr_to_scan repeatedly, which isn't
necessarily that meaningful in this case either. (I
don't know how important this is.)
It also means that shrink_slab() under-counts the number
of objects freed. Again, this may not in practice be
an issue--especially since more will have actually been
freed than is claimed.
-Alex
> + }
>
> - down_read(&xfs_mount_list_lock);
> - list_for_each_entry(mp, &xfs_mount_list, m_mplist) {
> - for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) {
> - pag = xfs_perag_get(mp, ag);
> - reclaimable += pag->pag_ici_reclaimable;
> - xfs_perag_put(pag);
> - }
> + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) {
> + pag = xfs_perag_get(mp, ag);
> + reclaimable += pag->pag_ici_reclaimable;
> + xfs_perag_put(pag);
> }
> - up_read(&xfs_mount_list_lock);
> return reclaimable;
> }
>
. . .
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
WARNING: multiple messages have this Message-ID (diff)
From: Alex Elder <aelder@sgi.com>
To: Dave Chinner <david@fromorbit.com>
Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH 2/3] xfs: convert inode shrinker to per-filesystem contexts
Date: Tue, 20 Jul 2010 14:30:11 -0500 [thread overview]
Message-ID: <1279654211.1859.235.camel@doink> (raw)
In-Reply-To: <1279194418-16119-3-git-send-email-david@fromorbit.com>
On Thu, 2010-07-15 at 21:46 +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> Now the shrinker passes us a context, wire up a shrinker context per
> filesystem. This allows us to remove the global mount list and the
> locking problems that introduced. It also means that a shrinker call
> does not need to traverse clean filesystems before finding a
> filesystem with reclaimable inodes. This significantly reduces
> scanning overhead when lots of filesystems are present.
>
I have a comment below about an optimization you made.
It's not necessarily a bug, but I thought I'd call
attention to it anyway.
Outside of that it looks good to me.
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/linux-2.6/xfs_super.c | 2 -
> fs/xfs/linux-2.6/xfs_sync.c | 62 +++++++++--------------------------------
> fs/xfs/linux-2.6/xfs_sync.h | 2 -
> fs/xfs/xfs_mount.h | 2 +-
> 4 files changed, 15 insertions(+), 53 deletions(-)
. . .
> diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c
> index be37582..f433819 100644
> --- a/fs/xfs/linux-2.6/xfs_sync.c
> +++ b/fs/xfs/linux-2.6/xfs_sync.c
> @@ -828,14 +828,7 @@ xfs_reclaim_inodes(
>
> /*
> * Shrinker infrastructure.
> - *
> - * This is all far more complex than it needs to be. It adds a global list of
> - * mounts because the shrinkers can only call a global context. We need to make
> - * the shrinkers pass a context to avoid the need for global state.
> */
> -static LIST_HEAD(xfs_mount_list);
> -static struct rw_semaphore xfs_mount_list_lock;
> -
> static int
> xfs_reclaim_inode_shrink(
> struct shrinker *shrink,
> @@ -847,65 +840,38 @@ xfs_reclaim_inode_shrink(
> xfs_agnumber_t ag;
> int reclaimable = 0;
>
> + mp = container_of(shrink, struct xfs_mount, m_inode_shrink);
> if (nr_to_scan) {
> if (!(gfp_mask & __GFP_FS))
> return -1;
>
> - down_read(&xfs_mount_list_lock);
> - list_for_each_entry(mp, &xfs_mount_list, m_mplist) {
> - xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0,
> + xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0,
> XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan);
> - if (nr_to_scan <= 0)
> - break;
> - }
> - up_read(&xfs_mount_list_lock);
> - }
> + /* if we don't exhaust the scan, don't bother coming back */
> + if (nr_to_scan > 0)
> + return -1;
This short-circuit return here sort of circumvents the
SLABS_SCANNED VM event counting. On the other hand, it
seems to be counting nr_to_scan repeatedly, which isn't
necessarily that meaningful in this case either. (I
don't know how important this is.)
It also means that shrink_slab() under-counts the number
of objects freed. Again, this may not in practice be
an issue--especially since more will have actually been
freed than is claimed.
-Alex
> + }
>
> - down_read(&xfs_mount_list_lock);
> - list_for_each_entry(mp, &xfs_mount_list, m_mplist) {
> - for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) {
> - pag = xfs_perag_get(mp, ag);
> - reclaimable += pag->pag_ici_reclaimable;
> - xfs_perag_put(pag);
> - }
> + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) {
> + pag = xfs_perag_get(mp, ag);
> + reclaimable += pag->pag_ici_reclaimable;
> + xfs_perag_put(pag);
> }
> - up_read(&xfs_mount_list_lock);
> return reclaimable;
> }
>
. . .
WARNING: multiple messages have this Message-ID (diff)
From: Alex Elder <aelder@sgi.com>
To: Dave Chinner <david@fromorbit.com>
Cc: xfs@oss.sgi.com, linux-kernel@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH 2/3] xfs: convert inode shrinker to per-filesystem contexts
Date: Tue, 20 Jul 2010 14:30:11 -0500 [thread overview]
Message-ID: <1279654211.1859.235.camel@doink> (raw)
In-Reply-To: <1279194418-16119-3-git-send-email-david@fromorbit.com>
On Thu, 2010-07-15 at 21:46 +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> Now the shrinker passes us a context, wire up a shrinker context per
> filesystem. This allows us to remove the global mount list and the
> locking problems that introduced. It also means that a shrinker call
> does not need to traverse clean filesystems before finding a
> filesystem with reclaimable inodes. This significantly reduces
> scanning overhead when lots of filesystems are present.
>
I have a comment below about an optimization you made.
It's not necessarily a bug, but I thought I'd call
attention to it anyway.
Outside of that it looks good to me.
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/linux-2.6/xfs_super.c | 2 -
> fs/xfs/linux-2.6/xfs_sync.c | 62 +++++++++--------------------------------
> fs/xfs/linux-2.6/xfs_sync.h | 2 -
> fs/xfs/xfs_mount.h | 2 +-
> 4 files changed, 15 insertions(+), 53 deletions(-)
. . .
> diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c
> index be37582..f433819 100644
> --- a/fs/xfs/linux-2.6/xfs_sync.c
> +++ b/fs/xfs/linux-2.6/xfs_sync.c
> @@ -828,14 +828,7 @@ xfs_reclaim_inodes(
>
> /*
> * Shrinker infrastructure.
> - *
> - * This is all far more complex than it needs to be. It adds a global list of
> - * mounts because the shrinkers can only call a global context. We need to make
> - * the shrinkers pass a context to avoid the need for global state.
> */
> -static LIST_HEAD(xfs_mount_list);
> -static struct rw_semaphore xfs_mount_list_lock;
> -
> static int
> xfs_reclaim_inode_shrink(
> struct shrinker *shrink,
> @@ -847,65 +840,38 @@ xfs_reclaim_inode_shrink(
> xfs_agnumber_t ag;
> int reclaimable = 0;
>
> + mp = container_of(shrink, struct xfs_mount, m_inode_shrink);
> if (nr_to_scan) {
> if (!(gfp_mask & __GFP_FS))
> return -1;
>
> - down_read(&xfs_mount_list_lock);
> - list_for_each_entry(mp, &xfs_mount_list, m_mplist) {
> - xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0,
> + xfs_inode_ag_iterator(mp, xfs_reclaim_inode, 0,
> XFS_ICI_RECLAIM_TAG, 1, &nr_to_scan);
> - if (nr_to_scan <= 0)
> - break;
> - }
> - up_read(&xfs_mount_list_lock);
> - }
> + /* if we don't exhaust the scan, don't bother coming back */
> + if (nr_to_scan > 0)
> + return -1;
This short-circuit return here sort of circumvents the
SLABS_SCANNED VM event counting. On the other hand, it
seems to be counting nr_to_scan repeatedly, which isn't
necessarily that meaningful in this case either. (I
don't know how important this is.)
It also means that shrink_slab() under-counts the number
of objects freed. Again, this may not in practice be
an issue--especially since more will have actually been
freed than is claimed.
-Alex
> + }
>
> - down_read(&xfs_mount_list_lock);
> - list_for_each_entry(mp, &xfs_mount_list, m_mplist) {
> - for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) {
> - pag = xfs_perag_get(mp, ag);
> - reclaimable += pag->pag_ici_reclaimable;
> - xfs_perag_put(pag);
> - }
> + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) {
> + pag = xfs_perag_get(mp, ag);
> + reclaimable += pag->pag_ici_reclaimable;
> + xfs_perag_put(pag);
> }
> - up_read(&xfs_mount_list_lock);
> return reclaimable;
> }
>
. . .
--
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>
next prev parent reply other threads:[~2010-07-20 19:27 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-15 11:46 [PATCH 0/3] shrinker fixes for XFS for 2.6.35 Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 11:46 ` [PATCH 1/3] mm: add context argument to shrinker callback Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 18:09 ` Christoph Hellwig
2010-07-15 18:09 ` Christoph Hellwig
2010-07-15 18:09 ` Christoph Hellwig
2010-07-20 19:30 ` Alex Elder
2010-07-20 19:30 ` Alex Elder
2010-07-20 19:30 ` Alex Elder
2010-07-20 22:53 ` Dave Chinner
2010-07-20 22:53 ` Dave Chinner
2010-07-20 22:53 ` Dave Chinner
2010-07-15 11:46 ` [PATCH 2/3] xfs: convert inode shrinker to per-filesystem contexts Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 18:10 ` Christoph Hellwig
2010-07-15 18:10 ` Christoph Hellwig
2010-07-15 18:10 ` Christoph Hellwig
2010-07-20 19:30 ` Alex Elder [this message]
2010-07-20 19:30 ` Alex Elder
2010-07-20 19:30 ` Alex Elder
2010-07-15 11:46 ` [PATCH 3/3] xfs: track AGs with reclaimable inodes in per-ag radix tree Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 11:46 ` Dave Chinner
2010-07-15 18:12 ` Christoph Hellwig
2010-07-15 18:12 ` Christoph Hellwig
2010-07-15 18:12 ` Christoph Hellwig
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=1279654211.1859.235.camel@doink \
--to=aelder@sgi.com \
--cc=david@fromorbit.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=xfs@oss.sgi.com \
/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.