• Linus Torvalds's avatar
    x86: mm: remove 'sign' games from LAM untagged_addr*() macros · 1dbc0a95
    Linus Torvalds authored
    The intent of the sign games was to not modify kernel addresses when
    untagging them.  However, that had two issues:
    
     (a) it didn't actually work as intended, since the mask was calculated
         as 'addr >> 63' on an _unsigned_ address. So instead of getting a
         mask of all ones for kernel addresses, you just got '1'.
    
     (b) untagging a kernel address isn't actually a valid operation anyway.
    
    Now, (a) had originally been true for both 'untagged_addr()' and the
    remote version of it, but had accidentally been fixed for the regular
    version of untagged_addr() by commit e0bddc19 ("x86/mm: Reduce
    untagged_addr() overhead for systems without LAM").  That one rewrote
    the shift to be part of the alternative asm code, and in the process
    changed the unsigned shift into a signed 'sar' instruction.
    
    And while it is true that we don't want to turn what looks like a kernel
    address into a user address by masking off the high bit, that doesn't
    need these sign masking games - all it needs is that the mm context
    'untag_mask' value has the high bit set.
    
    Which it always does.
    
    So simplify the code by just removing the superfluous (and in the case
    of untagged_addr_remote(), still buggy) sign bit games in the address
    masking.
    Acked-by: default avatarDave Hansen <dave.hansen@intel.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    1dbc0a95
uaccess_64.h 4.65 KB