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 X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 587FDC0018C for ; Mon, 7 Dec 2020 11:35:21 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id E7E6D233A0 for ; Mon, 7 Dec 2020 11:35:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E7E6D233A0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 8236D8D001C; Mon, 7 Dec 2020 06:35:20 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7D2F18D0001; Mon, 7 Dec 2020 06:35:20 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6E87B8D001C; Mon, 7 Dec 2020 06:35:20 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0154.hostedemail.com [216.40.44.154]) by kanga.kvack.org (Postfix) with ESMTP id 5908B8D0001 for ; Mon, 7 Dec 2020 06:35:20 -0500 (EST) Received: from smtpin21.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 2028A181AEF1F for ; Mon, 7 Dec 2020 11:35:20 +0000 (UTC) X-FDA: 77566280400.21.meat83_250c2aa273de Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin21.hostedemail.com (Postfix) with ESMTP id 023AB180442C4 for ; Mon, 7 Dec 2020 11:35:19 +0000 (UTC) X-HE-Tag: meat83_250c2aa273de X-Filterd-Recvd-Size: 7084 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) by imf43.hostedemail.com (Postfix) with ESMTP for ; Mon, 7 Dec 2020 11:35:19 +0000 (UTC) Received: by mail-pg1-f174.google.com with SMTP id 69so806469pgg.8 for ; Mon, 07 Dec 2020 03:35:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TpyAX8bjmgKWxsxprFNaku2nEJ5v4XWrim2WqmZHDpg=; b=eS4D42NrIJAv240gGh41rvA64V7u41KBS4tRtOuPLsuYqHzqarSS8/n7/tX9diZSle XcvHurUEWFhPNZhnW01+0VblwSa4+nqPfvuelH67hPrhQTsGl0xYiozhsfaNQdt9UcuU xTIW+q4n5aGxXZ9kufVbFlTvHWOCocxT0VIsxD+mL1ugo2Z2vjK6AUIMi/F+wUKrXguJ KblNy3cm9NJAk6ucQE5OjL/xyx5c3YMwL7Ulxvlteu0bTmPrUEiEIsIfNOYUO1n/oHDR 4l0DL0eiG4Uvtj1Wdkd9w/kb6JwDma9v7EE8NNl/eVDjMBv/foOGibW+Nd/9kNb3U8bT M6PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TpyAX8bjmgKWxsxprFNaku2nEJ5v4XWrim2WqmZHDpg=; b=eSfOTH7rLEjQlKkiX+5eVCJ8t0RQtqikAMZy88l2OEbvJbW5pQXLq2DeMPd5BsaBTe 996UkuPqWyBeyfWnvkZIc4ylp02xluoULNqzXKC2XA/S6RRldk5KAYy0zHVQaQz67KEP 9XJmUUv7NHlBDbw7LCet6D4Qk7CPYNjTFz+xLI5dMqvhR/Gl/6fnOqpdlf+5A8587Acd cJQDHK/ksmmhdDKYo/G3y7eSuZzefIEdoUAP8Z7I4lGG3xMqXG9WDneiEEbHPwld30l0 2kdh8feKi12FGd4beHLf7VhuCInWkRwLTmm+2JlS0QynDXlLZNEJAJRkH87aWimDR8S/ IZBQ== X-Gm-Message-State: AOAM53087lZpohc21ZRkVqS2kO3GIJb0RI7W1BuunC9wl/qOT+pRI6RX iU7eM/gijcaiSuhh/feRLoq7g9VM7Do= X-Google-Smtp-Source: ABdhPJwyNYWW30gHq9pOZotI8O5TvgnyfvtFboa27PYJJsWjcCMUClmt5pZogoHFcS4MUOgwfk1x+Q== X-Received: by 2002:a63:7f03:: with SMTP id a3mr17930488pgd.313.1607340918580; Mon, 07 Dec 2020 03:35:18 -0800 (PST) Received: from localhost.localdomain ([203.205.141.39]) by smtp.gmail.com with ESMTPSA id d4sm14219822pfo.127.2020.12.07.03.35.15 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Dec 2020 03:35:18 -0800 (PST) From: yulei.kernel@gmail.com X-Google-Original-From: yuleixzhang@tencent.com To: linux-mm@kvack.org, akpm@linux-foundation.org, linux-fsdevel@vger.kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, naoya.horiguchi@nec.com, viro@zeniv.linux.org.uk, pbonzini@redhat.com Cc: joao.m.martins@oracle.com, rdunlap@infradead.org, sean.j.christopherson@intel.com, xiaoguangrong.eric@gmail.com, kernellwp@gmail.com, lihaiwei.kernel@gmail.com, Yulei Zhang , Chen Zhuo Subject: [RFC V2 29/37] mm: add follow_pte_pud() to support huge pud look up Date: Mon, 7 Dec 2020 19:31:22 +0800 Message-Id: <43e14d8a452789e5321b93810a50acfe95672e99.1607332046.git.yuleixzhang@tencent.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: From: Yulei Zhang Since we had supported dmem huge pud, here support dmem huge pud for hva_to_pfn(). Similar to follow_pte_pmd(), follow_pte_pud() allows a PTE lead or a huge page PMD or huge page PUD to be found and returned. Signed-off-by: Chen Zhuo Signed-off-by: Yulei Zhang --- mm/memory.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 01f3b05..dfc95be 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4698,9 +4698,9 @@ int __pmd_alloc(struct mm_struct *mm, pud_t *pud, u= nsigned long address) } #endif /* __PAGETABLE_PMD_FOLDED */ =20 -static int __follow_pte_pmd(struct mm_struct *mm, unsigned long address, +static int __follow_pte_pud(struct mm_struct *mm, unsigned long address, struct mmu_notifier_range *range, - pte_t **ptepp, pmd_t **pmdpp, spinlock_t **ptlp) + pte_t **ptepp, pmd_t **pmdpp, pud_t **pudpp, spinlock_t **ptlp) { pgd_t *pgd; p4d_t *p4d; @@ -4717,6 +4717,26 @@ static int __follow_pte_pmd(struct mm_struct *mm, = unsigned long address, goto out; =20 pud =3D pud_offset(p4d, address); + VM_BUG_ON(pud_trans_huge(*pud)); + if (pud_huge(*pud)) { + if (!pudpp) + goto out; + + if (range) { + mmu_notifier_range_init(range, MMU_NOTIFY_CLEAR, 0, + NULL, mm, address & PUD_MASK, + (address & PUD_MASK) + PUD_SIZE); + mmu_notifier_invalidate_range_start(range); + } + *ptlp =3D pud_lock(mm, pud); + if (pud_huge(*pud)) { + *pudpp =3D pud; + return 0; + } + spin_unlock(*ptlp); + if (range) + mmu_notifier_invalidate_range_end(range); + } if (pud_none(*pud) || unlikely(pud_bad(*pud))) goto out; =20 @@ -4772,8 +4792,8 @@ static inline int follow_pte(struct mm_struct *mm, = unsigned long address, =20 /* (void) is needed to make gcc happy */ (void) __cond_lock(*ptlp, - !(res =3D __follow_pte_pmd(mm, address, NULL, - ptepp, NULL, ptlp))); + !(res =3D __follow_pte_pud(mm, address, NULL, + ptepp, NULL, NULL, ptlp))); return res; } =20 @@ -4785,12 +4805,24 @@ int follow_pte_pmd(struct mm_struct *mm, unsigned= long address, =20 /* (void) is needed to make gcc happy */ (void) __cond_lock(*ptlp, - !(res =3D __follow_pte_pmd(mm, address, range, - ptepp, pmdpp, ptlp))); + !(res =3D __follow_pte_pud(mm, address, range, + ptepp, pmdpp, NULL, ptlp))); return res; } EXPORT_SYMBOL(follow_pte_pmd); =20 +int follow_pte_pud(struct mm_struct *mm, unsigned long address, + struct mmu_notifier_range *range, + pte_t **ptepp, pmd_t **pmdpp, pud_t **pudpp, spinlock_t **ptlp) +{ + int res; + + /* (void) is needed to make gcc happy */ + (void) __cond_lock(*ptlp, + !(res =3D __follow_pte_pud(mm, address, range, + ptepp, pmdpp, pudpp, ptlp))); + return res; +} /** * follow_pfn - look up PFN at a user virtual address * @vma: memory mapping @@ -4808,15 +4840,19 @@ int follow_pfn(struct vm_area_struct *vma, unsign= ed long address, spinlock_t *ptl; pte_t *ptep; pmd_t *pmdp =3D NULL; + pud_t *pudp =3D NULL; =20 if (!(vma->vm_flags & (VM_IO | VM_PFNMAP))) return ret; =20 - ret =3D follow_pte_pmd(vma->vm_mm, address, NULL, &ptep, &pmdp, &ptl); + ret =3D follow_pte_pud(vma->vm_mm, address, NULL, &ptep, &pmdp, &pudp, = &ptl); if (ret) return ret; =20 - if (pmdp) { + if (pudp) { + *pfn =3D pud_pfn(*pudp) + ((address & ~PUD_MASK) >> PAGE_SHIFT); + spin_unlock(ptl); + } else if (pmdp) { *pfn =3D pmd_pfn(*pmdp) + ((address & ~PMD_MASK) >> PAGE_SHIFT); spin_unlock(ptl); } else { --=20 1.8.3.1