Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp709516pxv; Thu, 15 Jul 2021 14:06:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/F3zcfa8I5BDM0Hy3Q74E6dzDcMp2kdynOp8jn0La2RmubESS04Ylm7Pqn7wqoopCO9zX X-Received: by 2002:a17:906:5650:: with SMTP id v16mr7620235ejr.533.1626383189224; Thu, 15 Jul 2021 14:06:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626383189; cv=none; d=google.com; s=arc-20160816; b=EUx1gvvMQdmCB9vcfRysa+CZ4Htg9Gzubi9HLX8SgTVtaICwksV8EHXk214E9IHpcb 9DIWLlGSQvuFDHfzK9t83+VtlKAZH0mNOXnAsnXRUXxh48nG6R9h2lZYQ6hKYDAGuA3C TfHXhAOyPft3OqVM0Nb0ndjuT9YZpAhvFkF6iZlqfCioohh8c8iqVwcc5MqysAgfX81H XNdHKANDrHkR+sjvzR2LERHqnR5N4kEj9aikidyW+1mSWFyIswB9q21UBlWzAvGJFQ8C nR+KsLukh1+z8uki/nYwFPoCoe7pc3a1e8Nkxy/ClYJdCTFxxFWyeRV+0ZwJQucJxMTB HAEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=XfmhhruqA71VG9GwzNuS6kHd4b4ITaVCmLm1LUfL/ac=; b=HmJjssbrjjMrTHoCfVMd9RAmWnJGDtCAqJf+DAlfgHUsxNXpCe1B46klcpmyIoXBQi LCwNzr8vKSBnZshBwJplPh/yO6HvRBlCvJ1Gyc6wyU05EZKQIEJl/x05Bv1aTxVAt7sl V9o8o03jv6vEijGe6ZzsD5laAvWc03+La3Q4n9IieHttfblXha3DPUXhOtnuMr3Rfo9/ Ur4mIdLIfoSCaDxWvT1GyD7B0ed2rmVcAEjwc+uhP5DLeTXh2af6ojMR9BN10YrJDc+T DzCPptHVjcXEm3lhIt/YJhH9nwZN0jscuLbDT4SFdoYAxuaoGxxP9hEdCSpN//kpWt4a 6Niw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=AgMf4Pff; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f7si8342388ejj.375.2021.07.15.14.06.06; Thu, 15 Jul 2021 14:06:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=AgMf4Pff; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244695AbhGOTRq (ORCPT + 99 others); Thu, 15 Jul 2021 15:17:46 -0400 Received: from mail.kernel.org ([198.145.29.99]:38862 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243391AbhGOTEW (ORCPT ); Thu, 15 Jul 2021 15:04:22 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 116F2610C7; Thu, 15 Jul 2021 19:00:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626375607; bh=SMo/T7Ka7E8f0cAteUTp8D85XzExdOnkdsf86LhuHO4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AgMf4Pffa6C2BXVbuq0g3uh/c8PuRsetn1I9etGbk6jZ4hly5mt7L46Qmd8B/ZgC/ ZIsgOulPDE6NC0EW93pG5ZGUvUof9IcEkjJ16d6TdRrVPFLc2TjFbyM6eCcGzi4+MO 3yRoRdPZG+edUpLx+xkPCAwpOEwn2jfov9BZNz0w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Aneesh Kumar K.V" , Hugh Dickins , "Kirill A. Shutemov" , Christophe Leroy , Joel Fernandes , Kalesh Singh , "Kirill A. Shutemov" , Michael Ellerman , Nicholas Piggin , Stephen Rothwell , Andrew Morton , Linus Torvalds Subject: [PATCH 5.12 157/242] mm/mremap: hold the rmap lock in write mode when moving page table entries. Date: Thu, 15 Jul 2021 20:38:39 +0200 Message-Id: <20210715182620.807276868@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210715182551.731989182@linuxfoundation.org> References: <20210715182551.731989182@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Aneesh Kumar K.V commit 97113eb39fa7972722ff490b947d8af023e1f6a2 upstream. To avoid a race between rmap walk and mremap, mremap does take_rmap_locks(). The lock was taken to ensure that rmap walk don't miss a page table entry due to PTE moves via move_pagetables(). The kernel does further optimization of this lock such that if we are going to find the newly added vma after the old vma, the rmap lock is not taken. This is because rmap walk would find the vmas in the same order and if we don't find the page table attached to older vma we would find it with the new vma which we would iterate later. As explained in commit eb66ae030829 ("mremap: properly flush TLB before releasing the page") mremap is special in that it doesn't take ownership of the page. The optimized version for PUD/PMD aligned mremap also doesn't hold the ptl lock. This can result in stale TLB entries as show below. This patch updates the rmap locking requirement in mremap to handle the race condition explained below with optimized mremap:: Optmized PMD move CPU 1 CPU 2 CPU 3 mremap(old_addr, new_addr) page_shrinker/try_to_unmap_one mmap_write_lock_killable() addr = old_addr lock(pte_ptl) lock(pmd_ptl) pmd = *old_pmd pmd_clear(old_pmd) flush_tlb_range(old_addr) *new_pmd = pmd *new_addr = 10; and fills TLB with new addr and old pfn unlock(pmd_ptl) ptep_clear_flush() old pfn is free. Stale TLB entry Optimized PUD move also suffers from a similar race. Both the above race condition can be fixed if we force mremap path to take rmap lock. Link: https://lkml.kernel.org/r/20210616045239.370802-7-aneesh.kumar@linux.ibm.com Fixes: 2c91bd4a4e2e ("mm: speed up mremap by 20x on large regions") Fixes: c49dd3401802 ("mm: speedup mremap on 1GB or larger regions") Link: https://lore.kernel.org/linux-mm/CAHk-=wgXVR04eBNtxQfevontWnP6FDm+oj5vauQXP3S-huwbPw@mail.gmail.com Signed-off-by: Aneesh Kumar K.V Acked-by: Hugh Dickins Acked-by: Kirill A. Shutemov Cc: Christophe Leroy Cc: Joel Fernandes Cc: Kalesh Singh Cc: Kirill A. Shutemov Cc: Michael Ellerman Cc: Nicholas Piggin Cc: Stephen Rothwell Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- mm/mremap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- a/mm/mremap.c +++ b/mm/mremap.c @@ -439,7 +439,7 @@ unsigned long move_page_tables(struct vm if (!new_pud) break; if (move_pgt_entry(NORMAL_PUD, vma, old_addr, new_addr, - old_pud, new_pud, need_rmap_locks)) + old_pud, new_pud, true)) continue; } @@ -466,7 +466,7 @@ unsigned long move_page_tables(struct vm * moving at the PMD level if possible. */ if (move_pgt_entry(NORMAL_PMD, vma, old_addr, new_addr, - old_pmd, new_pmd, need_rmap_locks)) + old_pmd, new_pmd, true)) continue; }