Skip to content

Commit e60cc61

Browse files
committed
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 <[email protected]>
1 parent 6ba59ff commit e60cc61

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

fs/dcache.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ static unsigned int d_hash_shift __ro_after_init;
100100

101101
static struct hlist_bl_head *dentry_hashtable __ro_after_init;
102102

103-
static inline struct hlist_bl_head *d_hash(unsigned int hash)
103+
static inline struct hlist_bl_head *d_hash(unsigned long hashlen)
104104
{
105-
return dentry_hashtable + (hash >> d_hash_shift);
105+
return dentry_hashtable + ((u32)hashlen >> d_hash_shift);
106106
}
107107

108108
#define IN_LOOKUP_SHIFT 10
@@ -2104,7 +2104,7 @@ static noinline struct dentry *__d_lookup_rcu_op_compare(
21042104
unsigned *seqp)
21052105
{
21062106
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);
21082108
struct hlist_bl_node *node;
21092109
struct dentry *dentry;
21102110

@@ -2171,7 +2171,7 @@ struct dentry *__d_lookup_rcu(const struct dentry *parent,
21712171
{
21722172
u64 hashlen = name->hash_len;
21732173
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);
21752175
struct hlist_bl_node *node;
21762176
struct dentry *dentry;
21772177

0 commit comments

Comments
 (0)