lkml.org 
[lkml]   [2012]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/11] nfs: Prevent page allocator recursions with swap over NFS.
    Date
    GFP_NOFS is _more_ permissive than GFP_NOIO in that it will initiate
    IO, just not of any filesystem data.

    The problem is that previously NOFS was correct because that avoids
    recursion into the NFS code. With swap-over-NFS, it is no longer
    correct as swap IO can lead to this recursion.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: Mel Gorman <mgorman@suse.de>
    ---
    fs/nfs/pagelist.c | 2 +-
    fs/nfs/write.c | 7 ++++---
    2 files changed, 5 insertions(+), 4 deletions(-)

    diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
    index 77aa83e..8e80d71 100644
    --- a/fs/nfs/pagelist.c
    +++ b/fs/nfs/pagelist.c
    @@ -29,7 +29,7 @@ static struct kmem_cache *nfs_page_cachep;
    static inline struct nfs_page *
    nfs_page_alloc(void)
    {
    - struct nfs_page *p = kmem_cache_zalloc(nfs_page_cachep, GFP_KERNEL);
    + struct nfs_page *p = kmem_cache_zalloc(nfs_page_cachep, GFP_NOIO);
    if (p)
    INIT_LIST_HEAD(&p->wb_list);
    return p;
    diff --git a/fs/nfs/write.c b/fs/nfs/write.c
    index eea4ec0..c679527 100644
    --- a/fs/nfs/write.c
    +++ b/fs/nfs/write.c
    @@ -52,7 +52,7 @@ 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 = mempool_alloc(nfs_commit_mempool, GFP_NOIO);

    if (p) {
    memset(p, 0, sizeof(*p));
    @@ -72,7 +72,7 @@ EXPORT_SYMBOL_GPL(nfs_commit_free);

    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 = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);

    if (p) {
    memset(p, 0, sizeof(*p));
    @@ -81,7 +81,8 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
    if (pagecount <= ARRAY_SIZE(p->page_array))
    p->pagevec = p->page_array;
    else {
    - p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
    + p->pagevec = kcalloc(pagecount, sizeof(struct page *),
    + GFP_NOIO);
    if (!p->pagevec) {
    mempool_free(p, nfs_wdata_mempool);
    p = NULL;
    --
    1.7.9.2


    \
     
     \ /
      Last update: 2012-04-16 14:21    [W:0.023 / U:31.800 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site