diff options
author | Roland Dreier <rdreier@cisco.com> | 2008-07-11 13:54:40 -0700 |
---|---|---|
committer | Jonathan Corbet <corbet@lwn.net> | 2008-07-11 16:40:58 -0600 |
commit | feae1ef116ed381625d3731c5ae4f4ebcb3fa302 (patch) | |
tree | 1b4dce5f279f5a0667a34cf2a4584af083bb5558 /drivers/infiniband/core/user_mad.c | |
parent | 5b2d281acb04a29fcdc76ced5ca6099565a0747f (diff) | |
download | blackbird-obmc-linux-feae1ef116ed381625d3731c5ae4f4ebcb3fa302.tar.gz blackbird-obmc-linux-feae1ef116ed381625d3731c5ae4f4ebcb3fa302.zip |
IB/umad: BKL is not needed for ib_umad_open()
Remove explicit lock_kernel() calls and document why the code is safe.
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Diffstat (limited to 'drivers/infiniband/core/user_mad.c')
-rw-r--r-- | drivers/infiniband/core/user_mad.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c index 1fc17940a765..ef6dd825fee9 100644 --- a/drivers/infiniband/core/user_mad.c +++ b/drivers/infiniband/core/user_mad.c @@ -47,7 +47,6 @@ #include <linux/kref.h> #include <linux/compat.h> #include <linux/semaphore.h> -#include <linux/smp_lock.h> #include <asm/uaccess.h> @@ -778,23 +777,33 @@ static long ib_umad_compat_ioctl(struct file *filp, unsigned int cmd, } #endif +/* + * ib_umad_open() does not need the BKL: + * + * - umad_port[] accesses are protected by port_lock, the + * ib_umad_port structures are properly reference counted, and + * everything else is purely local to the file being created, so + * races against other open calls are not a problem; + * - the ioctl method does not affect any global state outside of the + * file structure being operated on; + * - the port is added to umad_port[] as the last part of module + * initialization so the open method will either immediately run + * -ENXIO, or all required initialization will be done. + */ static int ib_umad_open(struct inode *inode, struct file *filp) { struct ib_umad_port *port; struct ib_umad_file *file; int ret = 0; - lock_kernel(); spin_lock(&port_lock); port = umad_port[iminor(inode) - IB_UMAD_MINOR_BASE]; if (port) kref_get(&port->umad_dev->ref); spin_unlock(&port_lock); - if (!port) { - unlock_kernel(); + if (!port) return -ENXIO; - } mutex_lock(&port->file_mutex); @@ -823,7 +832,6 @@ static int ib_umad_open(struct inode *inode, struct file *filp) out: mutex_unlock(&port->file_mutex); - unlock_kernel(); return ret; } |