Message ID | 20210722205219.7934-17-yu-cheng.yu@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Control-flow Enforcement: Shadow Stack | expand |
On Thu, Jul 22, 2021 at 01:52:03PM -0700, Yu-cheng Yu wrote: > diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c > index 3364fe62b903..ba449d12ec32 100644 > --- a/arch/x86/mm/pgtable.c > +++ b/arch/x86/mm/pgtable.c > @@ -610,6 +610,26 @@ int pmdp_clear_flush_young(struct vm_area_struct *vma, > } > #endif > > +pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) > +{ > + if (likely(vma->vm_flags & VM_WRITE)) > + pte = pte_mkwrite(pte); > + else if (likely(vma->vm_flags & VM_SHADOW_STACK)) > + pte = pte_mkwrite_shstk(pte); > + return pte; > +} > + > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > +pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma) > +{ > + if (likely(vma->vm_flags & VM_WRITE)) > + pmd = pmd_mkwrite(pmd); > + else if (likely(vma->vm_flags & VM_SHADOW_STACK)) > + pmd = pmd_mkwrite_shstk(pmd); What are all those likely()ies here for?
On 8/16/2021 10:03 AM, Borislav Petkov wrote: > On Thu, Jul 22, 2021 at 01:52:03PM -0700, Yu-cheng Yu wrote: >> diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c >> index 3364fe62b903..ba449d12ec32 100644 >> --- a/arch/x86/mm/pgtable.c >> +++ b/arch/x86/mm/pgtable.c >> @@ -610,6 +610,26 @@ int pmdp_clear_flush_young(struct vm_area_struct *vma, >> } >> #endif >> >> +pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) >> +{ >> + if (likely(vma->vm_flags & VM_WRITE)) >> + pte = pte_mkwrite(pte); >> + else if (likely(vma->vm_flags & VM_SHADOW_STACK)) >> + pte = pte_mkwrite_shstk(pte); >> + return pte; >> +} >> + >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> +pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma) >> +{ >> + if (likely(vma->vm_flags & VM_WRITE)) >> + pmd = pmd_mkwrite(pmd); >> + else if (likely(vma->vm_flags & VM_SHADOW_STACK)) >> + pmd = pmd_mkwrite_shstk(pmd); > > What are all those likely()ies here for? > I will remove those. Thanks, Yu-cheng
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index df4ce715560a..bfe4ea2b652d 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h @@ -280,6 +280,9 @@ static inline int pmd_trans_huge(pmd_t pmd) return (pmd_val(pmd) & (_PAGE_PSE|_PAGE_DEVMAP)) == _PAGE_PSE; } +#define maybe_pmd_mkwrite maybe_pmd_mkwrite +extern pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma); + #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD static inline int pud_trans_huge(pud_t pud) { @@ -1632,6 +1635,9 @@ static inline bool arch_faults_on_old_pte(void) return false; } +#define maybe_mkwrite maybe_mkwrite +extern pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma); + #endif /* __ASSEMBLY__ */ #endif /* _ASM_X86_PGTABLE_H */ diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 3364fe62b903..ba449d12ec32 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -610,6 +610,26 @@ int pmdp_clear_flush_young(struct vm_area_struct *vma, } #endif +pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) +{ + if (likely(vma->vm_flags & VM_WRITE)) + pte = pte_mkwrite(pte); + else if (likely(vma->vm_flags & VM_SHADOW_STACK)) + pte = pte_mkwrite_shstk(pte); + return pte; +} + +#ifdef CONFIG_TRANSPARENT_HUGEPAGE +pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma) +{ + if (likely(vma->vm_flags & VM_WRITE)) + pmd = pmd_mkwrite(pmd); + else if (likely(vma->vm_flags & VM_SHADOW_STACK)) + pmd = pmd_mkwrite_shstk(pmd); + return pmd; +} +#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ + /** * reserve_top_address - reserves a hole in the top of kernel address space * @reserve - size of hole to reserve diff --git a/include/linux/mm.h b/include/linux/mm.h index 4a9985e50819..4548f75cef14 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1015,12 +1015,14 @@ void free_compound_page(struct page *page); * pte_mkwrite. But get_user_pages can cause write faults for mappings * that do not have writing enabled, when used by access_process_vm. */ +#ifndef maybe_mkwrite static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma) { if (likely(vma->vm_flags & VM_WRITE)) pte = pte_mkwrite(pte); return pte; } +#endif vm_fault_t do_set_pmd(struct vm_fault *vmf, struct page *page); void do_set_pte(struct vm_fault *vmf, struct page *page, unsigned long addr); diff --git a/mm/huge_memory.c b/mm/huge_memory.c index afff3ac87067..c8dd5913884e 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -491,12 +491,14 @@ static int __init setup_transparent_hugepage(char *str) } __setup("transparent_hugepage=", setup_transparent_hugepage); +#ifndef maybe_pmd_mkwrite pmd_t maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma) { if (likely(vma->vm_flags & VM_WRITE)) pmd = pmd_mkwrite(pmd); return pmd; } +#endif #ifdef CONFIG_MEMCG static inline struct deferred_split *get_deferred_split_queue(struct page *page)