lkml.org 
[lkml]   [2014]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/5] mm/rmap: share the i_mmap_rwsem
    Date
    Similarly to rmap_walk_anon() and collect_procs_anon(),
    there is opportunity to share the lock in rmap_walk_file()
    and collect_procs_file() for file backed pages.

    Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
    ---
    include/linux/fs.h | 10 ++++++++++
    mm/memory-failure.c | 4 ++--
    mm/rmap.c | 4 ++--
    3 files changed, 14 insertions(+), 4 deletions(-)

    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index 60a1d7d..4c2c228 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -467,6 +467,16 @@ static inline void i_mmap_unlock_write(struct address_space *mapping)
    up_write(&mapping->i_mmap_rwsem);
    }

    +static inline void i_mmap_lock_read(struct address_space *mapping)
    +{
    + down_read(&mapping->i_mmap_rwsem);
    +}
    +
    +static inline void i_mmap_unlock_read(struct address_space *mapping)
    +{
    + up_read(&mapping->i_mmap_rwsem);
    +}
    +
    /*
    * Might pages of this file be mapped into userspace?
    */
    diff --git a/mm/memory-failure.c b/mm/memory-failure.c
    index 1389a28..acbcd8e 100644
    --- a/mm/memory-failure.c
    +++ b/mm/memory-failure.c
    @@ -434,7 +434,7 @@ static void collect_procs_file(struct page *page, struct list_head *to_kill,
    struct task_struct *tsk;
    struct address_space *mapping = page->mapping;

    - i_mmap_lock_write(mapping);
    + i_mmap_lock_read(mapping);
    read_lock(&tasklist_lock);
    for_each_process(tsk) {
    pgoff_t pgoff = page_pgoff(page);
    @@ -456,7 +456,7 @@ static void collect_procs_file(struct page *page, struct list_head *to_kill,
    }
    }
    read_unlock(&tasklist_lock);
    - i_mmap_unlock_write(mapping);
    + i_mmap_unlock_read(mapping);
    }

    /*
    diff --git a/mm/rmap.c b/mm/rmap.c
    index 9a56e4f..5841dcb 100644
    --- a/mm/rmap.c
    +++ b/mm/rmap.c
    @@ -1685,7 +1685,7 @@ static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc)

    if (!mapping)
    return ret;
    - i_mmap_lock_write(mapping);
    + i_mmap_lock_read(mapping);
    vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) {
    unsigned long address = vma_address(page, vma);

    @@ -1708,7 +1708,7 @@ static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc)
    ret = rwc->file_nonlinear(page, mapping, rwc->arg);

    done:
    - i_mmap_unlock_write(mapping);
    + i_mmap_unlock_read(mapping);
    return ret;
    }

    --
    1.8.1.4


    \
     
     \ /
      Last update: 2014-05-23 06:01    [W:5.441 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site