Release 4.14 arch/s390/include/asm/pgalloc.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
* S390 version
* Copyright IBM Corp. 1999, 2000
* Author(s): Hartmut Penner (hp@de.ibm.com)
* Martin Schwidefsky (schwidefsky@de.ibm.com)
*
* Derived from "include/asm-i386/pgalloc.h"
* Copyright (C) 1994 Linus Torvalds
*/
#ifndef _S390_PGALLOC_H
#define _S390_PGALLOC_H
#include <linux/threads.h>
#include <linux/gfp.h>
#include <linux/mm.h>
#define CRST_ALLOC_ORDER 2
unsigned long *crst_table_alloc(struct mm_struct *);
void crst_table_free(struct mm_struct *, unsigned long *);
unsigned long *page_table_alloc(struct mm_struct *);
struct page *page_table_alloc_pgste(struct mm_struct *mm);
void page_table_free(struct mm_struct *, unsigned long *);
void page_table_free_rcu(struct mmu_gather *, unsigned long *, unsigned long);
void page_table_free_pgste(struct page *page);
extern int page_table_allocate_pgste;
static inline void clear_table(unsigned long *s, unsigned long val, size_t n)
{
struct addrtype { char _[256]; };
int i;
for (i = 0; i < n; i += 256) {
*s = val;
asm volatile(
"mvc 8(248,%[s]),0(%[s])\n"
: "+m" (*(struct addrtype *) s)
: [s] "a" (s));
s += 256 / sizeof(long);
}
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Michael Holzheu | 32 | 48.48% | 1 | 20.00% |
Martin Schwidefsky | 29 | 43.94% | 2 | 40.00% |
Gerald Schaefer | 4 | 6.06% | 1 | 20.00% |
Linus Torvalds (pre-git) | 1 | 1.52% | 1 | 20.00% |
Total | 66 | 100.00% | 5 | 100.00% |
static inline void crst_table_init(unsigned long *crst, unsigned long entry)
{
clear_table(crst, entry, _CRST_TABLE_SIZE);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 17 | 68.00% | 2 | 40.00% |
Linus Torvalds (pre-git) | 6 | 24.00% | 1 | 20.00% |
Heiko Carstens | 1 | 4.00% | 1 | 20.00% |
Gerald Schaefer | 1 | 4.00% | 1 | 20.00% |
Total | 25 | 100.00% | 5 | 100.00% |
static inline unsigned long pgd_entry_type(struct mm_struct *mm)
{
if (mm->context.asce_limit <= _REGION3_SIZE)
return _SEGMENT_ENTRY_EMPTY;
if (mm->context.asce_limit <= _REGION2_SIZE)
return _REGION3_ENTRY_EMPTY;
if (mm->context.asce_limit <= _REGION1_SIZE)
return _REGION2_ENTRY_EMPTY;
return _REGION1_ENTRY_EMPTY;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 52 | 94.55% | 4 | 80.00% |
Heiko Carstens | 3 | 5.45% | 1 | 20.00% |
Total | 55 | 100.00% | 5 | 100.00% |
int crst_table_upgrade(struct mm_struct *mm, unsigned long limit);
void crst_table_downgrade(struct mm_struct *);
static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long address)
{
unsigned long *table = crst_table_alloc(mm);
if (table)
crst_table_init(table, _REGION2_ENTRY_EMPTY);
return (p4d_t *) table;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 45 | 100.00% | 1 | 100.00% |
Total | 45 | 100.00% | 1 | 100.00% |
#define p4d_free(mm, p4d) crst_table_free(mm, (unsigned long *) p4d)
static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
{
unsigned long *table = crst_table_alloc(mm);
if (table)
crst_table_init(table, _REGION3_ENTRY_EMPTY);
return (pud_t *) table;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 45 | 100.00% | 2 | 100.00% |
Total | 45 | 100.00% | 2 | 100.00% |
#define pud_free(mm, pud) crst_table_free(mm, (unsigned long *) pud)
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
{
unsigned long *table = crst_table_alloc(mm);
if (!table)
return NULL;
crst_table_init(table, _SEGMENT_ENTRY_EMPTY);
if (!pgtable_pmd_page_ctor(virt_to_page(table))) {
crst_table_free(mm, table);
return NULL;
}
return (pmd_t *) table;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 58 | 80.56% | 4 | 66.67% |
Gerald Schaefer | 14 | 19.44% | 2 | 33.33% |
Total | 72 | 100.00% | 6 | 100.00% |
static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
{
pgtable_pmd_page_dtor(virt_to_page(pmd));
crst_table_free(mm, (unsigned long *) pmd);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 34 | 94.44% | 2 | 66.67% |
Benjamin Herrenschmidt | 2 | 5.56% | 1 | 33.33% |
Total | 36 | 100.00% | 3 | 100.00% |
static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, p4d_t *p4d)
{
pgd_val(*pgd) = _REGION1_ENTRY | __pa(p4d);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 33 | 100.00% | 4 | 100.00% |
Total | 33 | 100.00% | 4 | 100.00% |
static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4d, pud_t *pud)
{
p4d_val(*p4d) = _REGION2_ENTRY | __pa(pud);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 33 | 100.00% | 2 | 100.00% |
Total | 33 | 100.00% | 2 | 100.00% |
static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
{
pud_val(*pud) = _REGION3_ENTRY | __pa(pmd);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 33 | 100.00% | 4 | 100.00% |
Total | 33 | 100.00% | 4 | 100.00% |
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
{
unsigned long *table = crst_table_alloc(mm);
if (!table)
return NULL;
if (mm->context.asce_limit == _REGION3_SIZE) {
/* Forking a compat process with 2 page table levels */
if (!pgtable_pmd_page_ctor(virt_to_page(table))) {
crst_table_free(mm, table);
return NULL;
}
}
return (pgd_t *) table;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 72 | 97.30% | 6 | 75.00% |
Heiko Carstens | 1 | 1.35% | 1 | 12.50% |
Gerald Schaefer | 1 | 1.35% | 1 | 12.50% |
Total | 74 | 100.00% | 8 | 100.00% |
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
{
if (mm->context.asce_limit == _REGION3_SIZE)
pgtable_pmd_page_dtor(virt_to_page(pgd));
crst_table_free(mm, (unsigned long *) pgd);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 43 | 93.48% | 2 | 50.00% |
Benjamin Herrenschmidt | 2 | 4.35% | 1 | 25.00% |
Heiko Carstens | 1 | 2.17% | 1 | 25.00% |
Total | 46 | 100.00% | 4 | 100.00% |
static inline void pmd_populate(struct mm_struct *mm,
pmd_t *pmd, pgtable_t pte)
{
pmd_val(*pmd) = _SEGMENT_ENTRY + __pa(pte);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds | 16 | 50.00% | 2 | 33.33% |
Martin Schwidefsky | 16 | 50.00% | 4 | 66.67% |
Total | 32 | 100.00% | 6 | 100.00% |
#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)
/*
* page table entry allocation/free routines.
*/
#define pte_alloc_one_kernel(mm, vmaddr) ((pte_t *) page_table_alloc(mm))
#define pte_alloc_one(mm, vmaddr) ((pte_t *) page_table_alloc(mm))
#define pte_free_kernel(mm, pte) page_table_free(mm, (unsigned long *) pte)
#define pte_free(mm, pte) page_table_free(mm, (unsigned long *) pte)
extern void rcu_table_freelist_finish(void);
void vmem_map_init(void);
void *vmem_crst_alloc(unsigned long val);
pte_t *vmem_pte_alloc(void);
#endif /* _S390_PGALLOC_H */
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Martin Schwidefsky | 674 | 81.60% | 21 | 63.64% |
Heiko Carstens | 33 | 4.00% | 4 | 12.12% |
Michael Holzheu | 32 | 3.87% | 1 | 3.03% |
Linus Torvalds (pre-git) | 30 | 3.63% | 1 | 3.03% |
Linus Torvalds | 25 | 3.03% | 2 | 6.06% |
Gerald Schaefer | 21 | 2.54% | 2 | 6.06% |
Benjamin Herrenschmidt | 10 | 1.21% | 1 | 3.03% |
Greg Kroah-Hartman | 1 | 0.12% | 1 | 3.03% |
Total | 826 | 100.00% | 33 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.