• Linus Torvalds's avatar
    vfs: dcache: move hashlen_hash() from callers into d_hash() · e60cc611
    Linus Torvalds authored
    Both __d_lookup_rcu() and __d_lookup_rcu_op_compare() have the full
    'name_hash' value of the qstr that they want to look up, and mask it off
    to just the low 32-bit hash before calling down to d_hash().
    
    Other callers just load the 32-bit hash and pass it as the argument.
    
    If we move the masking into d_hash() itself, it simplifies the two
    callers that currently do the masking, and is a no-op for the other
    cases.  It doesn't actually change the generated code since the compiler
    will inline d_hash() and see that the end result is the same.
    
    [ Technically, since the parse tree changes, the code generation may not
      be 100% the same, and for me on x86-64, this does result in gcc
      switching the operands around for one 'cmpl' instruction. So not
      necessarily the exact same code generation, but equivalent ]
    
    However, this does encapsulate the 'd_hash()' operation more, and makes
    the shift operation in particular be a "shift 32 bits right, return full
    word".  Which matches the instruction semantics on both x86-64 and arm64
    better, since a 32-bit shift will clear the upper bits.
    
    That makes the next step of introducing a "shift by runtime constant"
    more obvious and generates the shift with no extraneous type masking.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e60cc611
dcache.c 83.6 KB