Release 4.11 arch/powerpc/mm/mmu_context_book3s64.c
/*
* MMU context allocation for 64-bit kernels.
*
* Copyright (C) 2004 Anton Blanchard, IBM Corp. <anton@samba.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
*/
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/spinlock.h>
#include <linux/idr.h>
#include <linux/export.h>
#include <linux/gfp.h>
#include <linux/slab.h>
#include <asm/mmu_context.h>
#include <asm/pgalloc.h>
#include "icswx.h"
static DEFINE_SPINLOCK(mmu_context_lock);
static DEFINE_IDA(mmu_context_ida);
int __init_new_context(void)
{
int index;
int err;
again:
if (!ida_pre_get(&mmu_context_ida, GFP_KERNEL))
return -ENOMEM;
spin_lock(&mmu_context_lock);
err = ida_get_new_above(&mmu_context_ida, 1, &index);
spin_unlock(&mmu_context_lock);
if (err == -EAGAIN)
goto again;
else if (err)
return err;
if (index > MAX_USER_CONTEXT) {
spin_lock(&mmu_context_lock);
ida_remove(&mmu_context_ida, index);
spin_unlock(&mmu_context_lock);
return -ENOMEM;
}
return index;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Paul Mackerras | 83 | 76.85% | 1 | 20.00% |
Sonny Rao | 12 | 11.11% | 1 | 20.00% |
Anton Blanchard | 6 | 5.56% | 1 | 20.00% |
Alexander Graf | 6 | 5.56% | 1 | 20.00% |
Aneesh Kumar K.V | 1 | 0.93% | 1 | 20.00% |
Total | 108 | 100.00% | 5 | 100.00% |
EXPORT_SYMBOL_GPL(__init_new_context);
static int radix__init_new_context(struct mm_struct *mm, int index)
{
unsigned long rts_field;
/*
* set the process table entry,
*/
rts_field = radix__get_tree_size();
process_tb[index].prtb0 = cpu_to_be64(rts_field | __pa(mm->pgd) | RADIX_PGD_INDEX_SIZE);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 48 | 100.00% | 2 | 100.00% |
Total | 48 | 100.00% | 2 | 100.00% |
int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
{
int index;
index = __init_new_context();
if (index < 0)
return index;
if (radix_enabled()) {
radix__init_new_context(mm, index);
} else {
/* The old code would re-promote on fork, we don't do that
* when using slices as it could cause problem promoting slices
* that have been forced down to 4K
*
* For book3s we have MMU_NO_CONTEXT set to be ~0. Hence check
* explicitly against context.id == 0. This ensures that we
* properly initialize context slice details for newly allocated
* mm's (which will have id == 0) and don't alter context slice
* inherited via fork (which will have id != 0).
*
* We should not be calling init_new_context() on init_mm. Hence a
* check against 0 is ok.
*/
if (mm->context.id == 0)
slice_set_user_psize(mm, mmu_virtual_psize);
subpage_prot_init_new_context(mm);
}
mm->context.id = index;
#ifdef CONFIG_PPC_ICSWX
mm->context.cop_lockp = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
if (!mm->context.cop_lockp) {
__destroy_context(index);
subpage_prot_free(mm);
mm->context.id = MMU_NO_CONTEXT;
return -ENOMEM;
}
spin_lock_init(mm->context.cop_lockp);
#endif /* CONFIG_PPC_ICSWX */
#ifdef CONFIG_PPC_64K_PAGES
mm->context.pte_frag = NULL;
#endif
#ifdef CONFIG_SPAPR_TCE_IOMMU
mm_iommu_init(mm);
#endif
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Tseng-Hui (Frank) Lin | 63 | 37.06% | 1 | 9.09% |
Aneesh Kumar K.V | 37 | 21.76% | 3 | 27.27% |
Alexander Graf | 31 | 18.24% | 1 | 9.09% |
Stephen Rothwell | 10 | 5.88% | 2 | 18.18% |
Benjamin Herrenschmidt | 10 | 5.88% | 1 | 9.09% |
Alexey Kardashevskiy | 10 | 5.88% | 1 | 9.09% |
David Gibson | 5 | 2.94% | 1 | 9.09% |
Paul Mackerras | 4 | 2.35% | 1 | 9.09% |
Total | 170 | 100.00% | 11 | 100.00% |
void __destroy_context(int context_id)
{
spin_lock(&mmu_context_lock);
ida_remove(&mmu_context_ida, context_id);
spin_unlock(&mmu_context_lock);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Paul Mackerras | 21 | 75.00% | 1 | 33.33% |
Alexander Graf | 5 | 17.86% | 1 | 33.33% |
Anton Blanchard | 2 | 7.14% | 1 | 33.33% |
Total | 28 | 100.00% | 3 | 100.00% |
EXPORT_SYMBOL_GPL(__destroy_context);
#ifdef CONFIG_PPC_64K_PAGES
static void destroy_pagetable_page(struct mm_struct *mm)
{
int count;
void *pte_frag;
struct page *page;
pte_frag = mm->context.pte_frag;
if (!pte_frag)
return;
page = virt_to_page(pte_frag);
/* drop all the pending references */
count = ((unsigned long)pte_frag & ~PAGE_MASK) >> PTE_FRAG_SIZE_SHIFT;
/* We allow PTE_FRAG_NR fragments from a PTE page */
if (page_ref_sub_and_test(page, PTE_FRAG_NR - count)) {
pgtable_page_dtor(page);
free_hot_cold_page(page, 0);
}
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 81 | 94.19% | 1 | 50.00% |
JoonSoo Kim | 5 | 5.81% | 1 | 50.00% |
Total | 86 | 100.00% | 2 | 100.00% |
#else
static inline void destroy_pagetable_page(struct mm_struct *mm)
{
return;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 13 | 100.00% | 1 | 100.00% |
Total | 13 | 100.00% | 1 | 100.00% |
#endif
void destroy_context(struct mm_struct *mm)
{
#ifdef CONFIG_SPAPR_TCE_IOMMU
WARN_ON_ONCE(!list_empty(&mm->context.iommu_group_mem_list));
#endif
#ifdef CONFIG_PPC_ICSWX
drop_cop(mm->context.acop, mm);
kfree(mm->context.cop_lockp);
mm->context.cop_lockp = NULL;
#endif /* CONFIG_PPC_ICSWX */
if (radix_enabled())
process_tb[mm->context.id].prtb1 = 0;
else
subpage_prot_free(mm);
destroy_pagetable_page(mm);
__destroy_context(mm->context.id);
mm->context.id = MMU_NO_CONTEXT;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Tseng-Hui (Frank) Lin | 34 | 31.19% | 1 | 12.50% |
Aneesh Kumar K.V | 29 | 26.61% | 2 | 25.00% |
Alexey Kardashevskiy | 19 | 17.43% | 2 | 25.00% |
Alexander Graf | 18 | 16.51% | 1 | 12.50% |
Paul Mackerras | 8 | 7.34% | 1 | 12.50% |
Michael Ellerman | 1 | 0.92% | 1 | 12.50% |
Total | 109 | 100.00% | 8 | 100.00% |
#ifdef CONFIG_PPC_RADIX_MMU
void radix__switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
{
asm volatile("isync": : :"memory");
mtspr(SPRN_PID, next->context.id);
asm volatile("isync \n"
PPC_SLBIA(0x7)
: : :"memory");
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 32 | 100.00% | 2 | 100.00% |
Total | 32 | 100.00% | 2 | 100.00% |
#endif
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 256 | 38.15% | 6 | 27.27% |
Paul Mackerras | 154 | 22.95% | 1 | 4.55% |
Tseng-Hui (Frank) Lin | 100 | 14.90% | 1 | 4.55% |
Alexander Graf | 72 | 10.73% | 1 | 4.55% |
Alexey Kardashevskiy | 29 | 4.32% | 2 | 9.09% |
Sonny Rao | 12 | 1.79% | 1 | 4.55% |
Benjamin Herrenschmidt | 10 | 1.49% | 1 | 4.55% |
Stephen Rothwell | 10 | 1.49% | 2 | 9.09% |
Anton Blanchard | 10 | 1.49% | 1 | 4.55% |
David Gibson | 5 | 0.75% | 1 | 4.55% |
JoonSoo Kim | 5 | 0.75% | 1 | 4.55% |
Jimi Xenidis | 3 | 0.45% | 1 | 4.55% |
Tejun Heo | 3 | 0.45% | 1 | 4.55% |
Paul Gortmaker | 1 | 0.15% | 1 | 4.55% |
Michael Ellerman | 1 | 0.15% | 1 | 4.55% |
Total | 671 | 100.00% | 22 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.