linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	netdev@vger.kernel.org, trond.myklebust@fys.uio.no,
	Daniel Lezcano <dlezcano@fr.ibm.com>,
	Pekka Enberg <penberg@cs.helsinki.fi>, Neil Brown <neilb@suse.de>
Subject: Re: [PATCH 26/30] nfs: remove mempools
Date: Thu, 24 Jul 2008 16:53:01 +0200	[thread overview]
Message-ID: <1216911181.7257.340.camel@twins> (raw)
In-Reply-To: <200807250046.10392.nickpiggin@yahoo.com.au>

On Fri, 2008-07-25 at 00:46 +1000, Nick Piggin wrote:
> On Friday 25 July 2008 00:01, Peter Zijlstra wrote:
> > With the introduction of the shared dirty page accounting in .19, NFS
> > should not be able to surpise the VM with all dirty pages. Thus it should
> > always be able to free some memory. Hence no more need for mempools.
> 
> It seems like a very backward step to me to go from a hard guarantee
> to some heuristic that could break for someone in some particular
> setup.
> 
> Filling with dirty pages isn't the only way to exaust free reclaimable
> memory remember, it can also happen maybe due to mlock or kernel
> allocations.
> 
> Is there pressing reason to remove them?

There was some funny interaction between mempools and PF_MEMALLOC as
used to write out swap pages iirc.

Specifially, the mempool would strip it and not provide memory even
though we needed it.

I've never hit a deadlock due to this patch in my testing, although
admittedly there might be a hole in my testing.

I can either 'fix' mempools, or replace it with the reserve framework
introduced earlier in this patch-set.

> > Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
> > ---
> >  fs/nfs/read.c  |   15 +++------------
> >  fs/nfs/write.c |   27 +++++----------------------
> >  2 files changed, 8 insertions(+), 34 deletions(-)
> >
> > Index: linux-2.6/fs/nfs/read.c
> > ===================================================================
> > --- linux-2.6.orig/fs/nfs/read.c
> > +++ linux-2.6/fs/nfs/read.c
> > @@ -33,13 +33,10 @@ static const struct rpc_call_ops nfs_rea
> >  static const struct rpc_call_ops nfs_read_full_ops;
> >
> >  static struct kmem_cache *nfs_rdata_cachep;
> > -static mempool_t *nfs_rdata_mempool;
> > -
> > -#define MIN_POOL_READ	(32)
> >
> >  struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
> >  {
> > -	struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, GFP_NOFS);
> > +	struct nfs_read_data *p = kmem_cache_alloc(nfs_rdata_cachep, GFP_NOFS);
> >
> >  	if (p) {
> >  		memset(p, 0, sizeof(*p));
> > @@ -50,7 +47,7 @@ struct nfs_read_data *nfs_readdata_alloc
> >  		else {
> >  			p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
> >  			if (!p->pagevec) {
> > -				mempool_free(p, nfs_rdata_mempool);
> > +				kmem_cache_free(nfs_rdata_cachep, p);
> >  				p = NULL;
> >  			}
> >  		}
> > @@ -62,7 +59,7 @@ static void nfs_readdata_free(struct nfs
> >  {
> >  	if (p && (p->pagevec != &p->page_array[0]))
> >  		kfree(p->pagevec);
> > -	mempool_free(p, nfs_rdata_mempool);
> > +	kmem_cache_free(nfs_rdata_cachep, p);
> >  }
> >
> >  void nfs_readdata_release(void *data)
> > @@ -614,16 +611,10 @@ int __init nfs_init_readpagecache(void)
> >  	if (nfs_rdata_cachep == NULL)
> >  		return -ENOMEM;
> >
> > -	nfs_rdata_mempool = mempool_create_slab_pool(MIN_POOL_READ,
> > -						     nfs_rdata_cachep);
> > -	if (nfs_rdata_mempool == NULL)
> > -		return -ENOMEM;
> > -
> >  	return 0;
> >  }
> >
> >  void nfs_destroy_readpagecache(void)
> >  {
> > -	mempool_destroy(nfs_rdata_mempool);
> >  	kmem_cache_destroy(nfs_rdata_cachep);
> >  }
> > Index: linux-2.6/fs/nfs/write.c
> > ===================================================================
> > --- linux-2.6.orig/fs/nfs/write.c
> > +++ linux-2.6/fs/nfs/write.c
> > @@ -28,9 +28,6 @@
> >
> >  #define NFSDBG_FACILITY		NFSDBG_PAGECACHE
> >
> > -#define MIN_POOL_WRITE		(32)
> > -#define MIN_POOL_COMMIT		(4)
> > -
> >  /*
> >   * Local function declarations
> >   */
> > @@ -45,12 +42,10 @@ static const struct rpc_call_ops nfs_wri
> >  static const struct rpc_call_ops nfs_commit_ops;
> >
> >  static struct kmem_cache *nfs_wdata_cachep;
> > -static mempool_t *nfs_wdata_mempool;
> > -static mempool_t *nfs_commit_mempool;
> >
> >  struct nfs_write_data *nfs_commitdata_alloc(void)
> >  {
> > -	struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, GFP_NOFS);
> > +	struct nfs_write_data *p = kmem_cache_alloc(nfs_wdata_cachep, GFP_NOFS);
> >
> >  	if (p) {
> >  		memset(p, 0, sizeof(*p));
> > @@ -63,12 +58,12 @@ void nfs_commit_free(struct nfs_write_da
> >  {
> >  	if (p && (p->pagevec != &p->page_array[0]))
> >  		kfree(p->pagevec);
> > -	mempool_free(p, nfs_commit_mempool);
> > +	kmem_cache_free(nfs_wdata_cachep, p);
> >  }
> >
> >  struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
> >  {
> > -	struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, GFP_NOFS);
> > +	struct nfs_write_data *p = kmem_cache_alloc(nfs_wdata_cachep, GFP_NOFS);
> >
> >  	if (p) {
> >  		memset(p, 0, sizeof(*p));
> > @@ -79,7 +74,7 @@ struct nfs_write_data *nfs_writedata_all
> >  		else {
> >  			p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
> >  			if (!p->pagevec) {
> > -				mempool_free(p, nfs_wdata_mempool);
> > +				kmem_cache_free(nfs_wdata_cachep, p);
> >  				p = NULL;
> >  			}
> >  		}
> > @@ -91,7 +86,7 @@ static void nfs_writedata_free(struct nf
> >  {
> >  	if (p && (p->pagevec != &p->page_array[0]))
> >  		kfree(p->pagevec);
> > -	mempool_free(p, nfs_wdata_mempool);
> > +	kmem_cache_free(nfs_wdata_cachep, p);
> >  }
> >
> >  void nfs_writedata_release(void *data)
> > @@ -1552,16 +1547,6 @@ int __init nfs_init_writepagecache(void)
> >  	if (nfs_wdata_cachep == NULL)
> >  		return -ENOMEM;
> >
> > -	nfs_wdata_mempool = mempool_create_slab_pool(MIN_POOL_WRITE,
> > -						     nfs_wdata_cachep);
> > -	if (nfs_wdata_mempool == NULL)
> > -		return -ENOMEM;
> > -
> > -	nfs_commit_mempool = mempool_create_slab_pool(MIN_POOL_COMMIT,
> > -						      nfs_wdata_cachep);
> > -	if (nfs_commit_mempool == NULL)
> > -		return -ENOMEM;
> > -
> >  	/*
> >  	 * NFS congestion size, scale with available memory.
> >  	 *
> > @@ -1587,8 +1572,6 @@ int __init nfs_init_writepagecache(void)
> >
> >  void nfs_destroy_writepagecache(void)
> >  {
> > -	mempool_destroy(nfs_commit_mempool);
> > -	mempool_destroy(nfs_wdata_mempool);
> >  	kmem_cache_destroy(nfs_wdata_cachep);
> >  }

--
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:[~2008-07-24 14:53 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-24 14:00 [PATCH 00/30] Swap over NFS -v18 Peter Zijlstra
2008-07-24 14:00 ` [PATCH 01/30] swap over network documentation Peter Zijlstra, Neil Brown
2008-07-24 14:00 ` [PATCH 02/30] mm: gfp_to_alloc_flags() Peter Zijlstra
2008-08-12  5:01   ` Neil Brown
2008-08-12  7:33     ` Peter Zijlstra
2008-08-12  9:33       ` Neil Brown
2008-07-24 14:00 ` [PATCH 03/30] mm: tag reseve pages Peter Zijlstra
2008-07-24 14:00 ` [PATCH 04/30] mm: slub: trivial cleanups Peter Zijlstra
2008-07-28  9:43   ` Pekka Enberg
2008-07-28 10:19     ` Peter Zijlstra
2008-07-30 13:59       ` Christoph Lameter
2008-07-30 14:13         ` Peter Zijlstra
2008-07-29 22:15   ` Pekka Enberg
2008-07-24 14:00 ` [PATCH 05/30] mm: slb: add knowledge of reserve pages Peter Zijlstra
2008-08-12  5:35   ` Neil Brown
2008-08-12  7:22     ` Peter Zijlstra
2008-08-12  9:35       ` Neil Brown
2008-08-12 10:23         ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 06/30] mm: kmem_alloc_estimate() Peter Zijlstra
2008-07-30 12:21   ` Pekka Enberg
2008-07-30 13:31     ` Peter Zijlstra
2008-07-30 20:02       ` Christoph Lameter
2008-07-24 14:00 ` [PATCH 07/30] mm: allow PF_MEMALLOC from softirq context Peter Zijlstra
2008-07-24 14:00 ` [PATCH 08/30] mm: serialize access to min_free_kbytes Peter Zijlstra
2008-07-30 12:36   ` Pekka Enberg
2008-07-24 14:00 ` [PATCH 09/30] mm: emergency pool Peter Zijlstra
2008-07-24 14:00 ` [PATCH 10/30] mm: system wide ALLOC_NO_WATERMARK Peter Zijlstra
2008-07-24 14:00 ` [PATCH 11/30] mm: __GFP_MEMALLOC Peter Zijlstra
2008-07-25  9:29   ` KOSAKI Motohiro
2008-07-25  9:35     ` Peter Zijlstra
2008-07-25  9:39       ` KOSAKI Motohiro
2008-07-24 14:00 ` [PATCH 12/30] mm: memory reserve management Peter Zijlstra
2008-07-28 10:06   ` Pekka Enberg
2008-07-28 10:17     ` Peter Zijlstra
2008-07-28 10:29       ` Pekka Enberg
2008-07-28 10:39         ` Peter Zijlstra
2008-07-28 10:41           ` Pekka Enberg
2008-07-28 16:59           ` Matt Mackall
2008-07-28 17:13             ` Peter Zijlstra
2008-07-28 16:49     ` Matt Mackall
2008-07-28 17:13       ` Peter Zijlstra
2008-08-12  6:23   ` Neil Brown
2008-08-12  8:10     ` Peter Zijlstra
2008-08-12  7:46   ` Neil Brown
2008-08-12  8:12     ` Peter Zijlstra
2008-07-24 14:00 ` [PATCH 13/30] selinux: tag avc cache alloc as non-critical Peter Zijlstra
2008-07-24 14:00 ` [PATCH 14/30] net: wrap sk->sk_backlog_rcv() Peter Zijlstra
2008-07-24 14:00 ` [PATCH 15/30] net: packet split receive api Peter Zijlstra
2008-07-24 14:00 ` [PATCH 16/30] net: sk_allocation() - concentrate socket related allocations Peter Zijlstra
2008-07-24 14:00 ` [PATCH 17/30] netvm: network reserve infrastructure Peter Zijlstra
2008-07-24 14:01 ` [PATCH 18/30] netvm: INET reserves Peter Zijlstra
2008-10-01 11:38   ` Daniel Lezcano
2008-10-01 18:56     ` Peter Zijlstra
2008-07-24 14:01 ` [PATCH 19/30] netvm: hook skb allocation to reserves Peter Zijlstra
2008-07-24 14:01 ` [PATCH 20/30] netvm: filter emergency skbs Peter Zijlstra
2008-07-24 14:01 ` [PATCH 21/30] netvm: prevent a stream specific deadlock Peter Zijlstra
2008-07-24 14:01 ` [PATCH 22/30] netfilter: NF_QUEUE vs emergency skbs Peter Zijlstra
2008-07-24 14:01 ` [PATCH 23/30] netvm: skb processing Peter Zijlstra
2008-07-24 14:01 ` [PATCH 24/30] mm: add support for non block device backed swap files Peter Zijlstra
2008-07-24 14:01 ` [PATCH 25/30] mm: methods for teaching filesystems about PG_swapcache pages Peter Zijlstra
2008-07-24 14:01 ` [PATCH 26/30] nfs: remove mempools Peter Zijlstra
2008-07-24 14:46   ` Nick Piggin
2008-07-24 14:53     ` Peter Zijlstra [this message]
2008-07-24 14:01 ` [PATCH 27/30] nfs: teach the NFS client how to treat PG_swapcache pages Peter Zijlstra
2008-07-24 14:01 ` [PATCH 28/30] nfs: disable data cache revalidation for swapfiles Peter Zijlstra
2008-07-24 14:01 ` [PATCH 29/30] nfs: enable swap on NFS Peter Zijlstra
2008-07-24 14:01 ` [PATCH 30/30] nfs: fix various memory recursions possible with swap over NFS Peter Zijlstra
2008-07-25 10:46   ` KOSAKI Motohiro
2008-07-25 10:57     ` Peter Zijlstra
2008-07-25 11:15       ` KOSAKI Motohiro
2008-07-25 11:19         ` Peter Zijlstra
2008-09-30 12:41 ` [PATCH 00/30] Swap over NFS -v18 Peter Zijlstra
2008-09-30 15:46   ` Daniel Lezcano
  -- strict thread matches above, loose matches on Subject: below --
2008-03-20 20:10 [PATCH 00/30] Swap over NFS -v17 Peter Zijlstra
2008-03-20 20:11 ` [PATCH 26/30] nfs: remove mempools Peter Zijlstra

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=1216911181.7257.340.camel@twins \
    --to=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=dlezcano@fr.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=neilb@suse.de \
    --cc=netdev@vger.kernel.org \
    --cc=nickpiggin@yahoo.com.au \
    --cc=penberg@cs.helsinki.fi \
    --cc=torvalds@linux-foundation.org \
    --cc=trond.myklebust@fys.uio.no \
    /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