lkml.org 
[lkml]   [2004]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH] (urgent) ppc32: Fix CPUs with soft loaded TLB
    Benjamin Herrenschmidt wrote:

    >On Sun, 2004-06-06 at 16:20, Linus Torvalds wrote:
    >
    >>On Sun, 6 Jun 2004, Benjamin Herrenschmidt wrote:
    >>
    >>>The recent introduction of ptep_set_access_flags() with the optimisation
    >>>of not flushing the TLB unfortunately broke ppc32 CPUs with no hash table.
    >>>
    >>Makes sense, applied.
    >>
    >
    >ARGH. Missed one file. Here is an additional patch (missed tlbflush.h patch)
    >
    >Sorry.
    >
    >This adds the definiction of flush_tlb_page_nohash() that was missing
    >from the previous patch fixing SW-TLB loaded PPCs
    >
    >Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    >
    >===== include/asm-ppc/tlbflush.h 1.9 vs edited =====
    >--- 1.9/include/asm-ppc/tlbflush.h 2003-09-15 15:59:05 -05:00
    >+++ edited/include/asm-ppc/tlbflush.h 2004-06-06 16:01:50 -05:00
    >@@ -29,6 +29,9 @@
    > static inline void flush_tlb_page(struct vm_area_struct *vma,
    > unsigned long vmaddr)
    > { _tlbie(vmaddr); }
    >+static inline void flush_tlb_page_nohash(struct vm_area_struct *vma,
    >+ unsigned long vmaddr)
    >+ { _tlbie(vmaddr); }
    > static inline void flush_tlb_range(struct vm_area_struct *vma,
    > unsigned long start, unsigned long end)
    > { __tlbia(); }
    >@@ -44,6 +47,9 @@
    > static inline void flush_tlb_page(struct vm_area_struct *vma,
    > unsigned long vmaddr)
    > { _tlbie(vmaddr); }
    >+static inline void flush_tlb_page_nohash(struct vm_area_struct *vma,
    >+ unsigned long vmaddr)
    >+ { _tlbie(vmaddr); }
    > static inline void flush_tlb_range(struct mm_struct *mm,
    > unsigned long start, unsigned long end)
    > { __tlbia(); }
    >@@ -56,6 +62,7 @@
    > struct vm_area_struct;
    > extern void flush_tlb_mm(struct mm_struct *mm);
    > extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
    >+extern void flush_tlb_page_nohash(struct vm_area_struct *vma, unsigned long addr);
    > extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
    > unsigned long end);
    > extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
    >
    >
    >
    >
    >
    >
    Hi

    Unfortunately this is not enough for me on 8xx.

    When starting init it bombs with

    Freeing unused kernel memory: 60k init
    Oops: kernel access of bad area, sig: 11 [#1]
    NIP: C00070F0 LR: C000C580 SP: C0FD7E00 REGS: c0fd7d50 TRAP: 0300 Not
    tainted
    MSR: 00009032 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
    DAR: 300009D4, DSISR: C2000000
    TASK = c0fda870[1] 'init' THREAD: c0fd6000Last syscall: 11
    GPR00: C01C4D60 C0FD7E00 C0FDA870 30000000 00000100 00000F3B 30000000
    00000040
    GPR08: 00000000 C01C4D60 C0F3E4C0 0001E760 00016FCB 1001F0AC 00FD0100
    007FFE30
    GPR16: FFFFFFFF 00F841E0 00000001 007FFEC0 007FFF00 00000000 00000000
    C01C4D60
    GPR24: 00000000 C01C3300 00000000 C0F3FF14 300009D4 C0F3E4C0 00F3B889
    C0200760
    NIP [c00070f0] __flush_dcache_icache+0x10/0x3c
    LR [c000c580] update_mmu_cache+0x98/0x9c
    Call trace:
    [c0044270] do_no_page+0x19c/0x35c
    [c00445ec] handle_mm_fault+0xf8/0x178
    [c000bbac] do_page_fault+0x1f0/0x3e8
    [c0004868] handle_page_fault+0xc/0x80


    In order to fix this I now have to remove update_mmu_cache by defining
    it empty.

    Please see the following patch.

    Regards

    Pantelis

    ===== include/asm-ppc/tlbflush.h 1.10 vs edited =====
    --- 1.10/include/asm-ppc/tlbflush.h Mon Jun 7 00:01:50 2004
    +++ edited/include/asm-ppc/tlbflush.h Mon Jun 7 10:20:49 2004
    @@ -56,6 +56,9 @@
    static inline void flush_tlb_kernel_range(unsigned long start,
    unsigned long end)
    { __tlbia(); }
    +static inline void update_mmu_cache(struct vm_area_struct *vma,
    + unsigned long addr, pte_t pte)
    + { /* nothing */ }

    #else /* 6xx, 7xx, 7xxx cpus */
    struct mm_struct;
    @@ -78,6 +81,7 @@
    {
    }

    +#if !defined(CONFIG_8xx)
    /*
    * This gets called at the end of handling a page fault, when
    * the kernel has put a new PTE into the page table for the process.
    @@ -88,6 +92,7 @@
    * waiting for the inevitable extra hash-table miss exception.
    */
    extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
    +#endif

    #endif /* _PPC_TLBFLUSH_H */
    #endif /*__KERNEL__ */
    ===== arch/ppc/mm/init.c 1.36 vs edited =====
    --- 1.36/arch/ppc/mm/init.c Sat May 15 05:00:22 2004
    +++ edited/arch/ppc/mm/init.c Mon Jun 7 10:19:36 2004
    @@ -605,6 +605,7 @@
    kunmap(page);
    }

    +#if !defined(CONFIG_8xx)
    /*
    * This is called at the end of handling a user page fault, when the
    * fault has been handled by updating a PTE in the linux page tables.
    @@ -642,3 +643,4 @@
    }
    #endif
    }
    +#endif
    \
     
     \ /
      Last update: 2005-03-22 14:03    [W:0.032 / U:1.780 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site