lkml.org 
[lkml]   [2009]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [patch 23/28] i2c: Remove big kernel lock from i2cdev_open
Hi Thomas,

On Sat, 10 Oct 2009 15:37:17 -0000, Thomas Gleixner wrote:
> The BKL is held over a kmalloc so cannot protect anything beyond that.
> The two calls before the kmalloc have their own locking.
> Improve device open function by removing the now unnecessary ret variable
>
> Signed-off-by: Vincent Sanders <vince@simtec.co.uk>
> LKML-Reference: <1255175172-2666-1-git-send-email-vince@simtec.co.uk>
> Cc: Jean Delvare <khali@linux-fr.org>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> drivers/i2c/i2c-dev.c | 22 ++++++----------------
> 1 file changed, 6 insertions(+), 16 deletions(-)
>
> Index: linux-2.6-tip/drivers/i2c/i2c-dev.c
> ===================================================================
> --- linux-2.6-tip.orig/drivers/i2c/i2c-dev.c
> +++ linux-2.6-tip/drivers/i2c/i2c-dev.c
> @@ -34,7 +34,6 @@
> #include <linux/list.h>
> #include <linux/i2c.h>
> #include <linux/i2c-dev.h>
> -#include <linux/smp_lock.h>
> #include <linux/jiffies.h>
> #include <asm/uaccess.h>
>
> @@ -445,20 +444,14 @@ static int i2cdev_open(struct inode *ino
> struct i2c_client *client;
> struct i2c_adapter *adap;
> struct i2c_dev *i2c_dev;
> - int ret = 0;
>
> - lock_kernel();
> i2c_dev = i2c_dev_get_by_minor(minor);
> - if (!i2c_dev) {
> - ret = -ENODEV;
> - goto out;
> - }
> + if (!i2c_dev)
> + return -ENODEV;
>
> adap = i2c_get_adapter(i2c_dev->adap->nr);
> - if (!adap) {
> - ret = -ENODEV;
> - goto out;
> - }
> + if (!adap)
> + return -ENODEV;
>
> /* This creates an anonymous i2c_client, which may later be
> * pointed to some address using I2C_SLAVE or I2C_SLAVE_FORCE.
> @@ -470,8 +463,7 @@ static int i2cdev_open(struct inode *ino
> client = kzalloc(sizeof(*client), GFP_KERNEL);
> if (!client) {
> i2c_put_adapter(adap);
> - ret = -ENOMEM;
> - goto out;
> + return -ENOMEM;
> }
> snprintf(client->name, I2C_NAME_SIZE, "i2c-dev %d", adap->nr);
> client->driver = &i2cdev_driver;
> @@ -479,9 +471,7 @@ static int i2cdev_open(struct inode *ino
> client->adapter = adap;
> file->private_data = client;
>
> -out:
> - unlock_kernel();
> - return ret;
> + return 0;
> }
>
> static int i2cdev_release(struct inode *inode, struct file *file)
>

Looks good to me:

Acked-by: Jean Delvare <khali@linux-fr.org>

Do you want me to pick this patch in my i2c tree, or will you take care
of pushing it upstream? If you're not going to push it quickly, I'd
prefer the first solution, to avoid conflicts.

(As a side note, i2c-dev would deserve a partial rewrite as it doesn't
integrate into the standard device driver model, and certainly has a
number of race conditions. But this is well beyond the scope of your
patch.)

Thanks,
--
Jean Delvare


\
 
 \ /
  Last update: 2009-10-10 19:11    [W:2.303 / U:0.332 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site