cregit-Linux how code gets into the kernel

Release 4.11 arch/arm/include/asm/mmu_context.h

/*
 *  arch/arm/include/asm/mmu_context.h
 *
 *  Copyright (C) 1996 Russell King.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 *  Changelog:
 *   27-06-1996 RMK     Created
 */
#ifndef __ASM_ARM_MMU_CONTEXT_H

#define __ASM_ARM_MMU_CONTEXT_H

#include <linux/compiler.h>
#include <linux/sched.h>
#include <linux/mm_types.h>
#include <linux/preempt.h>

#include <asm/cacheflush.h>
#include <asm/cachetype.h>
#include <asm/proc-fns.h>
#include <asm/smp_plat.h>
#include <asm-generic/mm_hooks.h>

void __check_vmalloc_seq(struct mm_struct *mm);

#ifdef CONFIG_CPU_HAS_ASID

void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk);

static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm) { atomic64_set(&mm->context.id, 0); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Arnd Bergmann2681.25%150.00%
Russell King618.75%150.00%
Total32100.00%2100.00%

#ifdef CONFIG_ARM_ERRATA_798181 void a15_erratum_get_cpumask(int this_cpu, struct mm_struct *mm, cpumask_t *mask); #else /* !CONFIG_ARM_ERRATA_798181 */
static inline void a15_erratum_get_cpumask(int this_cpu, struct mm_struct *mm, cpumask_t *mask) { }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier18100.00%1100.00%
Total18100.00%1100.00%

#endif /* CONFIG_ARM_ERRATA_798181 */ #else /* !CONFIG_CPU_HAS_ASID */ #ifdef CONFIG_MMU
static inline void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk) { if (unlikely(mm->context.vmalloc_seq != init_mm.context.vmalloc_seq)) __check_vmalloc_seq(mm); if (irqs_disabled()) /* * cpu_switch_mm() needs to flush the VIVT caches. To avoid * high interrupt latencies, defer the call and continue * running with the old mm. Since we only support UP systems * on non-ASID CPUs, the old mm will remain valid until the * finish_arch_post_lock_switch() call. */ mm->context.switch_pending = 1; else cpu_switch_mm(mm->pgd, mm); }

Contributors

PersonTokensPropCommitsCommitProp
Catalin Marinas3047.62%350.00%
Russell King3047.62%233.33%
Nico Pitre34.76%116.67%
Total63100.00%6100.00%

#ifndef MODULE #define finish_arch_post_lock_switch \ finish_arch_post_lock_switch
static inline void finish_arch_post_lock_switch(void) { struct mm_struct *mm = current->mm; if (mm && mm->context.switch_pending) { /* * Preemption must be disabled during cpu_switch_mm() as we * have some stateful cache flush implementations. Check * switch_pending again in case we were preempted and the * switch to this mm was already done. */ preempt_disable(); if (mm->context.switch_pending) { mm->context.switch_pending = 0; cpu_switch_mm(mm->pgd, mm); } preempt_enable_no_resched(); } }

Contributors

PersonTokensPropCommitsCommitProp
Catalin Marinas64100.00%2100.00%
Total64100.00%2100.00%

#endif /* !MODULE */ #endif /* CONFIG_MMU */
static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Arnd Bergmann1470.00%133.33%
Linus Torvalds (pre-git)315.00%133.33%
Russell King315.00%133.33%
Total20100.00%3100.00%

#endif /* CONFIG_CPU_HAS_ASID */ #define destroy_context(mm) do { } while(0) #define activate_mm(prev,next) switch_mm(prev, next, NULL) /* * This is called when "tsk" is about to enter lazy TLB mode. * * mm: describes the currently active mm context * tsk: task which is entering lazy tlb * cpu: cpu number which is entering lazy tlb * * tsk->mm will be NULL */
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) { }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)16100.00%1100.00%
Total16100.00%1100.00%

/* * This is the actual mm switch as far as the scheduler * is concerned. No registers are touched. We avoid * calling the CPU specific function when the mm hasn't * actually changed. */
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk) { #ifdef CONFIG_MMU unsigned int cpu = smp_processor_id(); /* * __sync_icache_dcache doesn't broadcast the I-cache invalidation, * so check for possible thread migration and invalidate the I-cache * if we're new to this CPU. */ if (cache_ops_need_broadcast() && !cpumask_empty(mm_cpumask(next)) && !cpumask_test_cpu(cpu, mm_cpumask(next))) __flush_icache_all(); if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next)) || prev != next) { check_and_switch_context(next, tsk); if (cache_is_vivt()) cpumask_clear_cpu(cpu, mm_cpumask(prev)); } #endif }

Contributors

PersonTokensPropCommitsCommitProp
Russell King4038.46%650.00%
Linus Torvalds (pre-git)2524.04%216.67%
Catalin Marinas1918.27%216.67%
Rusty Russell1615.38%18.33%
Will Deacon43.85%18.33%
Total104100.00%12100.00%

#define deactivate_mm(tsk,mm) do { } while (0) #endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Catalin Marinas13830.40%411.43%
Russell King11124.45%1440.00%
Linus Torvalds (pre-git)6113.44%617.14%
Marc Zyngier439.47%12.86%
Arnd Bergmann408.81%12.86%
Will Deacon204.41%38.57%
Rusty Russell163.52%12.86%
Linus Torvalds91.98%12.86%
Steven Rostedt61.32%12.86%
Nico Pitre40.88%12.86%
Ingo Molnar30.66%12.86%
Andrew Lutomirski30.66%12.86%
Total454100.00%35100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.