• Russell King's avatar
    Allow architectures to override copy_user_highpage() · 487ff320
    Russell King authored
    With aliasing VIPT cache support, the ARM implementation of
    clear_user_page() and copy_user_page() sets up a temporary kernel space
    mapping such that we have the same cache colour as the userspace page.
    This avoids having to consider any userspace aliases from this operation.
    
    However, when highmem is enabled, kmap_atomic() have to setup mappings.
    The copy_user_highpage() and clear_user_highpage() call these functions
    before delegating the copies to copy_user_page() and clear_user_page().
    
    The effect of this is that each of the *_user_highpage() functions setup
    their own kmap mapping, followed by the *_user_page() functions setting
    up another mapping.  This is rather wasteful.
    
    Thankfully, copy_user_highpage() can be overriden by architectures by
    defining __HAVE_ARCH_COPY_USER_HIGHPAGE.  However, replacement of
    clear_user_highpage() is more difficult because its inline definition
    is not conditional.  It seems that you're expected to define
    __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE and provide a replacement
    __alloc_zeroed_user_highpage() implementation instead.
    
    The allocation itself is fine, so we don't want to override that.  What
    we really want to do is to override clear_user_highpage() with our own
    version which doesn't kmap_atomic() unnecessarily.
    
    Other VIPT architectures (PARISC and SH) would also like to override
    this function as well.
    Acked-by: default avatarHugh Dickins <hugh@veritas.com>
    Acked-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
    Acked-by: default avatarPaul Mundt <lethal@linux-sh.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    487ff320
highmem.h 4.78 KB