lkml.org 
[lkml]   [2010]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 32/35] fs: icache minimise I_FREEING latency
    Problem with inode reclaim is that it puts inodes into I_FREEING state
    and then continues to gather more, during which it may iput,
    invalidate_mapping_pages, be preempted, etc. Holding these inodes in
    I_FREEING can cause pauses.

    After the inode scalability work, there is not a big reason to batch
    up inodes to reclaim them, so dispose them as they are found from the
    LRU.

    Signed-off-by: Nick Piggin <npiggin@kernel.dk>

    ---
    fs/inode.c | 32 ++++++++++++++++++++------------
    1 file changed, 20 insertions(+), 12 deletions(-)

    Index: linux-2.6/fs/inode.c
    ===================================================================
    --- linux-2.6.orig/fs/inode.c 2010-10-19 14:19:00.000000000 +1100
    +++ linux-2.6/fs/inode.c 2010-10-19 14:19:18.000000000 +1100
    @@ -410,6 +410,19 @@

    static void inode_sb_list_del(struct inode *inode);

    +static void dispose_one_inode(struct inode *inode)
    +{
    + evict(inode);
    +
    + spin_lock(&inode->i_lock);
    + __remove_inode_hash(inode);
    + inode_sb_list_del(inode);
    + spin_unlock(&inode->i_lock);
    +
    + wake_up_inode(inode);
    + destroy_inode(inode);
    +}
    +
    /*
    * dispose_list - dispose of the contents of a local list
    * @head: the head of the list to free
    @@ -425,15 +438,8 @@
    inode = list_first_entry(head, struct inode, i_lru);
    list_del_init(&inode->i_lru);

    - evict(inode);
    -
    - spin_lock(&inode->i_lock);
    - __remove_inode_hash(inode);
    - inode_sb_list_del(inode);
    - spin_unlock(&inode->i_lock);
    -
    - wake_up_inode(inode);
    - destroy_inode(inode);
    + dispose_one_inode(inode);
    + cond_resched();
    }
    }

    @@ -557,7 +563,6 @@
    */
    static void prune_icache(struct zone *zone, unsigned long nr_to_scan)
    {
    - LIST_HEAD(freeable);
    unsigned long reap = 0;

    down_read(&iprune_sem);
    @@ -617,11 +622,15 @@
    continue;
    }
    freeable:
    - list_move(&inode->i_lru, &freeable);
    + list_del_init(&inode->i_lru);
    WARN_ON(inode->i_state & I_NEW);
    inode->i_state |= I_FREEING;
    spin_unlock(&inode->i_lock);
    zone->inode_nr_lru--;
    + spin_unlock(&zone->inode_lru_lock);
    + dispose_one_inode(inode);
    + cond_resched();
    + spin_lock(&zone->inode_lru_lock);
    }
    if (current_is_kswapd())
    __count_vm_events(KSWAPD_INODESTEAL, reap);
    @@ -629,7 +638,6 @@
    __count_vm_events(PGINODESTEAL, reap);
    spin_unlock(&zone->inode_lru_lock);

    - dispose_list(&freeable);
    up_read(&iprune_sem);
    }




    \
     
     \ /
      Last update: 2010-10-19 05:59    [W:2.340 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site