|
@@ -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();
|