• John David Anglin's avatar
    parisc: Fix cache routines to ignore vma's with an invalid pfn · b81ed405
    John David Anglin authored
    commit 50861f5a upstream.
    
    The parisc architecture does not have a pte special bit. As a result,
    special mappings are handled with the VM_PFNMAP and VM_MIXEDMAP flags.
    VM_MIXEDMAP mappings may or may not have a "struct page" backing. When
    pfn_valid() is false, there is no "struct page" backing. Otherwise, they
    are treated as normal pages.
    
    The FireGL driver uses the VM_MIXEDMAP without a backing "struct page".
    This treatment caused a panic due to a TLB data miss in
    update_mmu_cache. This appeared to be in the code generated for
    page_address(). We were in fact using a very circular bit of code to
    determine the physical address of the PFN in various cache routines.
    This wasn't valid when there was no "struct page" backing.  The needed
    address can in fact be determined simply from the PFN itself without
    using the "struct page".
    
    The attached patch updates update_mmu_cache(), flush_cache_mm(),
    flush_cache_range() and flush_cache_page() to check pfn_valid() and to
    directly compute the PFN physical and virtual addresses.
    Signed-off-by: default avatarJohn David Anglin <dave.anglin@bell.net>
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b81ed405
cache.c 17.6 KB