• Nicolas Pitre's avatar
    ARM: 5691/1: fix cache aliasing issues between kmap() and kmap_atomic() with highmem · 5a3a29fe
    Nicolas Pitre authored
    commit 7929eb9c upstream.
    
    Let's suppose a highmem page is kmap'd with kmap().  A pkmap entry is
    used, the page mapped to it, and the virtual cache is dirtied.  Then
    kunmap() is used which does virtually nothing except for decrementing a
    usage count.
    
    Then, let's suppose the _same_ page gets mapped using kmap_atomic().
    It is therefore mapped onto a fixmap entry instead, which has a
    different virtual address unaware of the dirty cache data for that page
    sitting in the pkmap mapping.
    
    Fortunately it is easy to know if a pkmap mapping still exists for that
    page and use it directly with kmap_atomic(), thanks to kmap_high_get().
    
    And actual testing with a printk in the added code path shows that this
    condition is actually met *extremely* frequently.  Seems that we've been
    quite lucky that things have worked so well with highmem so far.
    Signed-off-by: default avatarNicolas Pitre <nico@marvell.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    5a3a29fe
highmem.c 2.94 KB