• Paul Mundt's avatar
    sh: Correct iounmap fixmap teardown. · 920efaab
    Paul Mundt authored
    iounmap_fixed() had a couple of bugs in it that caused it to effectively
    fail at life. The total number of pages to unmap factored in the mapping
    offset and aligned up to the next page boundary, which doesn't match the
    ioremap_fixed() behaviour.
    
    When ioremap_fixed() pegs a slot, the address in the mapping data already
    contains the offset displacement, and the size is recorded verbatim given
    that we're only interested in total number of pages required. As such, we
    need to calculate the total number from the original size in the unmap
    path as well.
    
    At the same time, there was also an off-by-1 problem in the fixmap index
    calculation which has also been corrected.
    
    Previously subsequent remaps of an identical fixmap index would trigger
    the pte_ERROR() in set_pte_phys():
    
    	arch/sh/mm/init.c:77: bad pte 8053ffb0(0000781003fff506).
    	arch/sh/mm/init.c:77: bad pte 8053ffb0(0000781003fff506).
    	arch/sh/mm/init.c:77: bad pte 8053ffb0(0000781003fff506).
    	arch/sh/mm/init.c:77: bad pte 8053ffb0(0000781003fff506).
    	arch/sh/mm/init.c:77: bad pte 8053ffb0(0000781003fff506).
    	arch/sh/mm/init.c:77: bad pte 8053ffb0(0000781003fff506).
    
    With this patch in place, the iounmap-driven fixmap teardown actually
    does what it's supposed to do.
    Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
    920efaab
ioremap_fixed.c 2.45 KB