diff options
author | Dipankar Sarma <dipankar@in.ibm.com> | 2005-09-09 16:04:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-09 16:57:55 -0400 |
commit | b835996f628eadb55c5fb222ba46fe9395bf73c7 (patch) | |
tree | d63d80585d197e1ffc299af4a0034049790fb197 /arch | |
parent | ab2af1f5005069321c5d130f09cce577b03f43ef (diff) |
[PATCH] files: lock-free fd look-up
With the use of RCU in files structure, the look-up of files using fds can now
be lock-free. The lookup is protected by rcu_read_lock()/rcu_read_unlock().
This patch changes the readers to use lock-free lookup.
Signed-off-by: Maneesh Soni <maneesh@in.ibm.com>
Signed-off-by: Ravikiran Thirumalai <kiran_th@gmail.com>
Signed-off-by: Dipankar Sarma <dipankar@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/kernel/irixioctl.c | 5 | ||||
-rw-r--r-- | arch/sparc64/solaris/ioctl.c | 7 |
2 files changed, 7 insertions, 5 deletions
diff --git a/arch/mips/kernel/irixioctl.c b/arch/mips/kernel/irixioctl.c index 4cd3d38a22c2..3cdc22346f4c 100644 --- a/arch/mips/kernel/irixioctl.c +++ b/arch/mips/kernel/irixioctl.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/syscalls.h> | 14 | #include <linux/syscalls.h> |
15 | #include <linux/tty.h> | 15 | #include <linux/tty.h> |
16 | #include <linux/file.h> | 16 | #include <linux/file.h> |
17 | #include <linux/rcupdate.h> | ||
17 | 18 | ||
18 | #include <asm/uaccess.h> | 19 | #include <asm/uaccess.h> |
19 | #include <asm/ioctl.h> | 20 | #include <asm/ioctl.h> |
@@ -33,7 +34,7 @@ static struct tty_struct *get_tty(int fd) | |||
33 | struct file *filp; | 34 | struct file *filp; |
34 | struct tty_struct *ttyp = NULL; | 35 | struct tty_struct *ttyp = NULL; |
35 | 36 | ||
36 | spin_lock(¤t->files->file_lock); | 37 | rcu_read_lock(); |
37 | filp = fcheck(fd); | 38 | filp = fcheck(fd); |
38 | if(filp && filp->private_data) { | 39 | if(filp && filp->private_data) { |
39 | ttyp = (struct tty_struct *) filp->private_data; | 40 | ttyp = (struct tty_struct *) filp->private_data; |
@@ -41,7 +42,7 @@ static struct tty_struct *get_tty(int fd) | |||
41 | if(ttyp->magic != TTY_MAGIC) | 42 | if(ttyp->magic != TTY_MAGIC) |
42 | ttyp =NULL; | 43 | ttyp =NULL; |
43 | } | 44 | } |
44 | spin_unlock(¤t->files->file_lock); | 45 | rcu_read_unlock(); |
45 | return ttyp; | 46 | return ttyp; |
46 | } | 47 | } |
47 | 48 | ||
diff --git a/arch/sparc64/solaris/ioctl.c b/arch/sparc64/solaris/ioctl.c index 374766455f5e..be0a054e3ed6 100644 --- a/arch/sparc64/solaris/ioctl.c +++ b/arch/sparc64/solaris/ioctl.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/netdevice.h> | 24 | #include <linux/netdevice.h> |
25 | #include <linux/mtio.h> | 25 | #include <linux/mtio.h> |
26 | #include <linux/time.h> | 26 | #include <linux/time.h> |
27 | #include <linux/rcupdate.h> | ||
27 | #include <linux/compat.h> | 28 | #include <linux/compat.h> |
28 | 29 | ||
29 | #include <net/sock.h> | 30 | #include <net/sock.h> |
@@ -295,16 +296,16 @@ static inline int solaris_sockmod(unsigned int fd, unsigned int cmd, u32 arg) | |||
295 | struct inode *ino; | 296 | struct inode *ino; |
296 | struct fdtable *fdt; | 297 | struct fdtable *fdt; |
297 | /* I wonder which of these tests are superfluous... --patrik */ | 298 | /* I wonder which of these tests are superfluous... --patrik */ |
298 | spin_lock(¤t->files->file_lock); | 299 | rcu_read_lock(); |
299 | fdt = files_fdtable(current->files); | 300 | fdt = files_fdtable(current->files); |
300 | if (! fdt->fd[fd] || | 301 | if (! fdt->fd[fd] || |
301 | ! fdt->fd[fd]->f_dentry || | 302 | ! fdt->fd[fd]->f_dentry || |
302 | ! (ino = fdt->fd[fd]->f_dentry->d_inode) || | 303 | ! (ino = fdt->fd[fd]->f_dentry->d_inode) || |
303 | ! S_ISSOCK(ino->i_mode)) { | 304 | ! S_ISSOCK(ino->i_mode)) { |
304 | spin_unlock(¤t->files->file_lock); | 305 | rcu_read_unlock(); |
305 | return TBADF; | 306 | return TBADF; |
306 | } | 307 | } |
307 | spin_unlock(¤t->files->file_lock); | 308 | rcu_read_unlock(); |
308 | 309 | ||
309 | switch (cmd & 0xff) { | 310 | switch (cmd & 0xff) { |
310 | case 109: /* SI_SOCKPARAMS */ | 311 | case 109: /* SI_SOCKPARAMS */ |