cregit-Linux how code gets into the kernel

Release 4.11 arch/s390/include/asm/pgalloc.h

/*
 *  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>

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

PersonTokensPropCommitsCommitProp
Michael Holzheu3248.48%120.00%
Martin Schwidefsky2943.94%240.00%
Gerald Schaefer46.06%120.00%
Linus Torvalds (pre-git)11.52%120.00%
Total66100.00%5100.00%


static inline void crst_table_init(unsigned long *crst, unsigned long entry) { clear_table(crst, entry, sizeof(unsigned long)*2048); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky2064.52%250.00%
Linus Torvalds (pre-git)619.35%125.00%
Gerald Schaefer516.13%125.00%
Total31100.00%4100.00%


static inline unsigned long pgd_entry_type(struct mm_struct *mm) { if (mm->context.asce_limit <= (1UL << 31)) return _SEGMENT_ENTRY_EMPTY; if (mm->context.asce_limit <= (1UL << 42)) return _REGION3_ENTRY_EMPTY; return _REGION2_ENTRY_EMPTY; }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky50100.00%3100.00%
Total50100.00%3100.00%

int crst_table_upgrade(struct mm_struct *); void crst_table_downgrade(struct mm_struct *);
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

PersonTokensPropCommitsCommitProp
Martin Schwidefsky45100.00%2100.00%
Total45100.00%2100.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

PersonTokensPropCommitsCommitProp
Martin Schwidefsky5880.56%466.67%
Gerald Schaefer1419.44%233.33%
Total72100.00%6100.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

PersonTokensPropCommitsCommitProp
Martin Schwidefsky3494.44%266.67%
Benjamin Herrenschmidt25.56%133.33%
Total36100.00%3100.00%


static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud) { pgd_val(*pgd) = _REGION2_ENTRY | __pa(pud); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky33100.00%3100.00%
Total33100.00%3100.00%


static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) { pud_val(*pud) = _REGION3_ENTRY | __pa(pmd); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky33100.00%4100.00%
Total33100.00%4100.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 == (1UL << 31)) { /* 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

PersonTokensPropCommitsCommitProp
Martin Schwidefsky7798.72%685.71%
Gerald Schaefer11.28%114.29%
Total78100.00%7100.00%


static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) { if (mm->context.asce_limit == (1UL << 31)) pgtable_pmd_page_dtor(virt_to_page(pgd)); crst_table_free(mm, (unsigned long *) pgd); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky4896.00%266.67%
Benjamin Herrenschmidt24.00%133.33%
Total50100.00%3100.00%


static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t pte) { pmd_val(*pmd) = _SEGMENT_ENTRY + __pa(pte); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky1650.00%457.14%
Linus Torvalds1237.50%228.57%
Linus Torvalds (pre-git)412.50%114.29%
Total32100.00%7100.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); #endif /* _S390_PGALLOC_H */

Overall Contributors

PersonTokensPropCommitsCommitProp
Martin Schwidefsky59382.82%2172.41%
Linus Torvalds (pre-git)344.75%13.45%
Michael Holzheu324.47%13.45%
Gerald Schaefer253.49%26.90%
Linus Torvalds212.93%26.90%
Benjamin Herrenschmidt101.40%13.45%
Heiko Carstens10.14%13.45%
Total716100.00%29100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.