aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/mm/mmu_context_hash64.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2009-11-02 07:02:30 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2009-11-05 00:50:25 -0500
commite85a47106abb928e048d89d7fa48f982fcb018aa (patch)
tree22b19d0e8f06dfdb9186d8395ff75aa3bd430090 /arch/powerpc/mm/mmu_context_hash64.c
parent4ab79aa801b6b4f2e2fb508d6107cdd9320d682d (diff)
Split init_new_context and destroy_context
For KVM we need to allocate a new context id, but don't really care about all the mm context around it. So let's split the alloc and destroy functions for the context id, so we can grab one without allocating an mm context. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/mm/mmu_context_hash64.c')
-rw-r--r--arch/powerpc/mm/mmu_context_hash64.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/arch/powerpc/mm/mmu_context_hash64.c b/arch/powerpc/mm/mmu_context_hash64.c
index dbeb86ac90c..b9e4cc2c205 100644
--- a/arch/powerpc/mm/mmu_context_hash64.c
+++ b/arch/powerpc/mm/mmu_context_hash64.c
@@ -18,6 +18,7 @@
18#include <linux/mm.h> 18#include <linux/mm.h>
19#include <linux/spinlock.h> 19#include <linux/spinlock.h>
20#include <linux/idr.h> 20#include <linux/idr.h>
21#include <linux/module.h>
21 22
22#include <asm/mmu_context.h> 23#include <asm/mmu_context.h>
23 24
@@ -32,7 +33,7 @@ static DEFINE_IDR(mmu_context_idr);
32#define NO_CONTEXT 0 33#define NO_CONTEXT 0
33#define MAX_CONTEXT ((1UL << 19) - 1) 34#define MAX_CONTEXT ((1UL << 19) - 1)
34 35
35int init_new_context(struct task_struct *tsk, struct mm_struct *mm) 36int __init_new_context(void)
36{ 37{
37 int index; 38 int index;
38 int err; 39 int err;
@@ -57,6 +58,18 @@ again:
57 return -ENOMEM; 58 return -ENOMEM;
58 } 59 }
59 60
61 return index;
62}
63EXPORT_SYMBOL_GPL(__init_new_context);
64
65int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
66{
67 int index;
68
69 index = __init_new_context();
70 if (index < 0)
71 return index;
72
60 /* The old code would re-promote on fork, we don't do that 73 /* The old code would re-promote on fork, we don't do that
61 * when using slices as it could cause problem promoting slices 74 * when using slices as it could cause problem promoting slices
62 * that have been forced down to 4K 75 * that have been forced down to 4K
@@ -68,11 +81,16 @@ again:
68 return 0; 81 return 0;
69} 82}
70 83
71void destroy_context(struct mm_struct *mm) 84void __destroy_context(int context_id)
72{ 85{
73 spin_lock(&mmu_context_lock); 86 spin_lock(&mmu_context_lock);
74 idr_remove(&mmu_context_idr, mm->context.id); 87 idr_remove(&mmu_context_idr, context_id);
75 spin_unlock(&mmu_context_lock); 88 spin_unlock(&mmu_context_lock);
89}
90EXPORT_SYMBOL_GPL(__destroy_context);
76 91
92void destroy_context(struct mm_struct *mm)
93{
94 __destroy_context(mm->context.id);
77 mm->context.id = NO_CONTEXT; 95 mm->context.id = NO_CONTEXT;
78} 96}