Branch data Line data Source code
1 : : /* Copyright (C) 2009 Red Hat, Inc. 2 : : * 3 : : * See ../COPYING for licensing terms. 4 : : */ 5 : : 6 : : #include <linux/mm.h> 7 : : #include <linux/sched.h> 8 : : #include <linux/sched/mm.h> 9 : : #include <linux/sched/task.h> 10 : : #include <linux/mmu_context.h> 11 : : #include <linux/export.h> 12 : : 13 : : #include <asm/mmu_context.h> 14 : : 15 : : /* 16 : : * use_mm 17 : : * Makes the calling kernel thread take on the specified 18 : : * mm context. 19 : : * (Note: this routine is intended to be called only 20 : : * from a kernel thread context) 21 : : */ 22 : 0 : void use_mm(struct mm_struct *mm) 23 : : { 24 : : struct mm_struct *active_mm; 25 : 0 : struct task_struct *tsk = current; 26 : : 27 : : task_lock(tsk); 28 : 0 : active_mm = tsk->active_mm; 29 : 0 : if (active_mm != mm) { 30 : : mmgrab(mm); 31 : 0 : tsk->active_mm = mm; 32 : : } 33 : 0 : tsk->mm = mm; 34 : 0 : switch_mm(active_mm, mm, tsk); 35 : : task_unlock(tsk); 36 : : #ifdef finish_arch_post_lock_switch 37 : : finish_arch_post_lock_switch(); 38 : : #endif 39 : : 40 : 0 : if (active_mm != mm) 41 : 0 : mmdrop(active_mm); 42 : 0 : } 43 : : EXPORT_SYMBOL_GPL(use_mm); 44 : : 45 : : /* 46 : : * unuse_mm 47 : : * Reverses the effect of use_mm, i.e. releases the 48 : : * specified mm context which was earlier taken on 49 : : * by the calling kernel thread 50 : : * (Note: this routine is intended to be called only 51 : : * from a kernel thread context) 52 : : */ 53 : 0 : void unuse_mm(struct mm_struct *mm) 54 : : { 55 : 0 : struct task_struct *tsk = current; 56 : : 57 : : task_lock(tsk); 58 : 0 : sync_mm_rss(mm); 59 : 0 : tsk->mm = NULL; 60 : : /* active_mm is still 'mm' */ 61 : : enter_lazy_tlb(mm, tsk); 62 : : task_unlock(tsk); 63 : 0 : } 64 : : EXPORT_SYMBOL_GPL(unuse_mm);