From: Davidlohr Bueso Date: Sat, 13 Dec 2014 00:54:27 +0000 (-0800) Subject: mm/rmap: share the i_mmap_rwsem X-Git-Tag: v3.19-rc1~93^2~93 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=3dec0ba0be6a532cac949e02b853021bf6d57dad;p=~emulex%2Finfiniband.git mm/rmap: share the i_mmap_rwsem Similarly to the anon memory counterpart, we can share the mapping's lock ownership as the interval tree is not modified when doing doing the walk, only the file page. Signed-off-by: Davidlohr Bueso Acked-by: Rik van Riel Acked-by: "Kirill A. Shutemov" Acked-by: Hugh Dickins Cc: Oleg Nesterov Acked-by: Peter Zijlstra (Intel) Cc: Srikar Dronamraju Acked-by: Mel Gorman Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/include/linux/fs.h b/include/linux/fs.h index 6abcd0b72ae..1d1838de688 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -478,6 +478,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/rmap.c b/mm/rmap.c index 18247f89f1a..14ad2b3b0f5 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1690,7 +1690,8 @@ 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); @@ -1711,9 +1712,8 @@ static int rmap_walk_file(struct page *page, struct rmap_walk_control *rwc) goto done; ret = rwc->file_nonlinear(page, mapping, rwc->arg); - done: - i_mmap_unlock_write(mapping); + i_mmap_unlock_read(mapping); return ret; }