|
@@ -2824,9 +2824,10 @@ void hugetlb_setup(struct pt_regs *regs)
|
|
* the Data-TLB for huge pages.
|
|
* the Data-TLB for huge pages.
|
|
*/
|
|
*/
|
|
if (tlb_type == cheetah_plus) {
|
|
if (tlb_type == cheetah_plus) {
|
|
|
|
+ bool need_context_reload = false;
|
|
unsigned long ctx;
|
|
unsigned long ctx;
|
|
|
|
|
|
- spin_lock(&ctx_alloc_lock);
|
|
|
|
|
|
+ spin_lock_irq(&ctx_alloc_lock);
|
|
ctx = mm->context.sparc64_ctx_val;
|
|
ctx = mm->context.sparc64_ctx_val;
|
|
ctx &= ~CTX_PGSZ_MASK;
|
|
ctx &= ~CTX_PGSZ_MASK;
|
|
ctx |= CTX_PGSZ_BASE << CTX_PGSZ0_SHIFT;
|
|
ctx |= CTX_PGSZ_BASE << CTX_PGSZ0_SHIFT;
|
|
@@ -2845,9 +2846,12 @@ void hugetlb_setup(struct pt_regs *regs)
|
|
* also executing in this address space.
|
|
* also executing in this address space.
|
|
*/
|
|
*/
|
|
mm->context.sparc64_ctx_val = ctx;
|
|
mm->context.sparc64_ctx_val = ctx;
|
|
- on_each_cpu(context_reload, mm, 0);
|
|
|
|
|
|
+ need_context_reload = true;
|
|
}
|
|
}
|
|
- spin_unlock(&ctx_alloc_lock);
|
|
|
|
|
|
+ spin_unlock_irq(&ctx_alloc_lock);
|
|
|
|
+
|
|
|
|
+ if (need_context_reload)
|
|
|
|
+ on_each_cpu(context_reload, mm, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|