On Mon, May 2, 2016 at 2:19 PM, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > The reason that "hash_len" is a single 64-bit field rather than two > 32-bit fields, for example, is that that way it takes on _register_ > when we do the has lookup. Some of that code was tuned to inline - and > _not_ inline in particular patterns. Actually, I think the tuning for no stack frame etc was mostly for the permission testing with the selinux AVC code. The filename hashing does have some of it too - like making sure that the call to ->d_hash() is in an unlikely path etc and doesn't pollute the case that actually matters. But I don't think any of it is simple enough to avoid a stack frame. The hash_len thing did make the innermost hash lookup loop smaller, which was noticeable at some point. What I really wanted to do there was actually have a direct-mapped "L1 dentry hash cache", that didn't have a hash loop at all (it would fall back to the slow case for that). I had a patch for that (which worked *beautifully*, partly because it also moved the hot entries to that hash cache and thus effectively moved the active entries to the head of the queue), but I couldn't get the L1 cache update to be coherent without locking, which killed the thing. Anyway, I suspect that your mixing function changes should be fine. That link_path_walk() is important, but a couple of shifts and xors shouldn't kill it. Linus -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html