Re: [PATCH v6 2/7] powerpc/64s: mm: Introduce __pmdp_collapse_flush with mm_struct argument
From: Rohan McLure <hidden>
Date: 2023-02-15 00:41:50
On 15 Feb 2023, at 11:17 am, Rohan McLure [off-list ref] wrote:quoted
On 14 Feb 2023, at 5:02 pm, Christophe Leroy [off-list ref] wrote: Le 14/02/2023 à 02:59, Rohan McLure a écrit :quoted
pmdp_collapse_flush has references in generic code with just three parameters, due to the choice of mm context being implied by the vm_area context parameter. Define __pmdp_collapse_flush to accept an additional mm_struct * parameter, with pmdp_collapse_flush a macro that unpacks the vma and calls __pmdp_collapse_flush. The mm_struct * parameter is needed in a future patch providing Page Table Check support, which is defined in terms of mm context objects. Signed-off-by: Rohan McLure <redacted> --- v6: New patch --- arch/powerpc/include/asm/book3s/64/pgtable.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h index cb4c67bf45d7..9d8b4e25f5ed 100644 --- a/arch/powerpc/include/asm/book3s/64/pgtable.h +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h@@ -1244,14 +1244,22 @@ static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, return hash__pmdp_huge_get_and_clear(mm, addr, pmdp);} -static inline pmd_t pmdp_collapse_flush(struct vm_area_struct *vma, - unsigned long address, pmd_t *pmdp) +static inline pmd_t __pmdp_collapse_flush(struct vm_area_struct *vma, struct mm_struct *mm, + unsigned long address, pmd_t *pmdp) { if (radix_enabled()) return radix__pmdp_collapse_flush(vma, address, pmdp); return hash__pmdp_collapse_flush(vma, address, pmdp); } -#define pmdp_collapse_flush pmdp_collapse_flush +#define pmdp_collapse_flush(vma, addr, pmdp) \ +({ \ + struct vm_area_struct *_vma = (vma); \ + pmd_t _r; \ + \ + _r = __pmdp_collapse_flush(_vma, _vma->vm_mm, (addr), (pmdp)); \ + \ + _r; \ +})Can you make it a static inline function instead of a ugly macro ?Due to some header hell, it’s looking like this location only has access to a prototype for struct vm_area_struct. Might have to remain a macro then. Probably don’t need to expliclty declare a variable for the macro ‘return’ though.
It’s the same solution opted for by ptep_test_and_clear_young.
#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
#define ptep_test_and_clear_young(__vma, __addr, __ptep) \
({ \
__ptep_test_and_clear_young((__vma)->vm_mm, __addr, __ptep); \
})
quoted
quoted
#define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR_FULL pmd_t pmdp_huge_get_and_clear_full(struct vm_area_struct *vma,