• Nick Piggin's avatar
    mm: vmalloc fix lazy unmapping cache aliasing · b29acbdc
    Nick Piggin authored
    Jim Radford has reported that the vmap subsystem rewrite was sometimes
    causing his VIVT ARM system to behave strangely (seemed like going into
    infinite loops trying to fault in pages to userspace).
    We determined that the problem was most likely due to a cache aliasing
    issue.  flush_cache_vunmap was only being called at the moment the page
    tables were to be taken down, however with lazy unmapping, this can happen
    after the page has subsequently been freed and allocated for something
    else.  The dangling alias may still have dirty data attached to it.
    The fix for this problem is to do the cache flushing when the caller has
    called vunmap -- it would be a bug for them to write anything else to the
    mapping at that point.
    That appeared to solve Jim's problems.
    Reported-by: default avatarJim Radford <radford@blackbean.org>
    Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
    Cc: Russell King <rmk@arm.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>