On Tue, Feb 02, 2010 at 07:56:36AM -0800, Linus Torvalds wrote: > On Tue, 2 Feb 2010, Matthew Wilcox wrote: > > > > How about doing this: > > > > struct qstr { > > - const unsigned char *name; > > + const unsigned char name[0]; > > } > > > > struct dentry { > > - struct qstr d_name; > > + struct qstr *d_name; > > - unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */ > > + union { > > + struct qstr d_iname; > > + char pad[DNAME_INLINE_LEN_MIN]; > > + }; > > } > > > > Doesn't increase the size of struct dentry, and puts the hash and len > > with the name. Increases long name allocations by 8 bytes each. > > Conceptually nice, but in practice that's absolutely horrible. > > Why? Because now the dentry lookup logic has to follow an additional > pointer just to verify the hash and the length of the name. That's some of > the hottest code we have, and the _last_ thing we want is another pointer > dereference and cache access in the path that looks up the dentry hash > chains. I'd thought it was in the same cacheline ... but that's not generally true since dentries are so large. And the d_name is at the other end of the dentry, so they're guaranteed to be in different cachelines. Bum. -- Matthew Wilcox Intel Open Source Technology Centre "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step." -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html