1
linux/arch/ppc
Marcelo Tosatti eb07d964b4 [PATCH] ppc32 8xx: update_mmu_cache() needs unconditional tlbie
Currently 8xx fails to boot due to endless pagefaults.

Seems the bug is exposed by the change which avoids flushing the
TLB when not necessary (in case the pte has not changed), introduced
recently:

__handle_mm_fault():

        entry = pte_mkyoung(entry);
        if (!pte_same(old_entry, entry)) {
                ptep_set_access_flags(vma, address, pte, entry, write_access);
                update_mmu_cache(vma, address, entry);
                lazy_mmu_prot_update(entry);
        } else {
                /*
                 * This is needed only for protection faults but the arch code
                 * is not yet telling us if this is a protection fault or not.
                 * This still avoids useless tlb flushes for .text page faults
                 * with threads.
                 */
                if (write_access)
                        flush_tlb_page(vma, address);
        }

The "update_mmu_cache()" call was unconditional before, which caused the TLB
to be flushed by:

        if (pfn_valid(pfn)) {
                struct page *page = pfn_to_page(pfn);
                if (!PageReserved(page)
                    && !test_bit(PG_arch_1, &page->flags)) {
                        if (vma->vm_mm == current->active_mm) {
#ifdef CONFIG_8xx
                        /* On 8xx, cache control instructions (particularly 
                         * "dcbst" from flush_dcache_icache) fault as write 
                         * operation if there is an unpopulated TLB entry 
                         * for the address in question. To workaround that, 
                         * we invalidate the TLB here, thus avoiding dcbst 
                         * misbehaviour.
                         */
                                _tlbie(address);
#endif
                                __flush_dcache_icache((void *) address);
                        } else
                                flush_dcache_icache_page(page);
                        set_bit(PG_arch_1, &page->flags);
                }

Which worked to due to pure luck: PG_arch_1 was always unset before, but
now it isnt.

The root of the problem are the changes against the 8xx TLB handlers introduced
during v2.6. What happens is the TLBMiss handlers load the zeroed pte into
the TLB, causing the TLBError handler to be invoked (thats two TLB faults per 
pagefault), which then jumps to the generic MM code to setup the pte.

The bug is that the zeroed TLB is not invalidated (the same reason
for the "dcbst" misbehaviour), resulting in infinite TLBError faults.

The "two exception" approach requires a TLB flush (to nuke the zeroed TLB)
at each PTE update for correct behaviour:

Signed-off-by: Marcelo Tosatti <marcelo.tosatti@cyclades.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2005-11-16 13:28:22 +11:00
..
4xx_io [PATCH] ppc: fix-up schedule_timeout() usage 2005-11-07 07:53:56 -08:00
8xx_io [PATCH] kfree cleanup: arch 2005-11-07 07:54:06 -08:00
8260_io [PATCH] ppc: fix-up schedule_timeout() usage 2005-11-07 07:53:56 -08:00
amiga
boot [PATCH] powerpc: Consolidate asm compatibility macros 2005-11-10 13:10:38 +11:00
configs [PATCH] ppc32: Update MPC834x platform to work with new phylib 2005-11-09 07:55:52 -08:00
kernel [PATCH] Update email address for Kumar 2005-11-13 18:14:10 -08:00
lib ppc32: use L1_CACHE_SHIFT/L1_CACHE_BYTES 2005-10-17 11:50:32 +10:00
math-emu [PATCH] powerpc: Fix handling of fpscr on 64-bit 2005-10-27 20:48:50 +10:00
mm [PATCH] ppc32 8xx: update_mmu_cache() needs unconditional tlbie 2005-11-16 13:28:22 +11:00
platforms [PATCH] ppc32: Add support for handling PCI interrupts on MPC834x PCI expansion card 2005-11-13 18:14:13 -08:00
syslib [PATCH] Update email address for Kumar 2005-11-13 18:14:10 -08:00
xmon [PATCH] ppc: Fix ARCH=ppc build with xmon 2005-11-08 11:19:48 +11:00
Kconfig [PATCH] RapidIO support: ppc32 2005-11-07 07:53:47 -08:00
Kconfig.debug
Makefile [PATCH] powerpc: Merge bitops.h 2005-11-01 21:49:02 +11:00