The flag, FAULT_FLAG_ALLOW_RETRY, was introduced by the patch, mm: retry page fault when blocking on disk transfer commit: d065bd810b6deb67d4897a14bfe21f8eb526ba99 for reducing mmap_sem hold times that are caused by waiting for disk transfers when accessing file mapped VMAs. To break COW, handle_mm_fault() is repeated with mmap_sem held, where the introduced flag could be used again. The straight way is to add changes in break_ksm(), but the function could be under write-mode mmap_sem, so it has to be dupilcated. Signed-off-by: Hillf Danton <dhillf@xxxxxxxxx> --- --- a/mm/ksm.c Sat Nov 19 16:08:10 2011 +++ b/mm/ksm.c Sat Nov 19 19:33:49 2011 @@ -394,7 +394,31 @@ static void break_cow(struct rmap_item * goto out; if (!(vma->vm_flags & VM_MERGEABLE) || !vma->anon_vma) goto out; - break_ksm(vma, addr); + for (;;) { + struct page *page; + int ret; + + page = follow_page(vma, addr, FOLL_GET); + if (IS_ERR_OR_NULL(page)) + break; + + if (PageKsm(page)) + ret = handle_mm_fault(mm, vma, addr, + FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_WRITE); + else + ret = VM_FAULT_WRITE; + + put_page(page); + + if (!(ret & (VM_FAULT_WRITE|VM_FAULT_SIGBUS|VM_FAULT_OOM))) { + if (ret & VM_FAULT_RETRY) + down_read(&mm->mmap_sem); + } else { + if (ret & VM_FAULT_RETRY) + return; + break; + } + } out: up_read(&mm->mmap_sem); } -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>