From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752412AbdHHWI1 (ORCPT ); Tue, 8 Aug 2017 18:08:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39474 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751989AbdHHWI0 (ORCPT ); Tue, 8 Aug 2017 18:08:26 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 47DBA61480 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=jglisse@redhat.com From: jglisse@redhat.com To: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , "Kirill A . Shutemov" Subject: [PATCH] mm/rmap/mmu_notifier: restore mmu_notifier_invalidate_page() semantic Date: Tue, 8 Aug 2017 18:08:20 -0400 Message-Id: <20170808220820.16503-1-jglisse@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 08 Aug 2017 22:08:26 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jérôme Glisse Commit c7ab0d2fdc840266b39db94538f74207ec2afbf6 silently modified semantic of mmu_notifier_invalidate_page() this patch restore it to its previous semantic ie allowing to sleep inside invalidate_page() callback. Signed-off-by: Jérôme Glisse Cc: Kirill A. Shutemov --- mm/rmap.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/mm/rmap.c b/mm/rmap.c index 92070cfd63e9..fc1e2ab194c0 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -888,6 +888,8 @@ static bool page_mkclean_one(struct page *page, struct vm_area_struct *vma, .address = address, .flags = PVMW_SYNC, }; + unsigned long start = address, end = address; + bool invalidate = false; int *cleaned = arg; while (page_vma_mapped_walk(&pvmw)) { @@ -927,11 +929,17 @@ static bool page_mkclean_one(struct page *page, struct vm_area_struct *vma, } if (ret) { - mmu_notifier_invalidate_page(vma->vm_mm, address); + invalidate = true; + end = address; (*cleaned)++; } } + if (invalidate) { + for (address = start; address <= end; address += PAGE_SIZE) + mmu_notifier_invalidate_page(vma->vm_mm, address); + } + return true; } @@ -1324,7 +1332,8 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma, }; pte_t pteval; struct page *subpage; - bool ret = true; + bool ret = true, invalidate = false; + unsigned long start = address, end = address; enum ttu_flags flags = (enum ttu_flags)arg; /* munlock has nothing to gain from examining un-locked vmas */ @@ -1528,8 +1537,15 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma, discard: page_remove_rmap(subpage, PageHuge(page)); put_page(page); - mmu_notifier_invalidate_page(mm, address); + end = address; + invalidate = true; } + + if (invalidate) { + for (address = start; address <= end; address += PAGE_SIZE) + mmu_notifier_invalidate_page(mm, address); + } + return ret; } -- 2.13.4