Message ID | f71f8523-cba7-3342-40a7-114abc5d1f51@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [1/4] mm/rmap: fix comments left over from recent changes | expand |
On Wed, Jul 7, 2021 at 1:11 PM Hugh Dickins <hughd@google.com> wrote: > > In the unlikely race case that page_mlock_one() finds VM_LOCKED has been > cleared by the time it got page table lock, page_vma_mapped_walk_done() > must be called before returning, either explicitly, or by a final call > to page_vma_mapped_walk() - otherwise the page table remains locked. > > Fixes: cd62734ca60d ("mm/rmap: split try_to_munlock from try_to_unmap") > Signed-off-by: Hugh Dickins <hughd@google.com> Reviewed-by: Shakeel Butt <shakeelb@google.com>
Thanks Hugh, evidently I missed this when re-adding the VM_LOCKED check back. Reviewed-by: Alistair Popple <apopple@nvidia.com> On Thursday, 8 July 2021 6:11:24 AM AEST Hugh Dickins wrote: > In the unlikely race case that page_mlock_one() finds VM_LOCKED has been > cleared by the time it got page table lock, page_vma_mapped_walk_done() > must be called before returning, either explicitly, or by a final call > to page_vma_mapped_walk() - otherwise the page table remains locked. > > Fixes: cd62734ca60d ("mm/rmap: split try_to_munlock from try_to_unmap") > Signed-off-by: Hugh Dickins <hughd@google.com> > --- > mm/rmap.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/mm/rmap.c b/mm/rmap.c > index 0e83c3be8568..1235368f0628 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1990,14 +1990,13 @@ static bool page_mlock_one(struct page *page, struct vm_area_struct *vma, > * this function is never called when PageDoubleMap(). > */ > mlock_vma_page(page); > + /* > + * No need to scan further once the page is marked > + * as mlocked. > + */ > page_vma_mapped_walk_done(&pvmw); > + return false; > } > - > - /* > - * no need to continue scanning other vma's if the page has > - * been locked. > - */ > - return false; > } > > return true; >
diff --git a/mm/rmap.c b/mm/rmap.c index 0e83c3be8568..1235368f0628 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1990,14 +1990,13 @@ static bool page_mlock_one(struct page *page, struct vm_area_struct *vma, * this function is never called when PageDoubleMap(). */ mlock_vma_page(page); + /* + * No need to scan further once the page is marked + * as mlocked. + */ page_vma_mapped_walk_done(&pvmw); + return false; } - - /* - * no need to continue scanning other vma's if the page has - * been locked. - */ - return false; } return true;
In the unlikely race case that page_mlock_one() finds VM_LOCKED has been cleared by the time it got page table lock, page_vma_mapped_walk_done() must be called before returning, either explicitly, or by a final call to page_vma_mapped_walk() - otherwise the page table remains locked. Fixes: cd62734ca60d ("mm/rmap: split try_to_munlock from try_to_unmap") Signed-off-by: Hugh Dickins <hughd@google.com> --- mm/rmap.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)