From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexey Dobriyan Subject: [PATCH] dcache: faster dentry_cmp() Date: Wed, 15 Feb 2012 01:45:27 +0300 Message-ID: <20120214224526.GA3478@p183.telecom.by> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org, npiggin@kernel.dk To: viro@zeniv.linux.org.uk Return-path: Received: from mail-bk0-f46.google.com ([209.85.214.46]:47346 "EHLO mail-bk0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757282Ab2BNWpd (ORCPT ); Tue, 14 Feb 2012 17:45:33 -0500 Received: by bkcjm19 with SMTP id jm19so455210bkc.19 for ; Tue, 14 Feb 2012 14:45:32 -0800 (PST) Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-ID: 1) consistently use "unsigned int" for dentry name length, 2) reuse subtraction result for return value, exact value doesn't matter because function is only used in boolean context, 3) use *p++ idiom for even better code. All of this results in performance speedup of "git diff" which is way out of statistical error (0.4% vs 0.15% of 3 sigma): $ PAGER= perf stat -r 256 git-diff Performance counter stats for 'git-diff' (256 runs): 115.033582 task-clock # 0.993 CPUs utilized ( +- 0.06% ) 0 context-switches # 0.000 M/sec ( +- 17.95% ) 0 CPU-migrations # 0.000 M/sec ( +- 19.47% ) 2,321 page-faults # 0.020 M/sec ( +- 0.00% ) 384,540,991 cycles # 3.343 GHz ( +- 0.05% ) 121,833,562 stalled-cycles-frontend # 31.68% frontend cycles idle ( +- 0.16% ) 51,731,784 stalled-cycles-backend # 13.45% backend cycles idle ( +- 0.37% ) 586,327,441 instructions # 1.52 insns per cycle # 0.21 stalled cycles per insn ( +- 0.00% ) 155,449,246 branches # 1351.338 M/sec ( +- 0.00% ) 542,511 branch-misses # 0.35% of all branches ( +- 0.07% ) 0.115856505 seconds time elapsed ( +- 0.06% ) ---------------------------------- after Performance counter stats for 'git-diff' (256 runs): 114.486145 task-clock # 0.993 CPUs utilized ( +- 0.05% ) 0 context-switches # 0.000 M/sec ( +- 15.46% ) 0 CPU-migrations # 0.000 M/sec ( +- 20.06% ) 2,282 page-faults # 0.020 M/sec ( +- 0.00% ) 382,725,382 cycles # 3.343 GHz ( +- 0.05% ) 119,808,563 stalled-cycles-frontend # 31.30% frontend cycles idle ( +- 0.15% ) 51,780,030 stalled-cycles-backend # 13.53% backend cycles idle ( +- 0.33% ) 585,114,727 instructions # 1.53 insns per cycle # 0.20 stalled cycles per insn ( +- 0.00% ) 155,146,262 branches # 1355.153 M/sec ( +- 0.00% ) 526,739 branch-misses # 0.34% of all branches ( +- 0.12% ) 0.115315823 seconds time elapsed ( +- 0.05% ) Signed-off-by: Alexey Dobriyan --- fs/dcache.c | 6 +++--- include/linux/dcache.h | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1368,7 +1368,7 @@ static struct dentry *__d_instantiate_unique(struct dentry *entry, struct inode *inode) { struct dentry *alias; - int len = entry->d_name.len; + unsigned int len = entry->d_name.len; const char *name = entry->d_name.name; unsigned int hash = entry->d_name.hash; @@ -1750,7 +1750,7 @@ struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name, hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { struct inode *i; const char *tname; - int tlen; + unsigned int tlen; if (dentry->d_name.hash != hash) continue; @@ -1869,7 +1869,7 @@ struct dentry *__d_lookup(struct dentry *parent, struct qstr *name) hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { const char *tname; - int tlen; + unsigned int tlen; if (dentry->d_name.hash != hash) continue; --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -51,18 +51,18 @@ extern struct dentry_stat_t dentry_stat; * Compare 2 name strings, return 0 if they match, otherwise non-zero. * The strings are both count bytes long, and count is non-zero. */ -static inline int dentry_cmp(const unsigned char *cs, size_t scount, - const unsigned char *ct, size_t tcount) +static inline int dentry_cmp(const unsigned char *cs, unsigned int scount, + const unsigned char *ct, unsigned int tcount) { int ret; - if (scount != tcount) - return 1; + + ret = scount - tcount; + if (ret) + return ret; do { - ret = (*cs != *ct); + ret = *cs++ - *ct++; if (ret) break; - cs++; - ct++; tcount--; } while (tcount); return ret;