aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2011-07-28 00:41:09 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2011-08-01 01:41:17 -0400
commitf2ee7abf4c40c8e6bffced923a7c01ea2d1f6c97 (patch)
tree3c7ec119cf89f82737c55235ff7881ebeed9408f
parentb12362bdb61a230a67daa77bcd2a11e59b2802e1 (diff)
vfs: avoid taking inode_hash_lock on pipes and sockets
Some inodes (pipes, sockets, ...) are not hashed, no need to take contended inode_hash_lock at dismantle time. nice speedup on SMP machines on socket intensive workloads. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/inode.c6
-rw-r--r--include/linux/fs.h9
2 files changed, 11 insertions, 4 deletions
diff --git a/fs/inode.c b/fs/inode.c
index 9dab13ae6ef7..e445be2a18f9 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -399,12 +399,12 @@ void __insert_inode_hash(struct inode *inode, unsigned long hashval)
399EXPORT_SYMBOL(__insert_inode_hash); 399EXPORT_SYMBOL(__insert_inode_hash);
400 400
401/** 401/**
402 * remove_inode_hash - remove an inode from the hash 402 * __remove_inode_hash - remove an inode from the hash
403 * @inode: inode to unhash 403 * @inode: inode to unhash
404 * 404 *
405 * Remove an inode from the superblock. 405 * Remove an inode from the superblock.
406 */ 406 */
407void remove_inode_hash(struct inode *inode) 407void __remove_inode_hash(struct inode *inode)
408{ 408{
409 spin_lock(&inode_hash_lock); 409 spin_lock(&inode_hash_lock);
410 spin_lock(&inode->i_lock); 410 spin_lock(&inode->i_lock);
@@ -412,7 +412,7 @@ void remove_inode_hash(struct inode *inode)
412 spin_unlock(&inode->i_lock); 412 spin_unlock(&inode->i_lock);
413 spin_unlock(&inode_hash_lock); 413 spin_unlock(&inode_hash_lock);
414} 414}
415EXPORT_SYMBOL(remove_inode_hash); 415EXPORT_SYMBOL(__remove_inode_hash);
416 416
417void end_writeback(struct inode *inode) 417void end_writeback(struct inode *inode)
418{ 418{
diff --git a/include/linux/fs.h b/include/linux/fs.h
index f23bcb77260c..786b3b1113cf 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2317,11 +2317,18 @@ extern int should_remove_suid(struct dentry *);
2317extern int file_remove_suid(struct file *); 2317extern int file_remove_suid(struct file *);
2318 2318
2319extern void __insert_inode_hash(struct inode *, unsigned long hashval); 2319extern void __insert_inode_hash(struct inode *, unsigned long hashval);
2320extern void remove_inode_hash(struct inode *);
2321static inline void insert_inode_hash(struct inode *inode) 2320static inline void insert_inode_hash(struct inode *inode)
2322{ 2321{
2323 __insert_inode_hash(inode, inode->i_ino); 2322 __insert_inode_hash(inode, inode->i_ino);
2324} 2323}
2324
2325extern void __remove_inode_hash(struct inode *);
2326static inline void remove_inode_hash(struct inode *inode)
2327{
2328 if (!inode_unhashed(inode))
2329 __remove_inode_hash(inode);
2330}
2331
2325extern void inode_sb_list_add(struct inode *inode); 2332extern void inode_sb_list_add(struct inode *inode);
2326 2333
2327#ifdef CONFIG_BLOCK 2334#ifdef CONFIG_BLOCK