From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C07CC77B73 for ; Mon, 22 May 2023 04:49:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 769EE900004; Mon, 22 May 2023 00:49:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 719DC900002; Mon, 22 May 2023 00:49:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5E224900004; Mon, 22 May 2023 00:49:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 4E8C0900002 for ; Mon, 22 May 2023 00:49:52 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 796CB1A05C5 for ; Mon, 22 May 2023 04:49:51 +0000 (UTC) X-FDA: 80816663382.02.88BFC6F Received: from mail-yb1-f174.google.com (mail-yb1-f174.google.com [209.85.219.174]) by imf17.hostedemail.com (Postfix) with ESMTP id A3CB340012 for ; Mon, 22 May 2023 04:49:49 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jjqeukn2; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf17.hostedemail.com: domain of hughd@google.com designates 209.85.219.174 as permitted sender) smtp.mailfrom=hughd@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684730989; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=aPDEzBR49R6dDlw5Ac4B9CyjOOF4I7QDHwXmKNSpbHY=; b=xhmSTAyzPMeCN9corixMGHPcQc+ITQJXLoKiV3U9HRwKjmnTE8QwxVjQGQSB7zrjNyHwDb RxZZXtisRrw1gRv3iBJ1B7dMDqNCzUfspBgiiQA1ZM2VQCu13MVzRZFcIlcxrgoRFED6i2 qZhwimNPvU7jKHwtfgn0/nPjETCMucU= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=jjqeukn2; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf17.hostedemail.com: domain of hughd@google.com designates 209.85.219.174 as permitted sender) smtp.mailfrom=hughd@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684730989; a=rsa-sha256; cv=none; b=S+MxnaJv6gY5J1zH68QYO8goPqXkLkVxpmkdxuqLLWmeoN/N4kIdusrXoGz52nsQcjWmjA I9rA8+EZ/LwHgOO00ZV8MmiDHsT3UI6ujbOFy46S1Qyyge9zkzExG40aT6Dj5R5/tIWlLK CpQ+yO/OEg2iwNb9V5OEq33+06qxulg= Received: by mail-yb1-f174.google.com with SMTP id 3f1490d57ef6-b9a7e639656so10756331276.0 for ; Sun, 21 May 2023 21:49:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1684730989; x=1687322989; h=mime-version:references:message-id:in-reply-to:subject:cc:to:from :date:from:to:cc:subject:date:message-id:reply-to; bh=aPDEzBR49R6dDlw5Ac4B9CyjOOF4I7QDHwXmKNSpbHY=; b=jjqeukn26805nHVLC5nBwMgzM4/Jmq9nujdcXAsHlTTa0MF+m2phch6zZaIztXO6Dz fns/H0GYdXEsi480XLUtkShE3/SCYxhfBiTmi4a8mWlPCmy6IGq/VUwbfbhJIIoyZO7w TE3oj47MvYeZYWdEl1lce5yvexgSm//EOtHJ9GZeQN0nTG0k7iqmz6ivXvrQT6/vTILo r9ZBlahSUgKAO7KElSgVquCd8eytGkW3ohhN44RmnSrwXqOowlkCJVfPWiZAiA+rPaIg Hemws7mTvH+9rnEvzhcxuWU8gWDXFk8QvfENWQsXDu8/h+u8uj+2BFe5jHCcgno98BaD /dgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684730989; x=1687322989; h=mime-version:references:message-id:in-reply-to:subject:cc:to:from :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=aPDEzBR49R6dDlw5Ac4B9CyjOOF4I7QDHwXmKNSpbHY=; b=WpTfJ2b2j2zdxHczFfBlWtBStvfRgeRHYcFfvJjF/zmxejFmuudz7pM23BJYZZojhq nQcJFjTh/7eRuvyZZ4l81Evar0F3px8PLedFSEKg9+X8QLq4OoUsnAYWLBdyKHy4HObL /iY8wyfzrXaj4TwWzvbttIlDJRwfxiPaVuoahbdCgEL8bBHB7BCoDG4RJpQcJijIpuyo LMUJ54gD+u6BnjGWlWZRsvKgJJzlRdW25kBDfdx743wRjcxb8T1OlM8iBMQMpOAf6ggq 2qrc80tN15afe0zkWIVQZRm8Owh+wiw6UukeyzmuZYmmSkskl25lAYmVBcO2DPDIDDZb 3Brw== X-Gm-Message-State: AC+VfDx22q/yreHHl1uADSMbMfhy/lF3oytlV5lphIdgiTTGpHWjN5Vu /hztO8I/vGHLCAvb45Q+hdzNCg== X-Google-Smtp-Source: ACHHUZ5ZcQphQAL7jjAMB8ykWMW22wF1U8iyf27N7XhXamyXhJP6vomdj/dc7m8k3wKxzVaO0p10GA== X-Received: by 2002:a25:d242:0:b0:b9a:66b7:673e with SMTP id j63-20020a25d242000000b00b9a66b7673emr11337327ybg.43.1684730988606; Sun, 21 May 2023 21:49:48 -0700 (PDT) Received: from ripple.attlocal.net (172-10-233-147.lightspeed.sntcca.sbcglobal.net. [172.10.233.147]) by smtp.gmail.com with ESMTPSA id b206-20020a0dd9d7000000b00560f6704ee1sm1809847ywe.26.2023.05.21.21.49.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 May 2023 21:49:48 -0700 (PDT) Date: Sun, 21 May 2023 21:49:45 -0700 (PDT) From: Hugh Dickins X-X-Sender: hugh@ripple.attlocal.net To: Andrew Morton cc: Mike Kravetz , Mike Rapoport , "Kirill A. Shutemov" , Matthew Wilcox , David Hildenbrand , Suren Baghdasaryan , Qi Zheng , Yang Shi , Mel Gorman , Peter Xu , Peter Zijlstra , Will Deacon , Yu Zhao , Alistair Popple , Ralph Campbell , Ira Weiny , Steven Price , SeongJae Park , Naoya Horiguchi , Christophe Leroy , Zack Rusin , Jason Gunthorpe , Axel Rasmussen , Anshuman Khandual , Pasha Tatashin , Miaohe Lin , Minchan Kim , Christoph Hellwig , Song Liu , Thomas Hellstrom , linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 01/31] mm: use pmdp_get_lockless() without surplus barrier() In-Reply-To: <68a97fbe-5c1e-7ac6-72c-7b9c6290b370@google.com> Message-ID: <34467cca-58b6-3e64-1ee7-e3dc43257a@google.com> References: <68a97fbe-5c1e-7ac6-72c-7b9c6290b370@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Rspam-User: X-Stat-Signature: eb6ej7s6ag93yxww9ut8q7gc8c1b3b96 X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: A3CB340012 X-HE-Tag: 1684730989-622857 X-HE-Meta: U2FsdGVkX1/IPyDhQQ7Nka5b7VJEeOiuR02qatzPjKtJ2vxbyLPs3QUwhDGCWA7X1t5rojv7FopSDGmGkdmYXqDcOA+UFyMofBx+/devFvL6b9AjlNeMJXCimCClyubKuBb4lA1PwzJy61twdpzWNkNAF92k1RocYmSOosQ3nMUcuEsoRCjywscLyX6LSrRdyc0Oyu09is/8oFveAkGXNN9/MvYQ5/4GSguI4s7s8JUuAF4octY4F48NMqk3EuGWIenvjJzpCMiOiwwpUEMJ0NkoYFAYfhWtOJ+OFru41S4nYbWvosTm1a4Kfpmmz4iA62KK/cUv28ERIju5HGzttoomerh4n5THvCYB3PSRH6VnamkNcmWL3yT6S7Km0hLeLwdZrayMCEq0ztRwLQKu52l0+pi5lYM1DUoT+UZ6Abf5mrM8ZO6jpm1omouYOeNvsHZzQsENXfmCbba5VF7+YR7WB9Qpn1yPLlJbmZpY9pNCUpDOthQdPru4xJb8VrNMQmKyE1oWUfuMA6ZuCELJQ79RF9DRSrns+yfv/rdEC+Wao+Mz/HYkwsa7W7PPgOGNjQr/xyagX+ILc3nUqXo8I7TK2tz15Jatg4JB9DXSN0K/jJ5eWclzEdRKB+3C/hDaOqpy0659sQw/om7A4yFWpVgSmZ4OoEU7qh1KVHhQdF9I1tcZBVM0SEz2zptkX/fJ8S+mBv4GQiqFIhFV4VKX2cjBP1UxriOoarLTkjZFHi+IkZLGkBMAH7vozOcAe56mO3imISaDwS4KL4XIfrYtZS24+yOF/imKUPHbulfkPicWoxAwhd2at6gZGTjEvq9XPf0cT1e2eD32ePLwONJdh64QLCIoEManq3+p1liKRb7FuC62JrvaWb9PRG4w5vaN2jEdd5ww0DD73d0/3TtIrjU1zyf+WnxzSIkcSAeE8EKrxty0o5fwH3AS+yA4pdkS6s10f0RtvyvYEHYbbOZ 77YmAMY2 mMoOmJJD0CU/y6ac5LAN7nikIFpTkAl+447vjnkWp/qyNAo9VhG6whhytsslDLi6a6Fvz42AKA2sKwauAPipynLSjrYy6NDXna3z8ysB3AowLBcRZ6n36uQNyvdzMk82FnMeT02hu02di1kInuxCkd0KTU1B9IdsSZ5xNkq+YqhvsvEYOXG0EDeFZ53KPEgdguuBoll7BM14QGqT5iKd0IMtrlcrllX5gjwIX3nHIjKUK9xqd46SjLszJM28KTS44qrChJNiOOcQfPrOv5/Ho0McKMVFvvdpDmyDOjseKs2690AL1Aoy7XQc4ZvX04KAKaiL7r2taAySCUXXUq/RdHTox6rdtfV/7ez3l6yiwo8pRzgx9P0WFs47CPqhjl7B88h+HOISXzYujgJ7BALLpRzVwpwIBiTUUpi2+u/rMh4ZcKL/ux8vpOiOi5w== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Use pmdp_get_lockless() in preference to READ_ONCE(*pmdp), to get a more reliable result with PAE (or READ_ONCE as before without PAE); and remove the unnecessary extra barrier()s which got left behind in its callers. HOWEVER: Note the small print in linux/pgtable.h, where it was designed specifically for fast GUP, and depends on interrupts being disabled for its full guarantee: most callers which have been added (here and before) do NOT have interrupts disabled, so there is still some need for caution. Signed-off-by: Hugh Dickins --- fs/userfaultfd.c | 10 +--------- include/linux/pgtable.h | 17 ----------------- mm/gup.c | 6 +----- mm/hmm.c | 2 +- mm/khugepaged.c | 5 ----- mm/ksm.c | 3 +-- mm/memory.c | 14 ++------------ mm/mprotect.c | 5 ----- mm/page_vma_mapped.c | 2 +- 9 files changed, 7 insertions(+), 57 deletions(-) diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index 0fd96d6e39ce..f7a0817b1ec0 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -349,15 +349,7 @@ static inline bool userfaultfd_must_wait(struct userfaultfd_ctx *ctx, if (!pud_present(*pud)) goto out; pmd = pmd_offset(pud, address); - /* - * READ_ONCE must function as a barrier with narrower scope - * and it must be equivalent to: - * _pmd = *pmd; barrier(); - * - * This is to deal with the instability (as in - * pmd_trans_unstable) of the pmd. - */ - _pmd = READ_ONCE(*pmd); + _pmd = pmdp_get_lockless(pmd); if (pmd_none(_pmd)) goto out; diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index c5a51481bbb9..8ec27fe69dc8 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -1344,23 +1344,6 @@ static inline int pud_trans_unstable(pud_t *pud) static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd) { pmd_t pmdval = pmdp_get_lockless(pmd); - /* - * The barrier will stabilize the pmdval in a register or on - * the stack so that it will stop changing under the code. - * - * When CONFIG_TRANSPARENT_HUGEPAGE=y on x86 32bit PAE, - * pmdp_get_lockless is allowed to return a not atomic pmdval - * (for example pointing to an hugepage that has never been - * mapped in the pmd). The below checks will only care about - * the low part of the pmd with 32bit PAE x86 anyway, with the - * exception of pmd_none(). So the important thing is that if - * the low part of the pmd is found null, the high part will - * be also null or the pmd_none() check below would be - * confused. - */ -#ifdef CONFIG_TRANSPARENT_HUGEPAGE - barrier(); -#endif /* * !pmd_present() checks for pmd migration entries * diff --git a/mm/gup.c b/mm/gup.c index bbe416236593..3bd5d3854c51 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -653,11 +653,7 @@ static struct page *follow_pmd_mask(struct vm_area_struct *vma, struct mm_struct *mm = vma->vm_mm; pmd = pmd_offset(pudp, address); - /* - * The READ_ONCE() will stabilize the pmdval in a register or - * on the stack so that it will stop changing under the code. - */ - pmdval = READ_ONCE(*pmd); + pmdval = pmdp_get_lockless(pmd); if (pmd_none(pmdval)) return no_page_table(vma, flags); if (!pmd_present(pmdval)) diff --git a/mm/hmm.c b/mm/hmm.c index 6a151c09de5e..e23043345615 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -332,7 +332,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, pmd_t pmd; again: - pmd = READ_ONCE(*pmdp); + pmd = pmdp_get_lockless(pmdp); if (pmd_none(pmd)) return hmm_vma_walk_hole(start, end, -1, walk); diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 6b9d39d65b73..732f9ac393fc 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -961,11 +961,6 @@ static int find_pmd_or_thp_or_none(struct mm_struct *mm, return SCAN_PMD_NULL; pmde = pmdp_get_lockless(*pmd); - -#ifdef CONFIG_TRANSPARENT_HUGEPAGE - /* See comments in pmd_none_or_trans_huge_or_clear_bad() */ - barrier(); -#endif if (pmd_none(pmde)) return SCAN_PMD_NONE; if (!pmd_present(pmde)) diff --git a/mm/ksm.c b/mm/ksm.c index 0156bded3a66..df2aa281d49d 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -1194,8 +1194,7 @@ static int replace_page(struct vm_area_struct *vma, struct page *page, * without holding anon_vma lock for write. So when looking for a * genuine pmde (in which to find pte), test present and !THP together. */ - pmde = *pmd; - barrier(); + pmde = pmdp_get_lockless(pmd); if (!pmd_present(pmde) || pmd_trans_huge(pmde)) goto out; diff --git a/mm/memory.c b/mm/memory.c index f69fbc251198..2eb54c0d5d3c 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4925,18 +4925,9 @@ static vm_fault_t handle_pte_fault(struct vm_fault *vmf) * So now it's safe to run pte_offset_map(). */ vmf->pte = pte_offset_map(vmf->pmd, vmf->address); - vmf->orig_pte = *vmf->pte; + vmf->orig_pte = ptep_get_lockless(vmf->pte); vmf->flags |= FAULT_FLAG_ORIG_PTE_VALID; - /* - * some architectures can have larger ptes than wordsize, - * e.g.ppc44x-defconfig has CONFIG_PTE_64BIT=y and - * CONFIG_32BIT=y, so READ_ONCE cannot guarantee atomic - * accesses. The code below just needs a consistent view - * for the ifs and we later double check anyway with the - * ptl lock held. So here a barrier will do. - */ - barrier(); if (pte_none(vmf->orig_pte)) { pte_unmap(vmf->pte); vmf->pte = NULL; @@ -5060,9 +5051,8 @@ static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma, if (!(ret & VM_FAULT_FALLBACK)) return ret; } else { - vmf.orig_pmd = *vmf.pmd; + vmf.orig_pmd = pmdp_get_lockless(vmf.pmd); - barrier(); if (unlikely(is_swap_pmd(vmf.orig_pmd))) { VM_BUG_ON(thp_migration_supported() && !is_pmd_migration_entry(vmf.orig_pmd)); diff --git a/mm/mprotect.c b/mm/mprotect.c index 92d3d3ca390a..c5a13c0f1017 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -309,11 +309,6 @@ static inline int pmd_none_or_clear_bad_unless_trans_huge(pmd_t *pmd) { pmd_t pmdval = pmdp_get_lockless(pmd); - /* See pmd_none_or_trans_huge_or_clear_bad for info on barrier */ -#ifdef CONFIG_TRANSPARENT_HUGEPAGE - barrier(); -#endif - if (pmd_none(pmdval)) return 1; if (pmd_trans_huge(pmdval)) diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c index 4e448cfbc6ef..64aff6718bdb 100644 --- a/mm/page_vma_mapped.c +++ b/mm/page_vma_mapped.c @@ -210,7 +210,7 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk *pvmw) * compiler and used as a stale value after we've observed a * subsequent update. */ - pmde = READ_ONCE(*pvmw->pmd); + pmde = pmdp_get_lockless(pvmw->pmd); if (pmd_trans_huge(pmde) || is_pmd_migration_entry(pmde) || (pmd_present(pmde) && pmd_devmap(pmde))) { -- 2.35.3