PPC: Split context init/destroy functions
We need to reserve a context from KVM to make sure we have our own segment space. While we did that split for Book3S_64 already, 32 bit is still outstanding. So let's split it now. Signed-off-by: Alexander Graf <agraf@suse.de> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Родитель
0737279427
Коммит
c83ec269e6
|
@ -27,6 +27,8 @@ extern int __init_new_context(void);
|
|||
extern void __destroy_context(int context_id);
|
||||
static inline void mmu_context_init(void) { }
|
||||
#else
|
||||
extern unsigned long __init_new_context(void);
|
||||
extern void __destroy_context(unsigned long context_id);
|
||||
extern void mmu_context_init(void);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -60,11 +60,7 @@
|
|||
static unsigned long next_mmu_context;
|
||||
static unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
|
||||
|
||||
|
||||
/*
|
||||
* Set up the context for a new address space.
|
||||
*/
|
||||
int init_new_context(struct task_struct *t, struct mm_struct *mm)
|
||||
unsigned long __init_new_context(void)
|
||||
{
|
||||
unsigned long ctx = next_mmu_context;
|
||||
|
||||
|
@ -74,11 +70,30 @@ int init_new_context(struct task_struct *t, struct mm_struct *mm)
|
|||
ctx = 0;
|
||||
}
|
||||
next_mmu_context = (ctx + 1) & LAST_CONTEXT;
|
||||
mm->context.id = ctx;
|
||||
|
||||
return ctx;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__init_new_context);
|
||||
|
||||
/*
|
||||
* Set up the context for a new address space.
|
||||
*/
|
||||
int init_new_context(struct task_struct *t, struct mm_struct *mm)
|
||||
{
|
||||
mm->context.id = __init_new_context();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free a context ID. Make sure to call this with preempt disabled!
|
||||
*/
|
||||
void __destroy_context(unsigned long ctx)
|
||||
{
|
||||
clear_bit(ctx, context_map);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__destroy_context);
|
||||
|
||||
/*
|
||||
* We're finished using the context for an address space.
|
||||
*/
|
||||
|
@ -86,7 +101,7 @@ void destroy_context(struct mm_struct *mm)
|
|||
{
|
||||
preempt_disable();
|
||||
if (mm->context.id != NO_CONTEXT) {
|
||||
clear_bit(mm->context.id, context_map);
|
||||
__destroy_context(mm->context.id);
|
||||
mm->context.id = NO_CONTEXT;
|
||||
}
|
||||
preempt_enable();
|
||||
|
|
Загрузка…
Ссылка в новой задаче