_t pmd) return false; } -#define split_huge_pmd(__vma, __pmd, __address) \ - do { \ - pmd_t *____pmd = (__pmd); \ - if (pmd_is_huge(*____pmd)) \ - __split_huge_pmd(__vma, __pmd, __address, \ - false); \ - } while (0) +static inline int split_huge_pmd(struct vm_area_struct *vma, + pmd_t *pmd, unsigned long address) +{ + if (pmd_is_huge(*pmd)) + return __split_huge_pmd(vma, pmd, address, false); + return 0; +} -void split_huge_pmd_address(struct vm_area_struct *vma, unsigned long address, +int split_huge_pmd_address(struct vm_area_struct *vma, unsigned long address, bool freeze); void __split_huge_pud(struct vm_area_struct *vma, pud_t *pud, @@ -651,13 +651,15 @@ static inline int try_folio_split_to_order(struct folio *folio, static inline void deferred_split_folio(struct folio *folio, bool partially_mapped) {} static inline void reparent_deferred_split_queue(struct mem_cgroup *memcg) {} -#define split_huge_pmd(__vma, __pmd, __address) \ - do { } while (0) - -static inline void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, - unsigned long address, bool freeze) {} -static inline void split_huge_pmd_address(struct vm_area_struct *vma, - unsigned long address, bool freeze) {} +static inline int split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, + unsigned long address) +{ + return 0; +} +static inline int __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, + unsigned long address, bool freeze) { return 0; } +static inline int split_huge_pmd_address(struct vm_area_struct *vma, + unsigned long address, bool freeze) { return 0; } static inline void split_huge_pmd_locked(struct vm_area_struct *vma, unsigned long address, pmd_t *pmd, bool freeze) {} diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 8003d3a498220..125ff36f475de 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -3273,7 +3273,7 @@ void split_huge_pmd_locked(struct vm_area_struct *vma, unsigned long address, __split_huge_pmd_locked(vma, pmd, address, freeze); } -void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, +int __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, unsigned long address, bool freeze) { spinlock_t *ptl; @@ -3287,20 +3287,22 @@ void __split_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, split_huge_pmd_locked(vma, range.start, pmd, freeze); spin_unlock(ptl); mmu_notifier_invalidate_range_end(&range); + + return 0; } -void split_huge_pmd_address(struct vm_area_struct *vma, unsigned long address, +int split_huge_pmd_address(struct vm_area_struct *vma, unsigned long address, bool freeze) { pmd_t *pmd = mm_find_pmd(vma->vm_mm, address); if (!pmd) - return; + return 0; - __split_huge_pmd(vma, pmd, address, freeze); + return __split_huge_pmd(vma, pmd, address, freeze); } -static inline void split_huge_pmd_if_needed(struct vm_area_struct *vma, unsigned long address) +static inline int split_huge_pmd_if_needed(struct vm_area_struct *vma, unsigned long address) { /* * If the new address isn't hpage aligned and it could previously @@ -3309,7 +3311,9 @@ static inline void split_huge_pmd_if_needed(struct vm_area_struct *vma, unsigned if (!IS_ALIGNED(address, HPAGE_PMD_SIZE) && range_in_vma(vma, ALIGN_DOWN(address, HPAGE_PMD_SIZE), ALIGN(address, HPAGE_PMD_SIZE))) - split_huge_pmd_address(vma, address, false); + return split_huge_pmd_address(vma, address, false); + + return 0; } void vma_adjust_trans_huge(struct vm_area_struct *vma, -- 2.47.3[RFC v2 01/21] mm: thp: make split_huge_pmd functions return int for error propagationUsama Arif undefinedAndrew Morton , david@kernel.org, lorenzo.stoakes@oracle.com, willy@infradead.org, linux-mm@kvack.org undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined