From: Brian Foster <bfoster@redhat.com>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 14/28] mm: reclaim_state records pages reclaimed, not slabs
Date: Mon, 4 Nov 2019 14:58:05 -0500 [thread overview]
Message-ID: <20191104195805.GE10665@bfoster> (raw)
In-Reply-To: <20191031234618.15403-15-david@fromorbit.com>
On Fri, Nov 01, 2019 at 10:46:04AM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> Add a wrapper to account for page freeing in shrinker reclaim so
> that the high level scanning accounts for all the memory freed
> during a shrinker scan.
>
> No logic changes, just replacing open coded checks with a simple
> wrapper.
>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
Looks straightforward:
Reviewed-by: Brian Foster <bfoster@redhat.com>
> fs/inode.c | 3 +--
> fs/xfs/xfs_buf.c | 4 +---
> include/linux/swap.h | 20 ++++++++++++++++++--
> mm/slab.c | 3 +--
> mm/slob.c | 4 +---
> mm/slub.c | 3 +--
> mm/vmscan.c | 4 ++--
> 7 files changed, 25 insertions(+), 16 deletions(-)
>
> diff --git a/fs/inode.c b/fs/inode.c
> index fef457a42882..a77caf216659 100644
> --- a/fs/inode.c
> +++ b/fs/inode.c
> @@ -764,8 +764,7 @@ static enum lru_status inode_lru_isolate(struct list_head *item,
> __count_vm_events(KSWAPD_INODESTEAL, reap);
> else
> __count_vm_events(PGINODESTEAL, reap);
> - if (current->reclaim_state)
> - current->reclaim_state->reclaimed_slab += reap;
> + current_reclaim_account_pages(reap);
> }
> iput(inode);
> spin_lock(lru_lock);
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index d34e5d2edacd..55b082bc53b3 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -324,9 +324,7 @@ xfs_buf_free(
>
> __free_page(page);
> }
> - if (current->reclaim_state)
> - current->reclaim_state->reclaimed_slab +=
> - bp->b_page_count;
> + current_reclaim_account_pages(bp->b_page_count);
> } else if (bp->b_flags & _XBF_KMEM)
> kmem_free(bp->b_addr);
> _xfs_buf_free_pages(bp);
> diff --git a/include/linux/swap.h b/include/linux/swap.h
> index 063c0c1e112b..72b855fe20b0 100644
> --- a/include/linux/swap.h
> +++ b/include/linux/swap.h
> @@ -126,12 +126,28 @@ union swap_header {
>
> /*
> * current->reclaim_state points to one of these when a task is running
> - * memory reclaim
> + * memory reclaim. It is typically used by shrinkers to return reclaim
> + * information back to the main vmscan loop.
> */
> struct reclaim_state {
> - unsigned long reclaimed_slab;
> + unsigned long reclaimed_pages; /* pages freed by shrinkers */
> };
>
> +/*
> + * When code frees a page that may be run from a memory reclaim context, it
> + * needs to account for the pages it frees so memory reclaim can track them.
> + * Slab memory that is freed is accounted via this mechanism, so this is not
> + * necessary for slab or heap memory being freed. However, if the object being
> + * freed frees pages directly, then those pages should be accounted as well when
> + * in memory reclaim. This helper function takes care accounting for the pages
> + * being reclaimed when it is required.
> + */
> +static inline void current_reclaim_account_pages(int nr_pages)
> +{
> + if (current->reclaim_state)
> + current->reclaim_state->reclaimed_pages += nr_pages;
> +}
> +
> #ifdef __KERNEL__
>
> struct address_space;
> diff --git a/mm/slab.c b/mm/slab.c
> index 66e5d8032bae..419be005f41a 100644
> --- a/mm/slab.c
> +++ b/mm/slab.c
> @@ -1395,8 +1395,7 @@ static void kmem_freepages(struct kmem_cache *cachep, struct page *page)
> page_mapcount_reset(page);
> page->mapping = NULL;
>
> - if (current->reclaim_state)
> - current->reclaim_state->reclaimed_slab += 1 << order;
> + current_reclaim_account_pages(1 << order);
> uncharge_slab_page(page, order, cachep);
> __free_pages(page, order);
> }
> diff --git a/mm/slob.c b/mm/slob.c
> index fa53e9f73893..c54a7eeee86d 100644
> --- a/mm/slob.c
> +++ b/mm/slob.c
> @@ -211,9 +211,7 @@ static void slob_free_pages(void *b, int order)
> {
> struct page *sp = virt_to_page(b);
>
> - if (current->reclaim_state)
> - current->reclaim_state->reclaimed_slab += 1 << order;
> -
> + current_reclaim_account_pages(1 << order);
> mod_node_page_state(page_pgdat(sp), NR_SLAB_UNRECLAIMABLE,
> -(1 << order));
> __free_pages(sp, order);
> diff --git a/mm/slub.c b/mm/slub.c
> index b25c807a111f..478554082079 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -1746,8 +1746,7 @@ static void __free_slab(struct kmem_cache *s, struct page *page)
> __ClearPageSlab(page);
>
> page->mapping = NULL;
> - if (current->reclaim_state)
> - current->reclaim_state->reclaimed_slab += pages;
> + current_reclaim_account_pages(pages);
> uncharge_slab_page(page, order, s);
> __free_pages(page, order);
> }
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 7a8256322150..967e3d3c7748 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -2870,8 +2870,8 @@ static bool shrink_node(pg_data_t *pgdat, struct scan_control *sc)
> } while ((memcg = mem_cgroup_iter(root, memcg, NULL)));
>
> if (reclaim_state) {
> - sc->nr_reclaimed += reclaim_state->reclaimed_slab;
> - reclaim_state->reclaimed_slab = 0;
> + sc->nr_reclaimed += reclaim_state->reclaimed_pages;
> + reclaim_state->reclaimed_pages = 0;
> }
>
> /* Record the subtree's reclaim efficiency */
> --
> 2.24.0.rc0
>
next prev parent reply other threads:[~2019-11-04 19:58 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-31 23:45 [PATCH 00/28] mm, xfs: non-blocking inode reclaim Dave Chinner
2019-10-31 23:45 ` [PATCH 01/28] xfs: Lower CIL flush limit for large logs Dave Chinner
2019-10-31 23:45 ` [PATCH 02/28] xfs: Throttle commits on delayed background CIL push Dave Chinner
2019-11-01 12:04 ` Brian Foster
2019-11-01 21:40 ` Dave Chinner
2019-11-04 22:48 ` Darrick J. Wong
2019-10-31 23:45 ` [PATCH 03/28] xfs: don't allow log IO to be throttled Dave Chinner
2019-10-31 23:45 ` [PATCH 04/28] xfs: Improve metadata buffer reclaim accountability Dave Chinner
2019-11-01 12:05 ` Brian Foster
2019-11-04 23:21 ` Darrick J. Wong
2019-10-31 23:45 ` [PATCH 05/28] xfs: correctly acount for reclaimable slabs Dave Chinner
2019-10-31 23:45 ` [PATCH 06/28] xfs: factor common AIL item deletion code Dave Chinner
2019-11-04 23:16 ` Darrick J. Wong
2019-10-31 23:45 ` [PATCH 07/28] xfs: tail updates only need to occur when LSN changes Dave Chinner
2019-11-04 23:18 ` Darrick J. Wong
2019-10-31 23:45 ` [PATCH 08/28] xfs: factor inode lookup from xfs_ifree_cluster Dave Chinner
2019-11-01 12:05 ` Brian Foster
2019-11-04 23:20 ` Darrick J. Wong
2019-10-31 23:45 ` [PATCH 09/28] mm: directed shrinker work deferral Dave Chinner
2019-11-04 15:25 ` Brian Foster
2019-11-14 20:49 ` Dave Chinner
2019-11-15 17:21 ` Brian Foster
2019-11-18 0:49 ` Dave Chinner
2019-11-19 15:12 ` Brian Foster
2019-10-31 23:46 ` [PATCH 10/28] shrinkers: use defer_work for GFP_NOFS sensitive shrinkers Dave Chinner
2019-10-31 23:46 ` [PATCH 11/28] mm: factor shrinker work calculations Dave Chinner
2019-11-02 10:55 ` kbuild test robot
2019-11-04 15:29 ` Brian Foster
2019-11-14 20:59 ` Dave Chinner
2019-10-31 23:46 ` [PATCH 12/28] shrinker: defer work only to kswapd Dave Chinner
2019-11-04 15:29 ` Brian Foster
2019-11-14 21:11 ` Dave Chinner
2019-11-15 17:23 ` Brian Foster
2019-10-31 23:46 ` [PATCH 13/28] shrinker: clean up variable types and tracepoints Dave Chinner
2019-11-04 15:30 ` Brian Foster
2019-10-31 23:46 ` [PATCH 14/28] mm: reclaim_state records pages reclaimed, not slabs Dave Chinner
2019-11-04 19:58 ` Brian Foster [this message]
2019-10-31 23:46 ` [PATCH 15/28] mm: back off direct reclaim on excessive shrinker deferral Dave Chinner
2019-11-04 19:58 ` Brian Foster
2019-11-14 21:28 ` Dave Chinner
2019-10-31 23:46 ` [PATCH 16/28] mm: kswapd backoff for shrinkers Dave Chinner
2019-11-04 19:58 ` Brian Foster
2019-11-14 21:41 ` Dave Chinner
2019-10-31 23:46 ` [PATCH 17/28] xfs: synchronous AIL pushing Dave Chinner
2019-11-05 17:05 ` Brian Foster
2019-10-31 23:46 ` [PATCH 18/28] xfs: don't block kswapd in inode reclaim Dave Chinner
2019-10-31 23:46 ` [PATCH 19/28] xfs: reduce kswapd blocking on inode locking Dave Chinner
2019-11-05 17:05 ` Brian Foster
2019-10-31 23:46 ` [PATCH 20/28] xfs: kill background reclaim work Dave Chinner
2019-11-05 17:05 ` Brian Foster
2019-10-31 23:46 ` [PATCH 21/28] xfs: use AIL pushing for inode reclaim IO Dave Chinner
2019-11-05 17:06 ` Brian Foster
2019-10-31 23:46 ` [PATCH 22/28] xfs: remove mode from xfs_reclaim_inodes() Dave Chinner
2019-10-31 23:46 ` [PATCH 23/28] xfs: track reclaimable inodes using a LRU list Dave Chinner
2019-10-31 23:46 ` [PATCH 24/28] xfs: reclaim inodes from the LRU Dave Chinner
2019-11-06 17:21 ` Brian Foster
2019-11-14 21:51 ` Dave Chinner
2019-10-31 23:46 ` [PATCH 25/28] xfs: remove unusued old inode reclaim code Dave Chinner
2019-11-06 17:21 ` Brian Foster
2019-10-31 23:46 ` [PATCH 26/28] xfs: use xfs_ail_push_all in xfs_reclaim_inodes Dave Chinner
2019-11-06 17:22 ` Brian Foster
2019-11-14 21:53 ` Dave Chinner
2019-10-31 23:46 ` [PATCH 27/28] rwsem: introduce down/up_write_non_owner Dave Chinner
2019-10-31 23:46 ` [PATCH 28/28] xfs: rework unreferenced inode lookups Dave Chinner
2019-11-06 22:18 ` Brian Foster
2019-11-14 22:16 ` Dave Chinner
2019-11-15 13:13 ` Christoph Hellwig
2019-11-15 17:26 ` Brian Foster
2019-11-18 1:00 ` Dave Chinner
2019-11-19 15:13 ` Brian Foster
2019-11-19 21:18 ` Dave Chinner
2019-11-20 12:42 ` Brian Foster
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=20191104195805.GE10665@bfoster \
--to=bfoster@redhat.com \
--cc=david@fromorbit.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@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;
as well as URLs for NNTP newsgroup(s).