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 0027EC83F1A for ; Thu, 17 Jul 2025 11:52:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8222D8D000D; Thu, 17 Jul 2025 07:52:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7AAE58D0009; Thu, 17 Jul 2025 07:52:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 624F38D000D; Thu, 17 Jul 2025 07:52:40 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 4947E8D0009 for ; Thu, 17 Jul 2025 07:52:40 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 1874212E50F for ; Thu, 17 Jul 2025 11:52:40 +0000 (UTC) X-FDA: 83673594480.07.CCC21E3 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf17.hostedemail.com (Postfix) with ESMTP id DC94240010 for ; Thu, 17 Jul 2025 11:52:37 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LwcilLDL; spf=pass (imf17.hostedemail.com: domain of dhildenb@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhildenb@redhat.com; dmarc=pass (policy=quarantine) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752753157; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=S6ocb38IkVcnlHaJeHNVb3Jrmzmc76tJoqI7g7ZBmQA=; b=dNG/bl92vpl4dhJYiOKjVLM9aP2guGxWm8EAN8W5JNZyJxFcCBfTvj6N1CkL4t63ZdW0Sl U3B9QLou5gqytrrSXPsDdn9tvLZADDZ9cbcLBPV86AXyTBVPnIGcNTlYayFSMiar3cnYy2 ZiarT/dIqeNQrMRS66m6wXGvemjkLyc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752753157; a=rsa-sha256; cv=none; b=En1fCT/6mLRuDfYW5NIsv+FhPUkUX1Yc6Sw5k/n5a8IOTwseXObLSSZ5bBQ9fP6webkgKy zMa/kgZ5j6B5Db6zdbSLTB2GJl6SQGC3DSABlT88iNTDQxIXrVvBwBMT6IH7zDh95iWwnI A+ZoIZYOLxsZFLhk4JntUJe8Aq8pkJs= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LwcilLDL; spf=pass (imf17.hostedemail.com: domain of dhildenb@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhildenb@redhat.com; dmarc=pass (policy=quarantine) header.from=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752753157; h=from:from: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:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=S6ocb38IkVcnlHaJeHNVb3Jrmzmc76tJoqI7g7ZBmQA=; b=LwcilLDLfgeRCmoiCuwYwHVWWlIjWgNT1izgO+mMzfl/vLNUWzS63EIrZAIaoZREUl5mCm IpT6PMW6V/xOXGUkfmwWJU+EJI5iJoG0k3E7+eB/Xfu5SfbMr1JrcQiwTl8RKp0KYz2SFm tTRBzkNTGsizNHmhhtHckbCRiE7/Wlg= Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-206-iVBtlJcpOw22qI9rjqpaGQ-1; Thu, 17 Jul 2025 07:52:34 -0400 X-MC-Unique: iVBtlJcpOw22qI9rjqpaGQ-1 X-Mimecast-MFC-AGG-ID: iVBtlJcpOw22qI9rjqpaGQ_1752753153 Received: by mail-wr1-f70.google.com with SMTP id ffacd0b85a97d-3a4f8192e2cso552290f8f.3 for ; Thu, 17 Jul 2025 04:52:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752753153; x=1753357953; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S6ocb38IkVcnlHaJeHNVb3Jrmzmc76tJoqI7g7ZBmQA=; b=uM6mpzA3P2DpxBkFneuTUVEeDwvwhciD2Duv084KMisvtWTbqYjlDShKkyGhqP60Fn jeNLaorARWoWiB1av0RdgAkfnYBdJGrobtR+AltnnA5u3gGu7rO50H+z8eK4qbfGP1br 0eXfeVGvtfv2aMUFilFkaFvJDy8QOvM29ya/sZ3T1sNko//DqkdXg8e9gGwMdVSjeTdv 9kmG4QyuB6d9gr93CDYoKyaxm6WKpF9NE/8lB3U4Hd9X4DD4Zj4lg/0hCIU2ox6mp2W1 0DXKXIv+Rnue+jb48RBLblKuabI83NUrZQ9qpeQ1CII+BLuWOSH2BkWRSngVuKZT0AQI Jueg== X-Gm-Message-State: AOJu0YynmU37MA3VMmn0IAdmUSE/OZbNjeee25E8PfdUlsoIHKfF5Awo FT6kWqfRlIaYwL4P4WRRW+FkIOqayY9mrwWkJNY6OvQJdFJGsOprsRVXBlpcwGnbCfrOEth7STs Oo66HiprbsB55Oz6wEbgeE0oimoKL/nD0fBqyr+lcSEEczDnVhorJ X-Gm-Gg: ASbGncvc8RVKlanA0r8yvBOEwpKSrIKGMTwpwNZg0QWNpSo+FdVfljrzZMIQtwuiCP/ rC4UcsG+3LdgZ23AscYE2nTPcAi6SYkAbV+iWycZUbYfOk+EFea1eajZIhcz5JqDGHlcPmh+IA7 1oWqivmlP4hwa2HilmJgnWmI1KBoxInp4hrAM5rsIV5M86If+w1z9UgOIhLLTWJiqBveLgh8U71 e71IE58KV89c701ZUSFFBGVXu11207D8uyt1yCDio1dI3VJSgxS+kgtDP4Q5MLWxWpYa09EvP3x lSqq9+RPrWodUQ3dxFX0DXz9MEgdrH4HV7a38rBM4gkOj3pLnZ01N0Nsjmu4xnAtR4T6q3xap4G ZRw0bwfO75qfScagGi3G1/Oc= X-Received: by 2002:a05:6000:43c6:10b0:3a4:f744:e01b with SMTP id ffacd0b85a97d-3b60e50fde7mr3995237f8f.39.1752753152621; Thu, 17 Jul 2025 04:52:32 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGLcgp48Noardv8I0f6W2NZTd1NV9HbsxHjW8GgnbNobVHwjA5VMkKS9pv04KvpTaqXa6tubA== X-Received: by 2002:a05:6000:43c6:10b0:3a4:f744:e01b with SMTP id ffacd0b85a97d-3b60e50fde7mr3995202f8f.39.1752753152069; Thu, 17 Jul 2025 04:52:32 -0700 (PDT) Received: from localhost (p200300d82f1f36000dc826ee9aa9fdc7.dip0.t-ipconnect.de. [2003:d8:2f1f:3600:dc8:26ee:9aa9:fdc7]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-45634ec9162sm20451645e9.0.2025.07.17.04.52.30 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 17 Jul 2025 04:52:31 -0700 (PDT) From: David Hildenbrand To: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org, xen-devel@lists.xenproject.org, linux-fsdevel@vger.kernel.org, nvdimm@lists.linux.dev, David Hildenbrand , Andrew Morton , Juergen Gross , Stefano Stabellini , Oleksandr Tyshchenko , Dan Williams , Matthew Wilcox , Jan Kara , Alexander Viro , Christian Brauner , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Jann Horn , Pedro Falcato , Hugh Dickins , Oscar Salvador , Lance Yang Subject: [PATCH v2 7/9] mm/memory: factor out common code from vm_normal_page_*() Date: Thu, 17 Jul 2025 13:52:10 +0200 Message-ID: <20250717115212.1825089-8-david@redhat.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250717115212.1825089-1-david@redhat.com> References: <20250717115212.1825089-1-david@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: yCYKRVcoeIlNyf69f0HF3Mzvb5lHHZyIWU-sJo-hsg8_1752753153 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit content-type: text/plain; charset="US-ASCII"; x-default=true X-Rspamd-Queue-Id: DC94240010 X-Rspam-User: X-Rspamd-Server: rspam09 X-Stat-Signature: dbn3r6thdc4idaxjdy33k9fxgxhghar1 X-HE-Tag: 1752753157-449863 X-HE-Meta: U2FsdGVkX1+cBbzdCyw4Wo92ma194jPyOk9vQcc2Ph/vsdS67PYoYDsQvpgk+T/vSZHwQgf4ndNUYFjkpDXq4Ylhh3atO6BTvpdBRtTAZQERPPowL//bfyROl58gf/n3/dWljyZKfpA0fih45ewaOFiSXSEKHC6zjjEcUKRm6eb5Udf1RVSYXwT18YbtL1pAyqtZb3XgMhk9oaNrhhh1YXxvNTs/0pMl7VuxSGIF+F5z4o2kcpTJJXdWZGhTD/0zYW7B2zSeUV6bBHGNBS7wfuXrChObue7NWiXxy3V3CUsfdVYvp3e1Wu2gJfu3ShInI721x4AMlGkCWB5917MwSm7JlD6zixw0v2K1bolenpuvUfw4fcYLlinCIiuv43oBy0P/+yg8Hk7OxMXZVCn52q71Wf/WBWIKxo1v2zoO4WBCGNdxlgpEt7S3MmknTpnFYgJ6ZCtKtlCYuv6+Wa5ekS30rBHcp6GLf9U1miZIRIcvHtUcpUHz7w1SEPnFJrDye6h8rol9kf243ab1nYAU1XBORYW0g0JAeFHwAxcTWWbBW3NuFz+TW167aAHqtJGkILnIUfmriCFOaZMlKLYal3Snx0+yt6aQGAJcxqdAArODMYc5fAwVYoU9xjAE+2XLowjvAPKlMTOl+CDFteqwom/5XBFuvk4ybvXMXlMeEWwYedNe+t2VSmS4jhtr2XbbotbVzW+QhmEzjqB2tpZW3W9sbg4loE5cs0EpaBGwGVF77AO3p1NDzhMZzNISC6e1O+ly+grgP+d/e29eb/bFYT4nnGnuUoqKMh11BsIyFtbFEpqfzCdaqsyRIKaJGLv7Fk7HGWWo+5BtoZznUmRthZoMVDS/pS3chMLFtxT2+bZOR1JD3U8yKcYRoD4F/P03XDfgAPtaSvkyjmTT7OoLCSQ9jdlIYRgrM73WBmVrihgHQio+TfhsKfb0MdMo6KB51+xy1PjSmUFqkfbf/ye xLti+zO+ 7VBLnzjmE8Xec5fxkFvoaFtHu78KVQUU9Mqod/idI+zpqJVJpY1ILBq1T/FJlzrGUzXgc7/JNvK2YMt9Bm13UlmxEtCXWysx6qFRlXro1NfPKcRSv/BpweNhrlPKb/GZQeoIrMceTy0bCm3cerhHrMTtSPO+crg4zSnyFKUOnruyRulCw0QRbWBLKzyKbjuQ4d8istnrC8Y+RBk/VEY/HQSgm380+avCtJxDf20WJDyp3ocvV4aei2DaY5/whgwi/r1ZoZW94t+UpRT+sDGJ84W+ASqo+D4kdJDLk8HP7bSAGiLS7T6ob485HAJozs4krkAM+Vm2EM8+DKn88YHPH0b4K1K2OvrXDVi+UoKCemh4zswUusbVKxd0zR6lopcq4rv7P0Yu0n1O38HNwiMlDqvkzkOdac8Zzj2WqmbbONy9ZjtXHqU+3SMEABXqSEa4CC0APxyGk6M9U7GdklgKnxanhDD9NYMm0NlUxK7x2n4p1TGxwhUR2fDrsOVibPfjtFbFPW2+Kg+wUOzCaK7hw0VQkyjWKn7smZ93pKzotZOS1/J8bBFmjTdMHNA== 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: List-Subscribe: List-Unsubscribe: Let's reduce the code duplication and factor out the non-pte/pmd related magic into vm_normal_page_pfn(). To keep it simpler, check the pfn against both zero folios. We could optimize this, but as it's only for the !CONFIG_ARCH_HAS_PTE_SPECIAL case, it's not a compelling micro-optimization. With CONFIG_ARCH_HAS_PTE_SPECIAL we don't have to check anything else, really. It's a good question if we can even hit the !CONFIG_ARCH_HAS_PTE_SPECIAL scenario in the PMD case in practice: but doesn't really matter, as it's now all unified in vm_normal_page_pfn(). Add kerneldoc for all involved functions. No functional change intended. Reviewed-by: Oscar Salvador Signed-off-by: David Hildenbrand --- mm/memory.c | 183 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 109 insertions(+), 74 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 08d16ed7b4cc7..c43ae5e4d7644 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -590,8 +590,13 @@ static void print_bad_page_map(struct vm_area_struct *vma, add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE); } -/* - * vm_normal_page -- This function gets the "struct page" associated with a pte. +/** + * vm_normal_page_pfn() - Get the "struct page" associated with a PFN in a + * non-special page table entry. + * @vma: The VMA mapping the @pfn. + * @addr: The address where the @pfn is mapped. + * @pfn: The PFN. + * @entry: The page table entry value for error reporting purposes. * * "Special" mappings do not wish to be associated with a "struct page" (either * it doesn't exist, or it exists but they don't want to touch it). In this @@ -603,10 +608,10 @@ static void print_bad_page_map(struct vm_area_struct *vma, * (such as GUP) can still identify these mappings and work with the * underlying "struct page". * - * There are 2 broad cases. Firstly, an architecture may define a pte_special() - * pte bit, in which case this function is trivial. Secondly, an architecture - * may not have a spare pte bit, which requires a more complicated scheme, - * described below. + * There are 2 broad cases. Firstly, an architecture may define a "special" + * page table entry bit (e.g., pte_special()), in which case this function is + * trivial. Secondly, an architecture may not have a spare page table + * entry bit, which requires a more complicated scheme, described below. * * A raw VM_PFNMAP mapping (ie. one that is not COWed) is always considered a * special mapping (even if there are underlying and valid "struct pages"). @@ -639,15 +644,72 @@ static void print_bad_page_map(struct vm_area_struct *vma, * don't have to follow the strict linearity rule of PFNMAP mappings in * order to support COWable mappings. * + * This function is not expected to be called for obviously special mappings: + * when the page table entry has the "special" bit set. + * + * Return: Returns the "struct page" if this is a "normal" mapping. Returns + * NULL if this is a "special" mapping. + */ +static inline struct page *vm_normal_page_pfn(struct vm_area_struct *vma, + unsigned long addr, unsigned long pfn, unsigned long long entry) +{ + /* + * With CONFIG_ARCH_HAS_PTE_SPECIAL, any special page table mappings + * (incl. shared zero folios) are marked accordingly and are handled + * by the caller. + */ + if (!IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL)) { + if (unlikely(vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP))) { + if (vma->vm_flags & VM_MIXEDMAP) { + /* If it has a "struct page", it's "normal". */ + if (!pfn_valid(pfn)) + return NULL; + } else { + unsigned long off = (addr - vma->vm_start) >> PAGE_SHIFT; + + /* Only CoW'ed anon folios are "normal". */ + if (pfn == vma->vm_pgoff + off) + return NULL; + if (!is_cow_mapping(vma->vm_flags)) + return NULL; + } + } + + if (is_zero_pfn(pfn) || is_huge_zero_pfn(pfn)) + return NULL; + } + + /* Cheap check for corrupted page table entries. */ + if (pfn > highest_memmap_pfn) { + print_bad_page_map(vma, addr, entry, NULL); + return NULL; + } + /* + * NOTE! We still have PageReserved() pages in the page tables. + * For example, VDSO mappings can cause them to exist. + */ + VM_WARN_ON_ONCE(is_zero_pfn(pfn) || is_huge_zero_pfn(pfn)); + return pfn_to_page(pfn); +} + +/** + * vm_normal_page() - Get the "struct page" associated with a PTE + * @vma: The VMA mapping the @pte. + * @addr: The address where the @pte is mapped. + * @pte: The PTE. + * + * Get the "struct page" associated with a PTE. See vm_normal_page_pfn() + * for details. + * + * Return: Returns the "struct page" if this is a "normal" mapping. Returns + * NULL if this is a "special" mapping. */ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, pte_t pte) { unsigned long pfn = pte_pfn(pte); - if (IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL)) { - if (likely(!pte_special(pte))) - goto check_pfn; + if (unlikely(pte_special(pte))) { if (vma->vm_ops && vma->vm_ops->find_special_page) return vma->vm_ops->find_special_page(vma, addr); if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP)) @@ -658,44 +720,21 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, print_bad_page_map(vma, addr, pte_val(pte), NULL); return NULL; } - - /* !CONFIG_ARCH_HAS_PTE_SPECIAL case follows: */ - - if (unlikely(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP))) { - if (vma->vm_flags & VM_MIXEDMAP) { - if (!pfn_valid(pfn)) - return NULL; - if (is_zero_pfn(pfn)) - return NULL; - goto out; - } else { - unsigned long off; - off = (addr - vma->vm_start) >> PAGE_SHIFT; - if (pfn == vma->vm_pgoff + off) - return NULL; - if (!is_cow_mapping(vma->vm_flags)) - return NULL; - } - } - - if (is_zero_pfn(pfn)) - return NULL; - -check_pfn: - if (unlikely(pfn > highest_memmap_pfn)) { - print_bad_page_map(vma, addr, pte_val(pte), NULL); - return NULL; - } - - /* - * NOTE! We still have PageReserved() pages in the page tables. - * eg. VDSO mappings can cause them to exist. - */ -out: - VM_WARN_ON_ONCE(is_zero_pfn(pfn)); - return pfn_to_page(pfn); + return vm_normal_page_pfn(vma, addr, pfn, pte_val(pte)); } +/** + * vm_normal_folio() - Get the "struct folio" associated with a PTE + * @vma: The VMA mapping the @pte. + * @addr: The address where the @pte is mapped. + * @pte: The PTE. + * + * Get the "struct folio" associated with a PTE. See vm_normal_page_pfn() + * for details. + * + * Return: Returns the "struct folio" if this is a "normal" mapping. Returns + * NULL if this is a "special" mapping. + */ struct folio *vm_normal_folio(struct vm_area_struct *vma, unsigned long addr, pte_t pte) { @@ -707,6 +746,18 @@ struct folio *vm_normal_folio(struct vm_area_struct *vma, unsigned long addr, } #ifdef CONFIG_PGTABLE_HAS_HUGE_LEAVES +/** + * vm_normal_page_pmd() - Get the "struct page" associated with a PMD + * @vma: The VMA mapping the @pmd. + * @addr: The address where the @pmd is mapped. + * @pmd: The PMD. + * + * Get the "struct page" associated with a PMD. See vm_normal_page_pfn() + * for details. + * + * Return: Returns the "struct page" if this is a "normal" mapping. Returns + * NULL if this is a "special" mapping. + */ struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t pmd) { @@ -721,37 +772,21 @@ struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr, print_bad_page_map(vma, addr, pmd_val(pmd), NULL); return NULL; } - - if (unlikely(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP))) { - if (vma->vm_flags & VM_MIXEDMAP) { - if (!pfn_valid(pfn)) - return NULL; - goto out; - } else { - unsigned long off; - off = (addr - vma->vm_start) >> PAGE_SHIFT; - if (pfn == vma->vm_pgoff + off) - return NULL; - if (!is_cow_mapping(vma->vm_flags)) - return NULL; - } - } - - if (is_huge_zero_pfn(pfn)) - return NULL; - if (unlikely(pfn > highest_memmap_pfn)) { - print_bad_page_map(vma, addr, pmd_val(pmd), NULL); - return NULL; - } - - /* - * NOTE! We still have PageReserved() pages in the page tables. - * eg. VDSO mappings can cause them to exist. - */ -out: - return pfn_to_page(pfn); + return vm_normal_page_pfn(vma, addr, pfn, pmd_val(pmd)); } +/** + * vm_normal_folio_pmd() - Get the "struct folio" associated with a PMD + * @vma: The VMA mapping the @pmd. + * @addr: The address where the @pmd is mapped. + * @pmd: The PMD. + * + * Get the "struct folio" associated with a PMD. See vm_normal_page_pfn() + * for details. + * + * Return: Returns the "struct folio" if this is a "normal" mapping. Returns + * NULL if this is a "special" mapping. + */ struct folio *vm_normal_folio_pmd(struct vm_area_struct *vma, unsigned long addr, pmd_t pmd) { -- 2.50.1