• H. Peter Anvin's avatar
    x86-64, rwsem: 64-bit xadd rwsem implementation · 1838ef1d
    H. Peter Anvin authored
    For x86-64, 32767 threads really is not enough.  Change rwsem_count_t
    to a signed long, so that it is 64 bits on x86-64.
    
    This required the following changes to the assembly code:
    
    a) %z0 doesn't work on all versions of gcc!  At least gcc 4.4.2 as
       shipped with Fedora 12 emits "ll" not "q" for 64 bits, even for
       integer operands.  Newer gccs apparently do this correctly, but
       avoid this problem by using the _ASM_ macros instead of %z.
    b) 64 bits immediates are only allowed in "movq $imm,%reg"
       constructs... no others.  Change some of the constraints to "e",
       and fix the one case where we would have had to use an invalid
       immediate -- in that case, we only care about the upper half
       anyway, so just access the upper half.
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    LKML-Reference: <tip-bafaecd1@git.kernel.org>
    1838ef1d
rwsem.h 7.98 KB