diff options
Diffstat (limited to 'arch/s390/include/asm/pgalloc.h')
| -rw-r--r-- | arch/s390/include/asm/pgalloc.h | 65 | 
1 files changed, 13 insertions, 52 deletions
diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h index 082eb4e50e8..38e71ebcd3c 100644 --- a/arch/s390/include/asm/pgalloc.h +++ b/arch/s390/include/asm/pgalloc.h @@ -17,16 +17,15 @@  #include <linux/gfp.h>  #include <linux/mm.h> -#define check_pgt_cache()	do {} while (0) - -unsigned long *crst_table_alloc(struct mm_struct *, int); +unsigned long *crst_table_alloc(struct mm_struct *);  void crst_table_free(struct mm_struct *, unsigned long *); -void crst_table_free_rcu(struct mm_struct *, unsigned long *);  unsigned long *page_table_alloc(struct mm_struct *);  void page_table_free(struct mm_struct *, unsigned long *); -void page_table_free_rcu(struct mm_struct *, unsigned long *); -void disable_noexec(struct mm_struct *, struct task_struct *); +#ifdef CONFIG_HAVE_RCU_TABLE_FREE +void page_table_free_rcu(struct mmu_gather *, unsigned long *); +void __tlb_remove_table(void *_table); +#endif  static inline void clear_table(unsigned long *s, unsigned long val, size_t n)  { @@ -50,9 +49,6 @@ static inline void clear_table(unsigned long *s, unsigned long val, size_t n)  static inline void crst_table_init(unsigned long *crst, unsigned long entry)  {  	clear_table(crst, entry, sizeof(unsigned long)*2048); -	crst = get_shadow_table(crst); -	if (crst) -		clear_table(crst, entry, sizeof(unsigned long)*2048);  }  #ifndef __s390x__ @@ -69,10 +65,7 @@ static inline unsigned long pgd_entry_type(struct mm_struct *mm)  #define pmd_free(mm, x)				do { } while (0)  #define pgd_populate(mm, pgd, pud)		BUG() -#define pgd_populate_kernel(mm, pgd, pud)	BUG() -  #define pud_populate(mm, pud, pmd)		BUG() -#define pud_populate_kernel(mm, pud, pmd)	BUG()  #else /* __s390x__ */ @@ -90,7 +83,7 @@ void crst_table_downgrade(struct mm_struct *, unsigned long limit);  static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)  { -	unsigned long *table = crst_table_alloc(mm, mm->context.noexec); +	unsigned long *table = crst_table_alloc(mm);  	if (table)  		crst_table_init(table, _REGION3_ENTRY_EMPTY);  	return (pud_t *) table; @@ -99,43 +92,21 @@ static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)  static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr)  { -	unsigned long *table = crst_table_alloc(mm, mm->context.noexec); +	unsigned long *table = crst_table_alloc(mm);  	if (table)  		crst_table_init(table, _SEGMENT_ENTRY_EMPTY);  	return (pmd_t *) table;  }  #define pmd_free(mm, pmd) crst_table_free(mm, (unsigned long *) pmd) -static inline void pgd_populate_kernel(struct mm_struct *mm, -				       pgd_t *pgd, pud_t *pud) -{ -	pgd_val(*pgd) = _REGION2_ENTRY | __pa(pud); -} -  static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)  { -	pgd_populate_kernel(mm, pgd, pud); -	if (mm->context.noexec) { -		pgd = get_shadow_table(pgd); -		pud = get_shadow_table(pud); -		pgd_populate_kernel(mm, pgd, pud); -	} -} - -static inline void pud_populate_kernel(struct mm_struct *mm, -				       pud_t *pud, pmd_t *pmd) -{ -	pud_val(*pud) = _REGION3_ENTRY | __pa(pmd); +	pgd_val(*pgd) = _REGION2_ENTRY | __pa(pud);  }  static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)  { -	pud_populate_kernel(mm, pud, pmd); -	if (mm->context.noexec) { -		pud = get_shadow_table(pud); -		pmd = get_shadow_table(pmd); -		pud_populate_kernel(mm, pud, pmd); -	} +	pud_val(*pud) = _REGION3_ENTRY | __pa(pmd);  }  #endif /* __s390x__ */ @@ -143,29 +114,19 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)  static inline pgd_t *pgd_alloc(struct mm_struct *mm)  {  	spin_lock_init(&mm->context.list_lock); -	INIT_LIST_HEAD(&mm->context.crst_list);  	INIT_LIST_HEAD(&mm->context.pgtable_list); -	return (pgd_t *) -		crst_table_alloc(mm, user_mode == SECONDARY_SPACE_MODE); +	return (pgd_t *) crst_table_alloc(mm);  }  #define pgd_free(mm, pgd) crst_table_free(mm, (unsigned long *) pgd) -static inline void pmd_populate_kernel(struct mm_struct *mm, -				       pmd_t *pmd, pte_t *pte) -{ -	pmd_val(*pmd) = _SEGMENT_ENTRY + __pa(pte); -} -  static inline void pmd_populate(struct mm_struct *mm,  				pmd_t *pmd, pgtable_t pte)  { -	pmd_populate_kernel(mm, pmd, pte); -	if (mm->context.noexec) { -		pmd = get_shadow_table(pmd); -		pmd_populate_kernel(mm, pmd, pte + PTRS_PER_PTE); -	} +	pmd_val(*pmd) = _SEGMENT_ENTRY + __pa(pte);  } +#define pmd_populate_kernel(mm, pmd, pte) pmd_populate(mm, pmd, pte) +  #define pmd_pgtable(pmd) \  	(pgtable_t)(pmd_val(pmd) & -sizeof(pte_t)*PTRS_PER_PTE)  |