ARC: Fix bogus gcc warning and micro-optimise TLB iteration loop
authorVineet Gupta <vgupta@synopsys.com>
Fri, 27 Sep 2013 12:50:06 +0000 (18:20 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Wed, 6 Nov 2013 05:11:41 +0000 (10:41 +0530)
------------------>8----------------------
arch/arc/mm/tlb.c: In function ‘do_tlb_overlap_fault’:
arch/arc/mm/tlb.c:688:13: warning: array subscript is above array bounds
[-Warray-bounds]
         (pd0[n] & PAGE_MASK)) {
             ^
------------------>8----------------------

While at it, remove the usless last iteration of outer loop when reading
a TLB SET for duplicate entries.

Suggested-by: Mischa Jonker <mjonker@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/mm/tlb.c

index 71cb26df42555feadce79409c44d097260bd06e7..5f53050abf6000046b8a6bfef06bd9b737e8d8f0 100644 (file)
@@ -610,9 +610,9 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
                          struct pt_regs *regs)
 {
        int set, way, n;
-       unsigned int pd0[4], pd1[4];    /* assume max 4 ways */
        unsigned long flags, is_valid;
        struct cpuinfo_arc_mmu *mmu = &cpuinfo_arc700[smp_processor_id()].mmu;
+       unsigned int pd0[mmu->ways], pd1[mmu->ways];
 
        local_irq_save(flags);
 
@@ -637,7 +637,7 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
                        continue;
 
                /* Scan the set for duplicate ways: needs a nested loop */
-               for (way = 0; way < mmu->ways; way++) {
+               for (way = 0; way < mmu->ways - 1; way++) {
                        if (!pd0[way])
                                continue;