mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-12 00:38:55 +00:00
sparc64: Take ctx_alloc_lock properly in hugetlb_setup().
On cheetahplus chips we take the ctx_alloc_lock in order to modify the TLB lookup parameters for the indexed TLBs, which are stored in the context register. This is called with interrupts disabled, however ctx_alloc_lock is an IRQ safe lock, therefore we must take acquire/release it properly with spin_{lock,unlock}_irq(). Reported-by: Meelis Roos <mroos@linux.ee> Tested-by: Meelis Roos <mroos@linux.ee> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ecc5fbd5ef
commit
9ea46abe22
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user