Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

vfs: dcache: move hashlen_hash() from callers into d_hash()

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: Linus Torvalds <torvalds@linux-foundation.org>

+4 -4
+4 -4
fs/dcache.c
··· 100 100 101 101 static struct hlist_bl_head *dentry_hashtable __ro_after_init; 102 102 103 - static inline struct hlist_bl_head *d_hash(unsigned int hash) 103 + static inline struct hlist_bl_head *d_hash(unsigned long hashlen) 104 104 { 105 - return dentry_hashtable + (hash >> d_hash_shift); 105 + return dentry_hashtable + ((u32)hashlen >> d_hash_shift); 106 106 } 107 107 108 108 #define IN_LOOKUP_SHIFT 10 ··· 2104 2104 unsigned *seqp) 2105 2105 { 2106 2106 u64 hashlen = name->hash_len; 2107 - struct hlist_bl_head *b = d_hash(hashlen_hash(hashlen)); 2107 + struct hlist_bl_head *b = d_hash(hashlen); 2108 2108 struct hlist_bl_node *node; 2109 2109 struct dentry *dentry; 2110 2110 ··· 2171 2171 { 2172 2172 u64 hashlen = name->hash_len; 2173 2173 const unsigned char *str = name->name; 2174 - struct hlist_bl_head *b = d_hash(hashlen_hash(hashlen)); 2174 + struct hlist_bl_head *b = d_hash(hashlen); 2175 2175 struct hlist_bl_node *node; 2176 2176 struct dentry *dentry; 2177 2177