summaryrefslogtreecommitdiffstats
path: root/arch/mips/mm/tlb-r3k.c
diff options
context:
space:
mode:
authorGreg Ungerer2009-05-20 08:12:32 +0200
committerRalf Baechle2009-05-20 19:53:14 +0200
commita5e696e5d0f1377ff6beb10d2f40edb6a3d1de18 (patch)
tree2f7b194c53e9a7e2ab6c8b58335c299a897231fe /arch/mips/mm/tlb-r3k.c
parentMIPS: IP28: Change to build with -mr10k-cache-barrier=store (diff)
downloadkernel-qcow2-linux-a5e696e5d0f1377ff6beb10d2f40edb6a3d1de18.tar.gz
kernel-qcow2-linux-a5e696e5d0f1377ff6beb10d2f40edb6a3d1de18.tar.xz
kernel-qcow2-linux-a5e696e5d0f1377ff6beb10d2f40edb6a3d1de18.zip
MIPS: 64-bit: Fix system lockup.
The address range size calculation inside local_flush_tlb_kernel_range() is being truncated by a too small size variable holder on 64-bit systems. The truncated size can result in an erroneous tlbsize check that means we sit spinning inside a loop trying to flush a hige number of TLB entries. This is for all intents and purposes a system hang. Fix by using an appropriately sized valiable to hold the size. [Ralf: Greg's original patch submission identified the issue and fixed one instance in tlb-r4k.c but there there were several more. For consistency I also modified tlb-r3k.c even though that file is only used on 32-bit.] Signed-off-by: Greg Ungerer <gerg@snapgear.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/mm/tlb-r3k.c')
-rw-r--r--arch/mips/mm/tlb-r3k.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/arch/mips/mm/tlb-r3k.c b/arch/mips/mm/tlb-r3k.c
index f0cf46adb978..1c0048a6f5cf 100644
--- a/arch/mips/mm/tlb-r3k.c
+++ b/arch/mips/mm/tlb-r3k.c
@@ -82,8 +82,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
int cpu = smp_processor_id();
if (cpu_context(cpu, mm) != 0) {
- unsigned long flags;
- int size;
+ unsigned long size, flags;
#ifdef DEBUG_TLB
printk("[tlbrange<%lu,0x%08lx,0x%08lx>]",
@@ -121,8 +120,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
{
- unsigned long flags;
- int size;
+ unsigned long size, flags;
#ifdef DEBUG_TLB
printk("[tlbrange<%lu,0x%08lx,0x%08lx>]", start, end);