hugetlb: pte_alloc_huge() to replace huge pte_alloc_map()
Subsystems (3)
PATCH 1/1 hugetlb: pte_alloc_huge() to replace huge pte_alloc_map()
Some architectures can have their hugetlb pages down at the lowest PTE
level: their huge_pte_alloc() using pte_alloc_map(), but without any following pte_unmap(). Since none of these arches uses CONFIG_HIGHPTE, this is not seen as a problem at present; but would become a problem if forthcoming changes were to add an rcu_read_lock() into pte_offset_map(), with the rcu_read_unlock() expected in pte_unmap().
Similarly in their huge_pte_offset(): pte_offset_kernel() is good enough for that, but it's probably less confusing if we define pte_offset_huge() along with pte_alloc_huge(). Only define them without CONFIG_HIGHPTE:
so there would be a build error to signal if ever more work is needed.
For ease of development, define these now for 6.4-rc1, ahead of any use:
then architectures can integrate patches using them, independent from mm.
---
include/linux/hugetlb.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
include/linux/hugetlb.h +17 -0
@@ -183,6 +183,23 @@ extern struct list_head huge_boot_pages;/* arch callbacks */ +#ifndef CONFIG_HIGHPTE +/* +* pte_offset_huge() and pte_alloc_huge() are helpers for those architectures +* which may go down to the lowest PTE level in their huge_pte_offset() and +* huge_pte_alloc(): to avoid reliance on pte_offset_map() without pte_unmap(). +*/ +static inline pte_t *pte_offset_huge (pmd_t *pmd,unsigned long address) +{ +return pte_offset_kernel (pmd, address); +} +static inline pte_t *pte_alloc_huge (struct mm_struct *mm,pmd_t *pmd, +unsigned long address) +{ +return pte_alloc (mm, pmd) ?NULL :pte_offset_huge (pmd, address); +} +#endif +pte_t *huge_pte_alloc (struct mm_struct *mm,struct vm_area_struct *vma,unsigned long addr,unsigned long sz);/*
Quoted 12 lines · Hugh Dickins
Some architectures can have their hugetlb pages down at the lowest PTE
level: theirhuge_pte_alloc()usingpte_alloc_map(), but without any followingpte_unmap(). Since none of these arches usesCONFIG_HIGHPTE, this is not seen as a problem at present; but would become a problem if forthcoming changes were to add anrcu_read_lock()intopte_offset_map(), with thercu_read_unlock()expected inpte_unmap().Similarly in their
huge_pte_offset():pte_offset_kernel()is good enough for that, but it's probably less confusing if we definepte_offset_huge()along withpte_alloc_huge(). Only define them withoutCONFIG_HIGHPTE:
so there would be a build error to signal if ever more work is needed.
Quoted 8 lines
For ease of development, define these now for 6.4-rc1, ahead of any use:
then architectures can integrate patches using them, independent from mm.Signed-off-by Hugh Dickins <[email protected]>---
include/linux/hugetlb.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
Hate to say that I am ignorant of the 'forthcoming changes' that might add an rcu_read_lock() into pte_offset_map(). But, the reasoning is sound and code is fine.
Signature · 1 line
Mike Kravetz
Quoted 27 lines
include/linux/hugetlb.h +17
-0@@ -183,6 +183,23 @@ extern struct list_head huge_boot_pages;/* arch callbacks */ +#ifndef CONFIG_HIGHPTE +/* +* pte_offset_huge() and pte_alloc_huge() are helpers for those architectures +* which may go down to the lowest PTE level in their huge_pte_offset() and +* huge_pte_alloc(): to avoid reliance on pte_offset_map() without pte_unmap(). +*/ +static inline pte_t *pte_offset_huge (pmd_t *pmd,unsigned long address) +{ +return pte_offset_kernel (pmd, address); +} +static inline pte_t *pte_alloc_huge (struct mm_struct *mm,pmd_t *pmd, +unsigned long address) +{ +return pte_alloc (mm, pmd) ?NULL :pte_offset_huge (pmd, address); +} +#endif +pte_t *huge_pte_alloc (struct mm_struct *mm,struct vm_area_struct *vma,unsigned long addr,unsigned long sz);/*