Message ID | 20190921135054.142360-3-justin.he@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fix double page fault on arm64 | expand |
On Sat, Sep 21, 2019 at 09:50:53PM +0800, Jia He wrote: > diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h > index e09760ece844..4a9939615e41 100644 > --- a/arch/arm64/include/asm/pgtable.h > +++ b/arch/arm64/include/asm/pgtable.h > @@ -868,6 +868,18 @@ static inline void update_mmu_cache(struct vm_area_struct *vma, > #define phys_to_ttbr(addr) (addr) > #endif > > +/* > + * On arm64 without hardware Access Flag, copying fromuser will fail because ^^^^^^^^ from user > + * the pte is old and cannot be marked young. So we always end up with zeroed > + * page after fork() + CoW for pfn mappings. we don't always have a ^^ We > + * hardware-managed access flag on arm64. > + */ > +static inline bool arch_faults_on_old_pte(void) > +{ > + return !cpu_has_hw_af(); I saw an early incarnation of your patch having a WARN_ON(preemptible()). I think we need this back just in case this function will be used elsewhere in the future. > +} > +#define arch_faults_on_old_pte arch_faults_on_old_pte Otherwise, Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> -----Original Message----- > From: Catalin Marinas <catalin.marinas@arm.com> > Sent: 2019年9月24日 0:18 > To: Justin He (Arm Technology China) <Justin.He@arm.com> > Cc: Will Deacon <will@kernel.org>; Mark Rutland > <Mark.Rutland@arm.com>; James Morse <James.Morse@arm.com>; Marc > Zyngier <maz@kernel.org>; Matthew Wilcox <willy@infradead.org>; Kirill A. > Shutemov <kirill.shutemov@linux.intel.com>; linux-arm- > kernel@lists.infradead.org; linux-kernel@vger.kernel.org; linux- > mm@kvack.org; Suzuki Poulose <Suzuki.Poulose@arm.com>; Punit > Agrawal <punitagrawal@gmail.com>; Anshuman Khandual > <Anshuman.Khandual@arm.com>; Alex Van Brunt > <avanbrunt@nvidia.com>; Robin Murphy <Robin.Murphy@arm.com>; > Thomas Gleixner <tglx@linutronix.de>; Andrew Morton <akpm@linux- > foundation.org>; Jérôme Glisse <jglisse@redhat.com>; Ralph Campbell > <rcampbell@nvidia.com>; hejianet@gmail.com; Kaly Xin (Arm Technology > China) <Kaly.Xin@arm.com>; nd <nd@arm.com> > Subject: Re: [PATCH v8 2/3] arm64: mm: implement > arch_faults_on_old_pte() on arm64 > > On Sat, Sep 21, 2019 at 09:50:53PM +0800, Jia He wrote: > > diff --git a/arch/arm64/include/asm/pgtable.h > b/arch/arm64/include/asm/pgtable.h > > index e09760ece844..4a9939615e41 100644 > > --- a/arch/arm64/include/asm/pgtable.h > > +++ b/arch/arm64/include/asm/pgtable.h > > @@ -868,6 +868,18 @@ static inline void update_mmu_cache(struct > vm_area_struct *vma, > > #define phys_to_ttbr(addr) (addr) > > #endif > > > > +/* > > + * On arm64 without hardware Access Flag, copying fromuser will fail > because > ^^^^^^^^ > from user > Ok > > + * the pte is old and cannot be marked young. So we always end up with > zeroed > > + * page after fork() + CoW for pfn mappings. we don't always have a > ^^ > We > Ok > > + * hardware-managed access flag on arm64. > > + */ > > +static inline bool arch_faults_on_old_pte(void) > > +{ > > + return !cpu_has_hw_af(); > > I saw an early incarnation of your patch having a > WARN_ON(preemptible()). I think we need this back just in case this > function will be used elsewhere in the future. Okay -- Cheers, Justin (Jia He) > > > +} > > +#define arch_faults_on_old_pte arch_faults_on_old_pte > > Otherwise, > > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index e09760ece844..4a9939615e41 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -868,6 +868,18 @@ static inline void update_mmu_cache(struct vm_area_struct *vma, #define phys_to_ttbr(addr) (addr) #endif +/* + * On arm64 without hardware Access Flag, copying fromuser will fail because + * the pte is old and cannot be marked young. So we always end up with zeroed + * page after fork() + CoW for pfn mappings. we don't always have a + * hardware-managed access flag on arm64. + */ +static inline bool arch_faults_on_old_pte(void) +{ + return !cpu_has_hw_af(); +} +#define arch_faults_on_old_pte arch_faults_on_old_pte + #endif /* !__ASSEMBLY__ */ #endif /* __ASM_PGTABLE_H */
On arm64 without hardware Access Flag, copying fromuser will fail because the pte is old and cannot be marked young. So we always end up with zeroed page after fork() + CoW for pfn mappings. we don't always have a hardware-managed access flag on arm64. Hence implement arch_faults_on_old_pte on arm64 to indicate that it might cause page fault when accessing old pte. Signed-off-by: Jia He <justin.he@arm.com> --- arch/arm64/include/asm/pgtable.h | 12 ++++++++++++ 1 file changed, 12 insertions(+)