diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2007-05-08 03:26:18 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 14:15:03 -0400 |
commit | c23fbb6bcb3eb9cdf39a103edadf57bde8ce309c (patch) | |
tree | d79ab2278774de2c1a8061aa948ed068902e87b4 /fs/pipe.c | |
parent | 2793274298c4423d79701e9a8190f2940bf3c785 (diff) |
VFS: delay the dentry name generation on sockets and pipes
1) Introduces a new method in 'struct dentry_operations'. This method
called d_dname() might be called from d_path() to build a pathname for
special filesystems. It is called without locks.
Future patches (if we succeed in having one common dentry for all
pipes/sockets) may need to change prototype of this method, but we now
use : char *d_dname(struct dentry *dentry, char *buffer, int buflen);
2) Adds a dynamic_dname() helper function that eases d_dname() implementations
3) Defines d_dname method for sockets : No more sprintf() at socket
creation. This is delayed up to the moment someone does an access to
/proc/pid/fd/...
4) Defines d_dname method for pipes : No more sprintf() at pipe
creation. This is delayed up to the moment someone does an access to
/proc/pid/fd/...
A benchmark consisting of 1.000.000 calls to pipe()/close()/close() gives a
*nice* speedup on my Pentium(M) 1.6 Ghz :
3.090 s instead of 3.450 s
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Acked-by: Christoph Hellwig <hch@infradead.org>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/pipe.c')
-rw-r--r-- | fs/pipe.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -841,8 +841,18 @@ static int pipefs_delete_dentry(struct dentry *dentry) | |||
841 | return 0; | 841 | return 0; |
842 | } | 842 | } |
843 | 843 | ||
844 | /* | ||
845 | * pipefs_dname() is called from d_path(). | ||
846 | */ | ||
847 | static char *pipefs_dname(struct dentry *dentry, char *buffer, int buflen) | ||
848 | { | ||
849 | return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]", | ||
850 | dentry->d_inode->i_ino); | ||
851 | } | ||
852 | |||
844 | static struct dentry_operations pipefs_dentry_operations = { | 853 | static struct dentry_operations pipefs_dentry_operations = { |
845 | .d_delete = pipefs_delete_dentry, | 854 | .d_delete = pipefs_delete_dentry, |
855 | .d_dname = pipefs_dname, | ||
846 | }; | 856 | }; |
847 | 857 | ||
848 | static struct inode * get_pipe_inode(void) | 858 | static struct inode * get_pipe_inode(void) |
@@ -888,8 +898,7 @@ struct file *create_write_pipe(void) | |||
888 | struct inode *inode; | 898 | struct inode *inode; |
889 | struct file *f; | 899 | struct file *f; |
890 | struct dentry *dentry; | 900 | struct dentry *dentry; |
891 | char name[32]; | 901 | struct qstr name = { .name = "" }; |
892 | struct qstr this; | ||
893 | 902 | ||
894 | f = get_empty_filp(); | 903 | f = get_empty_filp(); |
895 | if (!f) | 904 | if (!f) |
@@ -899,11 +908,8 @@ struct file *create_write_pipe(void) | |||
899 | if (!inode) | 908 | if (!inode) |
900 | goto err_file; | 909 | goto err_file; |
901 | 910 | ||
902 | this.len = sprintf(name, "[%lu]", inode->i_ino); | ||
903 | this.name = name; | ||
904 | this.hash = 0; | ||
905 | err = -ENOMEM; | 911 | err = -ENOMEM; |
906 | dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &this); | 912 | dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &name); |
907 | if (!dentry) | 913 | if (!dentry) |
908 | goto err_inode; | 914 | goto err_inode; |
909 | 915 | ||