mm: Remove i_mmap_lock lockbreak
Hugh says:
"The only significant loser, I think, would be page reclaim (when
concurrent with truncation): could spin for a long time waiting for
the i_mmap_mutex it expects would soon be dropped? "
Counter points:
- cpu contention makes the spin stop (need_resched())
- zap pages should be freeing pages at a higher rate than reclaim
ever can
I think the simplification of the truncate code is definitely worth it.
Effectively reverts: 2aa15890f3
("mm: prevent concurrent
unmap_mapping_range() on the same inode") and takes out the code that
caused its problem.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: David Miller <davem@davemloft.net>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Nick Piggin <npiggin@kernel.dk>
Cc: Namhyung Kim <namhyung@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
e4c70a6629
commit
97a894136f
13
mm/mmap.c
13
mm/mmap.c
@@ -445,10 +445,8 @@ static void vma_link(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
if (vma->vm_file)
|
||||
mapping = vma->vm_file->f_mapping;
|
||||
|
||||
if (mapping) {
|
||||
if (mapping)
|
||||
spin_lock(&mapping->i_mmap_lock);
|
||||
vma->vm_truncate_count = mapping->truncate_count;
|
||||
}
|
||||
|
||||
__vma_link(mm, vma, prev, rb_link, rb_parent);
|
||||
__vma_link_file(vma);
|
||||
@@ -558,16 +556,7 @@ again: remove_next = 1 + (end > next->vm_end);
|
||||
if (!(vma->vm_flags & VM_NONLINEAR))
|
||||
root = &mapping->i_mmap;
|
||||
spin_lock(&mapping->i_mmap_lock);
|
||||
if (importer &&
|
||||
vma->vm_truncate_count != next->vm_truncate_count) {
|
||||
/*
|
||||
* unmap_mapping_range might be in progress:
|
||||
* ensure that the expanding vma is rescanned.
|
||||
*/
|
||||
importer->vm_truncate_count = 0;
|
||||
}
|
||||
if (insert) {
|
||||
insert->vm_truncate_count = vma->vm_truncate_count;
|
||||
/*
|
||||
* Put into prio_tree now, so instantiated pages
|
||||
* are visible to arm/parisc __flush_dcache_page
|
||||
|
Reference in New Issue
Block a user