From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E26073EF0B7 for ; Wed, 6 May 2026 18:30:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778092239; cv=none; b=MWHr2WtxpWuTku+z5ly6Is4cO7gm+U+TSzqGVtSJ7DtmkcwwEt8+bjj0Goek9aF9dx3MwmSxu2iJBb6dWGaTHoLYxLiI5DUYf8XAp3YDG2HhLbw00y1LkFnuN6/p+pUHKHKwGy7Rfm2gFv8kesl0/Z+d2eWhf5k1ba2QkANdlbQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778092239; c=relaxed/simple; bh=DheCqXfE8ivMtSxgdXvw+rUIPKkyXsGtXbBNXPKhdTM=; h=Message-ID:Date:MIME-Version:Subject:From:To:Cc:References: In-Reply-To:Content-Type; b=SGGMKKVYoUSztAz1tB0tgYMwv5nSGTBzhpOs3lcccqLQitf8IV2313my8SOkumO3EIP/90ivMayW7If22eALVi3Hz//lgeXlVJCVVvWlbpdUoLuDEC1K5J1VAtRzkC38qvN3oSaFpKo60IoVBS6mUuy3aBIKEanCtry6puMMSHA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ICbxdGbZ; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ICbxdGbZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778092236; 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=8/RGMDkKi/0TpsTIZWOvUcys+qwq15zYbJSL/7mQVIU=; b=ICbxdGbZT3v2HLTTHHoUSOtJMkz+HtCrgca0KiUA1pxhDUrrjPhOpTf+yQJfRGJnPNZ0q8 oDfSBclZ0/wsdUz5rxbC83qsNJHIBEIEJMYODPR1DY76jfS6rgEZN7b3AhRKy+nxWRDkyy 59x+rRmBMrxZBaHOtgNlPfrlCPx5mGE= Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-189-5FkpziRjMvSuIca_Nq7k-Q-1; Wed, 06 May 2026 14:30:34 -0400 X-MC-Unique: 5FkpziRjMvSuIca_Nq7k-Q-1 X-Mimecast-MFC-AGG-ID: 5FkpziRjMvSuIca_Nq7k-Q_1778092234 Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-50e67a4f642so166266441cf.0 for ; Wed, 06 May 2026 11:30:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778092234; x=1778697034; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:from:subject:user-agent:mime-version:date:message-id:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8/RGMDkKi/0TpsTIZWOvUcys+qwq15zYbJSL/7mQVIU=; b=aUfvEtBzaBeJM7Z/89oMViG+ykoX8JYtQw+AsxNG1PPStBoflvhZp16dIx4O4BRaH6 YV7QLTGmxQWDN9sy4o08ui3GH3ugov2NxWdWHih/fluH86bMhdEYrFbKY1ltDGViUzNK ufXX6aVWMBwcRfypTl8Jt8WO0v7yKGg1taVSjybka8iEhV69azHrDV0xajllS3rl0joB 7tC5joVxk/RGF+AAZwW71BHWymTFdakJpyPgpJloCAgacA0YPTQUhP/OHc3fV/mePbjv 52FsaR8RPXkqk92CjIoU3tiK7vmhIjGjgvjoC7hNqON9xohfhKEydk4cO1fp2wBFgVxy Iaow== X-Gm-Message-State: AOJu0YyKOFAl35FLhmsyqgrccndV/try2vwGf1dg7uxB0GcosTeze/1k /MLMUniYSY3HCwi21X8bTgRNe9tJfT5gN8B0pXAv1XghZ1+qprSG5svD1MfC0/zCzg0g6Jvezkn MTXKJ7VdVjq5LNP64EDSacMh4FvvQeYiZJILnnPNNukk3vUQtvqZNqMpayVHhbYtp5WjZOUO1wT U5UgPaR3bIgKdd8mYAYrqQ8B9BsKmd3gR+Q6RWb6u6cpkuetN+ X-Gm-Gg: AeBDies27BosvxdOE0gANCiZbtzWsAa5/XwBWC3Cra8xeffPKfg+ObwOEHgeLcxl60J fcBNvB50qJA1RDx/hPftwEU8IE2fJ084Ncu4lL+SIF8iQcGn8wRRC/EhMiLNp2tEe+Amb80/+T0 fe7NC0pmDaAaKso1YD0Mhj5z3fJVR9cfYUUEPzjYKfd9dYo0cXb2YqudIjwoJ8MuzP1mTYlYxjc gaJlcL6odyeHYVoirfTkGBde2VaLlrfh6SssTFNNM7squS1RFubI/rqa/8lynKUKe5uC/hPh/nd liYyPh4rGGHj4YUm/JXmWa3gzrsthIrn93cpvCXaNc8/NxGAwkDtss6WEMKQMI1hqNzsRxFcrWz hOoKJVyrgKr3/f+Vw1JCU0C2V2G5h2pJeo/JxTKojBNQhcg== X-Received: by 2002:a05:622a:1b15:b0:50e:5ca8:8c2a with SMTP id d75a77b69052e-51461be0e30mr62123561cf.2.1778092233523; Wed, 06 May 2026 11:30:33 -0700 (PDT) X-Received: by 2002:a05:622a:1b15:b0:50e:5ca8:8c2a with SMTP id d75a77b69052e-51461be0e30mr62121861cf.2.1778092232505; Wed, 06 May 2026 11:30:32 -0700 (PDT) Received: from [192.168.2.110] ([70.53.202.134]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-51040b5e8b4sm178062701cf.23.2026.05.06.11.30.31 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 06 May 2026 11:30:32 -0700 (PDT) Message-ID: Date: Wed, 6 May 2026 14:30:21 -0400 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: (sashiko review) Re: [PATCH v4 7/9] treewide: introduce arch_has_pmd_leaves() From: Luiz Capitulino To: linux-kernel@vger.kernel.org, linux-mm@kvack.org, david@kernel.org, baolin.wang@linux.alibaba.com, ziy@nvidia.com, lance.yang@linux.dev Cc: corbet@lwn.net, tsbogend@alpha.franken.de, maddy@linux.ibm.com, mpe@ellerman.id.au, agordeev@linux.ibm.com, gerald.schaefer@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com, x86@kernel.org, dave.hansen@linux.intel.com, djbw@kernel.org, vishal.l.verma@intel.com, dave.jiang@intel.com, akpm@linux-foundation.org, lorenzo.stoakes@oracle.com References: <85674af7934cd363ceadd1d4f2b784d833a183cc.1777663129.git.luizcap@redhat.com> <415c4158-f87d-4a61-8aab-9f957b1fe1c8@redhat.com> Content-Language: en-US, en-CA In-Reply-To: <415c4158-f87d-4a61-8aab-9f957b1fe1c8@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 2026-05-06 14:22, Luiz Capitulino wrote: > On 2026-05-01 15:18, Luiz Capitulino wrote: >> Now that all the has_transparent_hugepage() callers have been converted >> to pgtable_has_pmd_leaves(), this commit does two things: >> >> 1. Rename has_transparent_hugepage() arch implementations to >> arch_has_pmd_leaves(), since that's what the helper checks for >> >> 2. Introduce the default implementation of arch_has_pmd_leaves() as >> IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE). This means that if >> the arch doesn't implement arch_has_pmd_leaves() we default to checking >> CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE as a way to determine if >> PMD-sized pages are supported >> >> Note that arch_has_pmd_leaves() is supposed to be called only by >> init_arch_has_pmd_leaves(). The remaining exception is hugepage_init() >> which will be converted in a future commit. >> >> Signed-off-by: Luiz Capitulino >> --- >> arch/mips/include/asm/pgtable.h | 4 ++-- >> arch/mips/mm/tlb-r4k.c | 4 ++-- >> arch/powerpc/include/asm/book3s/64/hash-4k.h | 2 +- >> arch/powerpc/include/asm/book3s/64/hash-64k.h | 2 +- >> arch/powerpc/include/asm/book3s/64/pgtable.h | 10 +++++----- >> arch/powerpc/include/asm/book3s/64/radix.h | 2 +- >> arch/powerpc/mm/book3s64/hash_pgtable.c | 4 ++-- >> arch/s390/include/asm/pgtable.h | 4 ++-- >> arch/x86/include/asm/pgtable.h | 4 ++-- >> include/linux/pgtable.h | 4 ++-- >> mm/huge_memory.c | 2 +- >> mm/memory.c | 2 +- >> 12 files changed, 22 insertions(+), 22 deletions(-) >> >> diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h >> index fa7b935f947c..a97b788315e2 100644 >> --- a/arch/mips/include/asm/pgtable.h >> +++ b/arch/mips/include/asm/pgtable.h >> @@ -615,8 +615,8 @@ unsigned long io_remap_pfn_range_pfn(unsigned long pfn, unsigned long size); >> /* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/ >> #define pmdp_establish generic_pmdp_establish >> -#define has_transparent_hugepage has_transparent_hugepage >> -extern int has_transparent_hugepage(void); >> +#define arch_has_pmd_leaves arch_has_pmd_leaves >> +extern int arch_has_pmd_leaves(void); >> static inline int pmd_trans_huge(pmd_t pmd) >> { >> diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c >> index 24fe85fa169d..c423b5784337 100644 >> --- a/arch/mips/mm/tlb-r4k.c >> +++ b/arch/mips/mm/tlb-r4k.c >> @@ -434,7 +434,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1, >> #ifdef CONFIG_TRANSPARENT_HUGEPAGE >> -int has_transparent_hugepage(void) >> +int arch_has_pmd_leaves(void) >> { >> static unsigned int mask = -1; >> @@ -450,7 +450,7 @@ int has_transparent_hugepage(void) >> } >> return mask == PM_HUGE_MASK; >> } >> -EXPORT_SYMBOL(has_transparent_hugepage); >> +EXPORT_SYMBOL(arch_has_pmd_leaves); >> #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ >> diff --git a/arch/powerpc/include/asm/book3s/64/hash-4k.h b/arch/powerpc/include/asm/book3s/64/hash-4k.h >> index 8e5bd9902bed..6744c2287199 100644 >> --- a/arch/powerpc/include/asm/book3s/64/hash-4k.h >> +++ b/arch/powerpc/include/asm/book3s/64/hash-4k.h >> @@ -165,7 +165,7 @@ extern void hash__pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp, >> extern pgtable_t hash__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp); >> extern pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm, >> unsigned long addr, pmd_t *pmdp); >> -extern int hash__has_transparent_hugepage(void); >> +extern int hash__arch_has_pmd_leaves(void); >> #endif >> #endif /* !__ASSEMBLER__ */ >> diff --git a/arch/powerpc/include/asm/book3s/64/hash-64k.h b/arch/powerpc/include/asm/book3s/64/hash-64k.h >> index 7deb3a66890b..9392aba5e5dc 100644 >> --- a/arch/powerpc/include/asm/book3s/64/hash-64k.h >> +++ b/arch/powerpc/include/asm/book3s/64/hash-64k.h >> @@ -278,7 +278,7 @@ extern void hash__pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp, >> extern pgtable_t hash__pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp); >> extern pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm, >> unsigned long addr, pmd_t *pmdp); >> -extern int hash__has_transparent_hugepage(void); >> +extern int hash__arch_has_pmd_leaves(void); >> #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ >> #endif /* __ASSEMBLER__ */ >> diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h >> index e67e64ac6e8c..b6629c041e75 100644 >> --- a/arch/powerpc/include/asm/book3s/64/pgtable.h >> +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h >> @@ -1121,14 +1121,14 @@ static inline void update_mmu_cache_pud(struct vm_area_struct *vma, >> { >> } >> -extern int hash__has_transparent_hugepage(void); >> -static inline int has_transparent_hugepage(void) >> +extern int hash__arch_has_pmd_leaves(void); >> +static inline int arch_has_pmd_leaves(void) >> { >> if (radix_enabled()) >> - return radix__has_transparent_hugepage(); >> - return hash__has_transparent_hugepage(); >> + return radix__arch_has_pmd_leaves(); >> + return hash__arch_has_pmd_leaves(); >> } >> -#define has_transparent_hugepage has_transparent_hugepage >> +#define arch_has_pmd_leaves arch_has_pmd_leaves >> static inline int has_transparent_pud_hugepage(void) >> { >> diff --git a/arch/powerpc/include/asm/book3s/64/radix.h b/arch/powerpc/include/asm/book3s/64/radix.h >> index da954e779744..c884a119cbd9 100644 >> --- a/arch/powerpc/include/asm/book3s/64/radix.h >> +++ b/arch/powerpc/include/asm/book3s/64/radix.h >> @@ -298,7 +298,7 @@ extern pmd_t radix__pmdp_huge_get_and_clear(struct mm_struct *mm, >> pud_t radix__pudp_huge_get_and_clear(struct mm_struct *mm, >> unsigned long addr, pud_t *pudp); >> -static inline int radix__has_transparent_hugepage(void) >> +static inline int radix__arch_has_pmd_leaves(void) >> { >> /* For radix 2M at PMD level means thp */ >> if (mmu_psize_defs[MMU_PAGE_2M].shift == PMD_SHIFT) >> diff --git a/arch/powerpc/mm/book3s64/hash_pgtable.c b/arch/powerpc/mm/book3s64/hash_pgtable.c >> index d9b5b751d7b7..88a4a2eab513 100644 >> --- a/arch/powerpc/mm/book3s64/hash_pgtable.c >> +++ b/arch/powerpc/mm/book3s64/hash_pgtable.c >> @@ -391,7 +391,7 @@ pmd_t hash__pmdp_huge_get_and_clear(struct mm_struct *mm, >> return old_pmd; >> } >> -int hash__has_transparent_hugepage(void) >> +int hash__arch_has_pmd_leaves(void) >> { >> if (!mmu_has_feature(MMU_FTR_16M_PAGE)) >> @@ -420,7 +420,7 @@ int hash__has_transparent_hugepage(void) >> return 1; >> } >> -EXPORT_SYMBOL_GPL(hash__has_transparent_hugepage); >> +EXPORT_SYMBOL_GPL(hash__arch_has_pmd_leaves); >> #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ >> diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h >> index 2c6cee8241e0..33b165dbf3db 100644 >> --- a/arch/s390/include/asm/pgtable.h >> +++ b/arch/s390/include/asm/pgtable.h >> @@ -1799,8 +1799,8 @@ static inline int pmd_trans_huge(pmd_t pmd) >> return pmd_leaf(pmd); >> } >> -#define has_transparent_hugepage has_transparent_hugepage >> -static inline int has_transparent_hugepage(void) >> +#define arch_has_pmd_leaves arch_has_pmd_leaves >> +static inline int arch_has_pmd_leaves(void) >> { >> return cpu_has_edat1() ? 1 : 0; >> } >> diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h >> index 2187e9cfcefa..2edd6c9d789c 100644 >> --- a/arch/x86/include/asm/pgtable.h >> +++ b/arch/x86/include/asm/pgtable.h >> @@ -306,8 +306,8 @@ static inline int pud_trans_huge(pud_t pud) >> } >> #endif >> -#define has_transparent_hugepage has_transparent_hugepage >> -static inline int has_transparent_hugepage(void) >> +#define arch_has_pmd_leaves arch_has_pmd_leaves >> +static inline int arch_has_pmd_leaves(void) >> { >> return boot_cpu_has(X86_FEATURE_PSE); >> } >> diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h >> index b365be3516bf..3d7eeb50c183 100644 >> --- a/include/linux/pgtable.h >> +++ b/include/linux/pgtable.h >> @@ -2273,8 +2273,8 @@ static inline void __init init_arch_has_pmd_leaves(void) { } >> #endif >> #endif >> -#ifndef has_transparent_hugepage >> -#define has_transparent_hugepage() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE) >> +#ifndef arch_has_pmd_leaves >> +#define arch_has_pmd_leaves() IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE) >> #endif [Forgot to include the review, doing it now] """ When CONFIG_TRANSPARENT_HUGEPAGE is disabled, do we bypass crucial runtime hardware feature checks on multiple architectures? Because the architecture-specific declarations are often placed inside CONFIG_TRANSPARENT_HUGEPAGE blocks (as seen above, and similarly in arch/x86/include/asm/pgtable.h and arch/s390/include/asm/pgtable.h), they will not be exposed to the generic headers when THP is disabled. The preprocessor will then fall back to the default implementation here. Since architectures like x86, s390, and powerpc select HAVE_ARCH_TRANSPARENT_HUGEPAGE in their Kconfig independent of the THP setting, this fallback evaluates to true. Will this cause init_arch_has_pmd_leaves() to keep the static key enabled, making pgtable_has_pmd_leaves() unconditionally return true at runtime even when THP is disabled? If this happens on older hardware without these features, could subsystems like DAX that rely on pgtable_has_pmd_leaves() attempt to map PMD-sized leaves and cause page table corruption or hardware exceptions? """ Although a bit of a corner case, this is a real issue. Checking on x86, the problem is that the arch's implementation of arch_has_pmd_leaves() lives inside a CONFIG_TRANSPARENT_HUGEPAGE block so it won't be built when CONFIG_TRANSPARENT_HUGEPAGE=n which will cause arch_has_pmd_leaves() to default to true without the proper hardware check. I'll check the other archs and get this fixed. >> #ifndef has_transparent_pud_hugepage >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >> index 970e077019b7..4da10e94bbb6 100644 >> --- a/mm/huge_memory.c >> +++ b/mm/huge_memory.c >> @@ -969,7 +969,7 @@ static int __init hugepage_init(void) >> int err; >> struct kobject *hugepage_kobj; >> - if (!has_transparent_hugepage()) { >> + if (!arch_has_pmd_leaves()) { >> transparent_hugepage_flags = 1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED; >> return -EINVAL; >> } >> diff --git a/mm/memory.c b/mm/memory.c >> index 90b2d9e84320..c62fce83b8d0 100644 >> --- a/mm/memory.c >> +++ b/mm/memory.c >> @@ -169,7 +169,7 @@ EXPORT_SYMBOL(__arch_has_pmd_leaves_key); >> void __init init_arch_has_pmd_leaves(void) >> { >> - if (!has_transparent_hugepage()) >> + if (!arch_has_pmd_leaves()) >> static_branch_disable(&__arch_has_pmd_leaves_key); >> } >