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>
next prev parent 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